Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -198,5 +198,16 @@ tags
# Persistent undo
[._]*.un~

**/exploit-iq-ips.json
**/user-feedback-ips.json
**/google-sheets-secrets.yaml
**/integration-tests-secrets.yaml
**/server-model-config.yaml
**/sec-decryption.key
**/registry-app-creds.yaml
**/exploit-iq-client-build-ips.yaml
**/exploit-iq-automation-token.yaml



# End of https://www.gitignore.io/api/vim,c++,cmake,python,synology
5 changes: 5 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
[submodule ".tests-automation"]
path = .tests-automation
url = https://github.com/RHEcosystemAppEng/exploitiq-tests-automation.git

[submodule "exploit-iq-models"]
path = exploit-iq-models
url = https://github.com/RHEcosystemAppEng/exploit-iq-models.git

8 changes: 7 additions & 1 deletion .tekton/on-pull-request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ metadata:
# How many runs we want to keep.
pipelinesascode.tekton.dev/max-keep-runs: "5"
spec:
taskRunTemplate:
podTemplate:
imagePullSecrets:
- name: ecosystem-appeng-morpheus-quay
params:
# The variable with brackets are special to Pipelines as Code
# They will automatically be expanded with the events from Github.
Expand Down Expand Up @@ -255,13 +259,16 @@ spec:
workspace: basic-auth # Needed for pushing tags/releases
- name: exploit-iq-data
workspace: exploit-iq-data
- name: dockerconfig
workspace: dockerconfig-ws
params:
- name: CURRENT_REVISION
value: $(params.revision)
- name: PR_NUMBER
value: $(params.pr_number)

taskSpec:

params:
- name: CURRENT_REVISION
type: string
Expand All @@ -271,7 +278,6 @@ spec:
- name: source
- name: basic-auth
- name: exploit-iq-data

# >>> THE SERVER (Sidecar) <<<
sidecars:
- name: server-application
Expand Down
54 changes: 54 additions & 0 deletions kustomize/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,3 +236,57 @@ kustomize build overlays/$DEPLOYMENT_VARIANT_NAME/ | oc delete -l purpose!=pers
# Or, Delete Everything
kustomize build overlays/$DEPLOYMENT_VARIANT_NAME/ | oc delete -f -
```
### Deploy Test overlay variant (Rapid deployment)
1. Download and install [GnuPG](https://www.gnupg.org/download/) and [sops](https://github.com/getsops/sops/releases)
2. Create new namespace/project:
```shell
export PROJECT_NAME=exploit-test
oc new-project $PROJECT_NAME
```
3. Take private key and import it to GPG:
```shell
gpg --import /path/to/sec-decryption.key
```
4. Decrypt all secret files:
```shell
cd $(git rev-parse --show-toplevel)/kustomize/overlays/tests
mkdir -p secrets
sops -d exploit-iq-ips.secret > secrets/exploit-iq-ips.json
sops -d google-sheets-secrets-enc.yaml > secrets/google-sheets-secrets.yaml
sops -d integration-tests-secrets-enc.yaml > secrets/integration-tests-secrets.yaml
sops -d mongodb-credentials.env2 > secrets/mongodb-credentials.env
sops -d oauth-secrets.env2 > secrets/oauth-secrets.env
sops -d registry-app-creds-enc.yaml > secrets/registry-app-creds.yaml
sops -d secrets.env2 > secrets/secrets.env
sops -d server-model-config-enc.yaml > secrets/server-model-config.yaml
sops -d user-feedback-ips.secret > secrets/user-feedback-ips.json
sops -d exploit-iq-client-build-ips-enc.yaml > secrets/exploit-iq-client-build-ips.yaml
sops -d exploit-iq-automation-token-enc.yaml > secrets/exploit-iq-automation-token.yaml
```

5. Override any secret that you need in the decrypted files, if not needed, you can continue to next step.
6. Now deploy to the cluster the exploitIQ system ( minus agent) with all resources:
```shell
kustomize build . | oc apply -f -
```

7. Deploy Self hosted LLM for the automation tests ( Integration tests and Confusion matrix runner):
```shell
helm upgrade --install --set nim_embed.enabled=false --set llama3_1_70b_instruct_4bit.storageClass.name=gp3-csi-throughput-2000 --set llama3_1_70b_instruct_4bit.readinessProbe.initialDelaySeconds=25 --set llama3_1_70b_instruct_4bit.readinessProbe.periodSeconds=10 --set global.tolerationsKey=p4d-gpu exploit-iq-tests ../../../exploit-iq-models/agent-morpheus-models
```

8. Remove untracked decrypted secrets files
```shell
rm -rf secrets/
```

9. Tear down:
```shell
helm delete exploit-iq-tests

oc delete project $(oc project --short -q)
```

10. Need to install on cluster [Openshift pipelines operator](https://docs.redhat.com/en/documentation/red_hat_openshift_pipelines/1.19/html/installing_and_configuring/installing-pipelines)
11. If need to install the [exploit-iq-pac](https://github.com/apps/exploit-iq-pac/) PAC (pipeline as code) github application on a new cluster , you need to make sure to configure it according to the [PAC github application docs](https://pipelinesascode.com/docs/install/github_apps/#configure-pipelines-as-code-on-your-cluster-to-access-the-github-app).
In this case, you need to supply to the secret in the documentation github application private key generated in the github app settings, and webhook secret defined and set in the application settings.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ apiVersion: tekton.dev/v1
kind: Task
metadata:
name: buildah-pvc
namespace: ruben-morpheus

spec:
description: |
Expand Down Expand Up @@ -165,4 +164,4 @@ spec:
- description: An optional workspace that allows providing the entitlement keys for Buildah to access subscription. The mounted workspace contains entitlement.pem and entitlement-key.pem.
mountPath: /tmp/entitlement
name: rhel-entitlement
optional: true
optional: true
24 changes: 24 additions & 0 deletions kustomize/overlays/tests/exploit-iq-automation-token-enc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: ENC[AES256_GCM,data:Uns=,iv:t7ZWH0eiE63kyMW42wFsfsKN01OkC+brLLXaJUEClQs=,tag:pxTCqrwC1cUO/EMTfFrPzA==,type:str]
data:
gh-token: ENC[AES256_GCM,data:GgFKPuhztlsqsZ7PjXGH6V04uNu6ElKs5iC8uUW/UCL7vjmx5VR0suUaDA1DISb+Bc9W83bMnkW70H8CUwMX50OI536T/hDTokLAYTsFD+05HsUWKSxBqq7G25fv3mzPYSBAVKs0EL7K+f2Le6k2yeYltkOkfIRFtabFcg==,iv:cl5jl1oKbR2AtJYCoH4Je8SSyP4Jc+gPInIRfOflTSw=,tag:CrnZspbYfUjz0wgjzwfQhg==,type:str]
kind: ENC[AES256_GCM,data:j8rCiStt,iv:CaoFjqicLryq3MS+mvgVO5ffBbIX9vUQVQ5uy/NyNnM=,tag:r4LeUOBMkvXK3hd7faj/wA==,type:str]
metadata:
name: ENC[AES256_GCM,data:X7/gU5Es3+keADmoDJQWfF27KBKVjoCUcLRe,iv:zYPeX1H91bcUut1/wbVi6UdyRAwcT2QKRu//GS8KAY0=,tag:hPQtbwjqeIazh/hrnmzbjA==,type:str]
type: ENC[AES256_GCM,data:waF5cqrS,iv:yh5grziLkmXblL+zoo/DbsFI8GJdBICWq5xbGrjqrjM=,tag:W1odWNRYm9RpU4XBAXDvpA==,type:str]
sops:
lastmodified: "2026-01-27T15:12:24Z"
mac: ENC[AES256_GCM,data:AupZMMI0ycLlxF3/s2fLy97AC75/QF7itpaldF+I6Cuoj6FdmBd+2HwiDuz+505ZAm0/pP7Ez7p+zA7STyxY0vzGBu2XoOhKOcj0seJHrHZh60PXlV2BgQarBxVTtSg3BWFLrKYNRRHevHezfRKxFichlQZzj5Pc6TmheNs2c7U=,iv:TXYL4TE8GlAeuTjaw9GfdP+mmXtWpz++sHp0InHk04c=,tag:0I+c3wRyLh2vL+9N7K5i+w==,type:str]
pgp:
- created_at: "2026-01-27T15:12:24Z"
enc: |-
-----BEGIN PGP MESSAGE-----

hF4Dy77zzNMwU0sSAQdA/biMrPzXXQ6FZhsAqOpLTXUzegYmekUNov4ZxfhQyWsw
GLEYcoYdGLjZo/BSUP3t6+8XJ/LY6ytRvMvsxWWJKGBspxIyE7JwTCpIdOWA4p0v
0lwBlyu0o8Jc31ct4J1V+mPowF8L1znKEgqVBugA+l3N5JRizwecTdcb8k0OXHqf
+hXfcCYVK5FYJbdtGsGEEZmS6vGjdAViNiTyuS4NS+Lh4sEFXA0Z4CT7YILArA==
=5nCL
-----END PGP MESSAGE-----
fp: 8DEE2D0E1357B78C782691234A2D3B6C7E35AEF7
unencrypted_suffix: _unencrypted
version: 3.11.0
24 changes: 24 additions & 0 deletions kustomize/overlays/tests/exploit-iq-client-build-ips-enc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: ENC[AES256_GCM,data:V0g=,iv:aku+6VNcpHX/VwyWNuHMU9p1UJn9QgI9az5pl57Up0c=,tag:9cHqcamNq/n459qQRu6bKg==,type:str]
data:
.dockerconfigjson: ENC[AES256_GCM,data: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,iv:GiAFMGtzev6bnTtbKrhaUmJipZfYEriVDR0hIIcbuvk=,tag:p87FISG6OFI5n2suKECcKg==,type:str]
kind: ENC[AES256_GCM,data:oDXj1wmI,iv:zRQA0DPLBhe7skXIqE4vLQKlQgzsOW7PhmSQBTUhVcw=,tag:NeNhMXL3nrFDXVGiISQqvw==,type:str]
metadata:
name: ENC[AES256_GCM,data:YWKVdWVd7Vkby+mGaoqCCdFbZnk=,iv:xNy7/XNWt0Ng7A45WEZ+K8RQD6inqy9TEhVFqnWzxm0=,tag:X+ar+MFIhG4Nsz5gwopLJg==,type:str]
type: ENC[AES256_GCM,data:tC3kqUKpNt1xPF8COd35itVzvDwEXxmOvnc5iYOT,iv:4KHXCxzXmH2LSX3/WmvWjeol2kG9FtcB9K1vczpoS2k=,tag:EkcbbOGnUM5ICiwV9fyYog==,type:str]
sops:
lastmodified: "2026-01-27T14:58:25Z"
mac: ENC[AES256_GCM,data:4QX9acqwVT0yIblv0/On8BZVK3d47GcLccXhWWyrdRYW+4BgR8zc1v+k1YRxJEBlojlXNqvaFs9tEEdNWQ0QHBUsR8jMQ0T2t5EqHb9LPE4WOYuBVcTyeqDmyc01EKHDWdutYxo15kotCMG1FO5OgZ11Rcwdv3f1QVdgskN4Pks=,iv:kiq2siF75QwGOK84k013AD8ex5N/kPMc6FrUOp531v0=,tag:Qq2Y1COIOw46WyU/qUH+ZQ==,type:str]
pgp:
- created_at: "2026-01-27T14:58:25Z"
enc: |-
-----BEGIN PGP MESSAGE-----

hF4Dy77zzNMwU0sSAQdAeDQZY4S70FaOHXTn3u7lIZfKvrpRyBtH5osQEepI+E4w
NnlXnnxgtOHBU8nHJZK2vmNge1hVUaGBcZ+mvsnanMEs0zpFkn2LD1hoQhVR+kYo
0l4BIJTzMKoU0+NlCheUC8dD4lPhgVszP+Lis2ftddN2+q3rAwkcpBZC3ADkw4lp
GFuWjTCeNbfrWV5VGPj0rUfgXrqBS49df/aBBlkwCuEI+iwKFaw6UE21TrOT7p6L
=MreB
-----END PGP MESSAGE-----
fp: 8DEE2D0E1357B78C782691234A2D3B6C7E35AEF7
unencrypted_suffix: _unencrypted
version: 3.11.0
15 changes: 15 additions & 0 deletions kustomize/overlays/tests/exploit-iq-ips.secret
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"data": "ENC[AES256_GCM,data:7Mhg0suh1pr4gW2ZSVDfDVBxR9M+WeOS/ndzCa6HynWbnbVi6o/bXSBrUwukb9NLEPyXG+i0Ja265AmV2Ix//+0YiHxRMTNWuAWeik9C1FhPyMefg/QJ7/TqVA19011U1oaqZwttcfxtiC69lKbIG6vZnxuLtWhjoWfi1SJrqPZ+EsKSD/st2DoWkhvlGd+ea8RyboXt2knL2jy7smo1wRWSUl98SqDr6TLqNg==,iv:oup5Ep55EXokJe+jRlOBXIxGoP88ZqV6aHzQtDrAGok=,tag:UuwWcFrQ8OJf5weq0HNBrg==,type:str]",
"sops": {
"lastmodified": "2026-01-25T12:11:15Z",
"mac": "ENC[AES256_GCM,data:o+/YRK8wHs6hlEJqkwDtzV/3plYxOTRs7QGfqLGv0TaGZMIYFnbav1M4AFDYY7pMxEnRCyRJWr6G6L3mN8Uwdcr9FyMls1yQAXnu8a6iP7xLSvShvk4sXmdRKCV+ZoI6uWOGpT5um2ovpqce2GENStvk7PhFhS0R+Dc2IqBYbyA=,iv:rWe1RZ8QEIeOTrIVYTroLrqm9QaugtTVw41dtxJRk5Y=,tag:CRh9MgwYzbLV+fqkIjpcxA==,type:str]",
"pgp": [
{
"created_at": "2026-01-25T12:11:15Z",
"enc": "-----BEGIN PGP MESSAGE-----\n\nhF4Dy77zzNMwU0sSAQdAenSUkHYnXpk59IsDKXVzwzXcmJYgwOC/mjNFPxrPUQkw\nIroNi7SaoYcdQ5bNd/IygS+LSJbqxWpMvPLgxw+Z/BUS0lWppfzAYgMeHGjH5Y+u\n0lwBGxusz5C9WM+oOHNOhrg8DZZU3iLfDgWpICqJ6OtRlcSlJlr2gXPFZngunkxz\nX5fFnLDgs2j6OV5CQEAkjC3j73t9RSE61ILuRLqZGMFjCm/xtL7KieKhstFxqw==\n=mhUv\n-----END PGP MESSAGE-----",
"fp": "8DEE2D0E1357B78C782691234A2D3B6C7E35AEF7"
}
],
"version": "3.11.0"
}
}
26 changes: 26 additions & 0 deletions kustomize/overlays/tests/google-sheets-secrets-enc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
apiVersion: ENC[AES256_GCM,data:FCE=,iv:mX1MhglqJCtmZ2+lAxeUdRweyKUjU0eEcxBBOyEfhQ0=,tag:wVimkqWtiSk2L6IcokRRHg==,type:str]
data:
credentials.json: ENC[AES256_GCM,data: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,iv:5/2vAV0mR91A76D1eknZllR6G2CcgS1CjFzH/vgC7yM=,tag:P4+B4QMpgh+v8G67QVSBUA==,type:str]
input_sheet_id: ENC[AES256_GCM,data:QGcHsxrPb4ocTIWd8CMvtetiwmeKJ2zaJ1pixjCzvB9i7IznNiTWSfm6rOmf1nd+1oCRsTFiSjlrM+73,iv:QpcPMsNz5xghxrjYw6kkdPJvL9zBLfVtyfE/Hyo2qMM=,tag:pz4UWY5aZYDLFCDjKcyqxw==,type:str]
output_sheet_id: ENC[AES256_GCM,data:XfLR39Saza3v6xX9NRxm1Lgg++0jTUVJU7T2DG/U8wpnfDJkHBlwzyQIypIWfapR2q2JMHh5CsfR6IY2,iv:MriqJEbO4qHyRuLqmYLCGghqcLXa79W0OueQRFzdQik=,tag:pIelynMOFR+qDWNQBZb7kw==,type:str]
kind: ENC[AES256_GCM,data:YfSIF+rj,iv:GSZfu8MjRgrLoZiDd3tYMC22XSBX8hN7rx4Qc+q1Sy8=,tag:pz5hprvCEnw2Js6o40s+VQ==,type:str]
metadata:
name: ENC[AES256_GCM,data:pFg7/Zxxt1Tc9WQJVivlI8hgN5TL,iv:i/nNCn/CMrNBuRXaR7OgvADNV4vSwk0SkSwMrvzW0Xg=,tag:LBmpT+Aw2vziK13JDVOcFw==,type:str]
type: ENC[AES256_GCM,data:tcJ0TrMy,iv:bFgWgWktWvbfbQO8svO90b/6izbSTHKm4e3KdalerbU=,tag:nb7GgK5m+IjokvJAqUcDeg==,type:str]
sops:
lastmodified: "2026-01-25T22:22:08Z"
mac: ENC[AES256_GCM,data:FcISvk+RreKCwSHfvvobTXNbNbnRuvh7dPmjgTSzsW9jJGSaT9pVI1KnZO7pSwZyx9e1SxFxltM+l5lKRwEx644g8sXn4vgm5iS7hydlCaUSSG1S2Vm7QTkrc+Xd4anWt3/V9NTBgC99MbADwKUxL7SKj4auzXi2rbiJgrN2To8=,iv:bHBRrT6lFX2d9eOvS3henEqMusk3X9RbqPtqzIE1sA0=,tag:SXS5CgV6HSr+Ma0jADU/8g==,type:str]
pgp:
- created_at: "2026-01-25T22:22:08Z"
enc: |-
-----BEGIN PGP MESSAGE-----

hF4Dy77zzNMwU0sSAQdAtKMi6CN5tPD/ZRK0uiEZ1zZzS6XVXgaun1QQn3OufDcw
fVPefvN/Fw+6DuIzyRsBOCRT10BrD+2Cb08JE6GUMOLO7bihuAitxbwbzOivPPgK
0l4Bj8S91shsRwhqFWDBWFHxiKJIuXLVBJd2AvijI3ErEL2hrxf3BAzaFQxtuxz7
BPb4egF5zsUIjzkwW4vzUbqTiFzZPTh6uBOq1R5C1Ux3YFxDUWtKf4/0dOjQeiYB
=w0Fd
-----END PGP MESSAGE-----
fp: 8DEE2D0E1357B78C782691234A2D3B6C7E35AEF7
unencrypted_suffix: _unencrypted
version: 3.11.0
Loading