diff --git a/charts/apps/staging-values.yaml b/charts/apps/staging-values.yaml index 3c1929fc2..734fd37d2 100644 --- a/charts/apps/staging-values.yaml +++ b/charts/apps/staging-values.yaml @@ -88,5 +88,6 @@ kueue: k6Operator: enabled: true targetRevision: HEAD - extraValueFiles: [] + extraValueFiles: + - staging-values.yaml valuesObject: {} diff --git a/charts/k6-operator/Chart.yaml b/charts/k6-operator/Chart.yaml index e6ad91d85..855f73f5a 100644 --- a/charts/k6-operator/Chart.yaml +++ b/charts/k6-operator/Chart.yaml @@ -9,3 +9,4 @@ dependencies: - name: k6-operator repository: https://grafana.github.io/helm-charts version: 4.3.0 + diff --git a/charts/k6-operator/staging-values.yaml b/charts/k6-operator/staging-values.yaml index 9045ebc9b..dff42e717 100644 --- a/charts/k6-operator/staging-values.yaml +++ b/charts/k6-operator/staging-values.yaml @@ -8,3 +8,16 @@ k6-operator: limits: cpu: 1000m memory: 1Gi +sessionspace: + enabled: true + name: ks10000-1 + proposalCode: ks + proposalNumber: "10000" + visit: "1" + instrument: b01-1 + gid: "36055" + startDate: "2026-04-30 9:00:00.0" + endDate: "2026-05-22 9:00:00.0" + members: + - https://identity-dev.diamond.ac.uk/realms/dls/k6Operator + diff --git a/charts/k6-operator/templates/k6-operator-configmap.yaml b/charts/k6-operator/templates/k6-operator-configmap.yaml index 4eed08079..e19d00667 100644 --- a/charts/k6-operator/templates/k6-operator-configmap.yaml +++ b/charts/k6-operator/templates/k6-operator-configmap.yaml @@ -5,4 +5,3 @@ metadata: namespace: {{ .Release.Namespace}} data: {{(.Files.Glob "tests/*.ts").AsConfig| indent 2}} - diff --git a/charts/k6-operator/templates/k6-testrun.yaml b/charts/k6-operator/templates/k6-ping-graph-testrun.yaml similarity index 64% rename from charts/k6-operator/templates/k6-testrun.yaml rename to charts/k6-operator/templates/k6-ping-graph-testrun.yaml index 732caf1b4..c59d7d854 100644 --- a/charts/k6-operator/templates/k6-testrun.yaml +++ b/charts/k6-operator/templates/k6-ping-graph-testrun.yaml @@ -1,23 +1,29 @@ # k6-resource.yml - apiVersion: k6.io/v1alpha1 kind: TestRun metadata: name: k6-ping-graph namespace: {{ .Release.Namespace}} spec: - parallelism: 4 + parallelism: 1 script: configMap: name: k6-configmap file: ping-graph.ts runner: env: - - name: GRAPH_PROXY_BEARER_TOKEN + - name: KEYCLOAK_CLIENT_ID + valueFrom: + secretKeyRef: + name: graph-proxy-k6-auth + key: KEYCLOAK_CLIENT_ID + - name: KEYCLOAK_CLIENT_SECRET valueFrom: secretKeyRef: name: graph-proxy-k6-auth - key: GRAPH_PROXY_BEARER_TOKEN + key: KEYCLOAK_CLIENT_SECRET + - name: KEYCLOAK_TOKEN_URL + value: https://identity-dev.diamond.ac.uk/realms/dls/protocol/openid-connect/token - name: GRAPH_URL value: http://graph-proxy.graph-proxy.svc.cluster.local:80/graphql resources: diff --git a/charts/k6-operator/templates/k6-probe-configmap.yaml b/charts/k6-operator/templates/k6-probe-configmap.yaml new file mode 100644 index 000000000..831769f96 --- /dev/null +++ b/charts/k6-operator/templates/k6-probe-configmap.yaml @@ -0,0 +1,119 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: k6-ws-map + namespace: {{ .Release.Namespace}} +data: + k6-ws-subscription-testrun.yaml: | + apiVersion: k6.io/v1alpha1 + kind: TestRun + metadata: + name: k6-ws-subscription-probe + namespace: {{ .Release.Namespace}} + spec: + parallelism: 1 + script: + configMap: + name: k6-configmap + file: ws-subscription.ts + runner: + env: + - name: KEYCLOAK_CLIENT_ID + valueFrom: + secretKeyRef: + name: graph-proxy-k6-auth + key: KEYCLOAK_CLIENT_ID + - name: KEYCLOAK_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: graph-proxy-k6-auth + key: KEYCLOAK_CLIENT_SECRET + - name: KEYCLOAK_TOKEN_URL + value: https://identity-dev.diamond.ac.uk/realms/dls/protocol/openid-connect/token + - name: GRAPH_URL + value: http://graph-proxy.graph-proxy.svc.cluster.local:80/graphql + - name: GRAPH_WS_URL + value: ws://graph-proxy.graph-proxy.svc.cluster.local:80/graphql/ws + - name: OTEL_ENDPOINT + value: https://otel.tracing.diamond.ac.uk:4318 + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 500m + memory: 500Mi + starter: + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 500m + memory: 500Mi +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: k6-probe-runner +rules: + - apiGroups: + - k6.io + resources: + - testruns + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: k6-probe-runner +roleRef: + kind: Role + name: k6-probe-runner + apiGroup: rbac.authorization.k8s.io +subjects: + - kind: ServiceAccount + name: k6-probe-runner + namespace: {{ .Release.Namespace}} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: k6-probe-runner + +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: k6-ws-cron +spec: + schedule: "*/30 * * * *" + concurrencyPolicy: Forbid + jobTemplate: + spec: + template: + spec: + serviceAccount: k6-probe-runner + containers: + - name: kubectl + image: bitnami/kubectl + volumeMounts: + - name: k6-yaml + mountPath: /tmp/ + command: + - /bin/bash + args: + - -c + - 'kubectl delete -f /tmp/k6-ws-subscription-testrun.yaml; kubectl apply -f /tmp/k6-ws-subscription-testrun.yaml' + restartPolicy: OnFailure + volumes: + - name: k6-yaml + configMap: + name: k6-ws-map diff --git a/charts/k6-operator/templates/k6-ws-subscription-testrun.yaml b/charts/k6-operator/templates/k6-ws-subscription-testrun.yaml new file mode 100644 index 000000000..573146950 --- /dev/null +++ b/charts/k6-operator/templates/k6-ws-subscription-testrun.yaml @@ -0,0 +1,47 @@ +# k6-resource.yml + +apiVersion: k6.io/v1alpha1 +kind: TestRun +metadata: + name: k6-ws-subscription + namespace: {{ .Release.Namespace}} +spec: + parallelism: 1 + script: + configMap: + name: k6-configmap + file: ws-subscription.ts + runner: + env: + - name: KEYCLOAK_CLIENT_ID + valueFrom: + secretKeyRef: + name: graph-proxy-k6-auth + key: KEYCLOAK_CLIENT_ID + - name: KEYCLOAK_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: graph-proxy-k6-auth + key: KEYCLOAK_CLIENT_SECRET + - name: KEYCLOAK_TOKEN_URL + value: https://identity-dev.diamond.ac.uk/realms/dls/protocol/openid-connect/token + - name: GRAPH_URL + value: http://graph-proxy.graph-proxy.svc.cluster.local:80/graphql + - name: GRAPH_WS_URL + value: ws://graph-proxy.graph-proxy.svc.cluster.local:80/graphql/ws + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 500m + memory: 500Mi + starter: + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 500m + memory: 500Mi + diff --git a/charts/k6-operator/templates/rbac.yaml b/charts/k6-operator/templates/rbac.yaml new file mode 100644 index 000000000..dae5c110d --- /dev/null +++ b/charts/k6-operator/templates/rbac.yaml @@ -0,0 +1,35 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: argo-workflow + namespace: ks10000-1 + ownerReferences: + - apiVersion: v1 + kind: ServiceAccount + name: argo-workflow + uid: ks12345 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: argo-workflow +subjects: +- kind: ServiceAccount + name: argo-workflow + namespace: ks10000-1 +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: visit-member + namespace: ks10000-1 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: visit-member +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: User + name: oidc:https://identity-dev.diamond.ac.uk/realms/dls/k6Operator +- apiGroup: rbac.authorization.k8s.io + kind: User + name: oidc:umi13827 diff --git a/charts/k6-operator/templates/service.yaml b/charts/k6-operator/templates/service.yaml new file mode 100644 index 000000000..76d264ccf --- /dev/null +++ b/charts/k6-operator/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/managed-by: kyverno + generate.kyverno.io/policy-name: workflows-sessionspace + generate.kyverno.io/policy-namespace: "" + generate.kyverno.io/rule-name: generate-argo-workflow-service-account + generate.kyverno.io/trigger-group: "" + generate.kyverno.io/trigger-kind: Namespace + generate.kyverno.io/trigger-namespace: "" + generate.kyverno.io/trigger-uid: 225e0bc5-1410-419d-880c-97fcc98d17bf + generate.kyverno.io/trigger-version: v1 + name: argo-workflow + namespace: ks10000-1 diff --git a/charts/k6-operator/templates/sessionspace.yaml b/charts/k6-operator/templates/sessionspace.yaml new file mode 100644 index 000000000..8e75cd64d --- /dev/null +++ b/charts/k6-operator/templates/sessionspace.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + app.kubernetes.io/managed-by: sessionspaces + name: ks10000-1 +--- +apiVersion: v1 +kind: ConfigMap +data: + end_date: "2026-05-22 9:00:00.0" + gid: "36055" + instrument: b01-1 + members: '["https://identity-dev.diamond.ac.uk/realms/dls/k6Operator", "umi13827"]' + proposal_code: ks + proposal_number: "10000" + start_date: "2026-04-30 9:00:00.0" + visit: "1" +metadata: + labels: + app.kubernetes.io/managed-by: sessionspaces + #workflows.argoproj.io/configmap-type: Parameter + name: sessionspaces + namespace: ks10000-1 + + # rolebindings not created + # v kubectl get roles -n ks10000-1 diff --git a/charts/k6-operator/tests/common.ts b/charts/k6-operator/tests/common.ts new file mode 100644 index 000000000..7da9b49d0 --- /dev/null +++ b/charts/k6-operator/tests/common.ts @@ -0,0 +1,38 @@ +import http from 'k6/http'; +import { check, fail } from 'k6'; +import exec from 'k6/execution'; + +const graphUrl = __ENV.GRAPH_URL; +const keycloakUrl = __ENV.KEYCLOAK_TOKEN_URL; +const clientID = __ENV.KEYCLOAK_CLIENT_ID; +const clientSecret = __ENV.KEYCLOAK_CLIENT_SECRET; + +export function setup(): { token: string } { + if (!clientSecret) fail('KEYCLOAK_CLIENT_SECRET required'); + if (!clientID) fail('KEYCLOAK_CLIENT_ID required'); + if (!keycloakUrl) fail('KEYCLOAK_TOKEN_URL required'); + if (!graphUrl) fail('GRAPH_URL required'); + + const tokenRes = http.post( + keycloakUrl, { + grant_type: 'client_credentials', + client_id: clientID, + client_secret: clientSecret, + }); + + check(tokenRes, { + 'keycloak token request succeeded': (r) => r.status === 200, + }); + + if (tokenRes.status !== 200) { + fail(`Token request failed: ${tokenRes.status} ${tokenRes.body}`); + } + + const tokenBody = JSON.parse(tokenRes.body as string); + const token = tokenBody.access_token; + if (!token) { + exec.test.abort('No access_token in Keycloak response'); + } + + return { token }; +} diff --git a/charts/k6-operator/tests/ping-graph.ts b/charts/k6-operator/tests/ping-graph.ts index 618e9e584..9bc6edd44 100644 --- a/charts/k6-operator/tests/ping-graph.ts +++ b/charts/k6-operator/tests/ping-graph.ts @@ -1,9 +1,13 @@ -import http, { RefinedResponse, ResponseType } from 'k6/http'; +import http from 'k6/http'; import { Options } from 'k6/options'; -import { fail } from 'k6'; - -const url = __ENV.GRAPH_PROXY_URL ?? 'http://graph-proxy.graph-proxy.svc.cluster.local:80/graphql'; +//import { fail, check } from 'k6'; +//import exec from 'k6/execution'; +export { setup } from './common.ts'; +const graphUrl = __ENV.GRAPH_URL +//const keycloakUrl = __ENV.KEYCLOAK_TOKEN_URL +//const clientID = __ENV.KEYCLOAK_CLIENT_ID +//const clientSecret = __ENV.KEYCLOAK_CLIENT_SECRET interface VisitInput { proposalCode: string; @@ -18,10 +22,13 @@ interface ListWorkflowsVariables { interface QueryExample { query: string; - variables: ListWorkflowsVariables; + variables?: ListWorkflowsVariables; } -const queryExamples: { listWorkflowsForVisit: QueryExample } = { +const queryExamples: { + listWorkflowsForVisit: QueryExample; + listTemplates: QueryExample; +} = { listWorkflowsForVisit: { query: ` query ListWorkflowsForVisit($visit: VisitInput!, $limit: Int) { @@ -43,13 +50,26 @@ const queryExamples: { listWorkflowsForVisit: QueryExample } = { `, variables: { visit: { - proposalCode: 'cm', - proposalNumber: 40661, + proposalCode: 'ks', + proposalNumber: 10000, number: 1, }, limit: 30, }, }, + listTemplates: { + query: ` + query { + workflowTemplates { + nodes { + name + title + description + } + } + } + `, + }, }; export const options: Options = { @@ -60,13 +80,13 @@ export const options: Options = { startVUs: 0, stages: [ { duration: '60s', target: 10 }, - //{ duration: '1m', target: 50 }, - //{ duration: '2m', target: 100 }, - //{ duration: '1m', target: 200 }, - //{ duration: '1m', target: 300 }, - //{ duration: '1m', target: 500 }, - //{ duration: '1m', target: 1000 }, - //{ duration: '30s', target: 0 }, + { duration: '1m', target: 50 }, + { duration: '2m', target: 100 }, + { duration: '1m', target: 200 }, + { duration: '1m', target: 300 }, + { duration: '1m', target: 500 }, + { duration: '1m', target: 1000 }, + { duration: '30s', target: 0 }, ], gracefulRampDown: '10s', }, @@ -77,24 +97,26 @@ export const options: Options = { }, }; -export default function(): void { - const token = __ENV.GRAPH_PROXY_BEARER_TOKEN; - if (!token) { - fail('GRAPH_PROXY_BEARER_TOKEN required'); - } + +export default function(data: { token: string }): void { + + const payload = JSON.stringify({ query: queryExamples.listWorkflowsForVisit.query, variables: queryExamples.listWorkflowsForVisit.variables, }); + const params = { headers: { Accept: 'application/json, multipart/mixed', 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, + Authorization: `Bearer ${data.token}`, }, }; - const res = http.post(url, payload, params); + const res = http.post(graphUrl, payload, params); console.log(`status=${res && res.status}`); console.log(`body=${res && res.body}`); + // console.log(`status=${data && data.status}`) + //console.log(`body=${tokenRes && tokenRes.body}`) } diff --git a/charts/k6-operator/tests/ws-subscription.ts b/charts/k6-operator/tests/ws-subscription.ts new file mode 100644 index 000000000..e73e77ffc --- /dev/null +++ b/charts/k6-operator/tests/ws-subscription.ts @@ -0,0 +1,189 @@ +import http from 'k6/http'; +import { check, fail } from 'k6'; +import { Options } from 'k6/options'; +import * as ws from 'k6/ws'; +export { setup } from './common.ts'; + +const graphUrl = __ENV.GRAPH_URL; +const graphWsUrl = __ENV.GRAPH_WS_URL; +const timeoutSeconds = 1800; + +interface VisitInput { + proposalCode: string; + proposalNumber: number; + number: number; +} + +const submitMutation = `mutation K6WsSubmit($templateName: String!, $visit: VisitInput!, $parameters: JSON!) { submitWorkflowTemplate(name: $templateName, visit: $visit, parameters: $parameters) { name } }`; +const subscriptionQuery = `subscription K6WsSubscription($visit: VisitInput!, $name: String!) { workflow(visit: $visit, name: $name) { status { __typename } } }`; + +export const options: Options = { + vus: 1, + iterations: 1, + thresholds: { + http_req_failed: ['rate<0.05'], + }, +}; + +interface MutationResponse { + data?: { + submitWorkflowTemplate?: { + name?: string; + visit?: VisitInput; + status?: string | null; + }; + }; +} + + + +export default function(data: { token: string }): void { + const visit: VisitInput = { + proposalCode: "ks", + proposalNumber: 10000, + number: 1 + } + const templateName = "example-template" + //if (!templateName) fail('WS_TEMPLATE_NAME or TINY_TEMPLATE_NAME required'); + //const parameters = optionalJsonEnv('K6_WS_SUBMISSION_PARAMETERS'); + const parameters = {} + + console.log(`submitting workflow template=${templateName} visit=${JSON.stringify(visit)} graphUrl=${graphUrl}`); + const submitResponse = http.post( + graphUrl, + JSON.stringify({ + query: submitMutation, + variables: { + templateName, + visit, + parameters, + }, + }), + { + headers: { + Authorization: `Bearer ${data.token}`, + }, + tags: { + endpoint: "graphql", + operation: "submit_workflow_template", + scenario: "graphql_ws_subscription", + }, + }, + ); + console.log(`submit mutation response status=${submitResponse.status}`); + + check(submitResponse, { + "submit mutation status is 200": (res) => res && res.status === 200, + }) + let submitBody: MutationResponse | undefined = undefined; + try { + submitBody = submitResponse.json() as MutationResponse; + console.log(`submit mutation response body=${JSON.stringify(submitBody)}`); + } catch (_err) { + console.log(`submit mutation non-JSON body=${String(submitResponse.body)}`); + fail(`submit mutation returned non-JSON body. Status=${submitResponse.status}`); + } + + if (!submitBody || typeof submitBody !== "object" || Array.isArray(submitBody)) { + fail(`submit mutation returned errors: Status=${(submitResponse.status)}`); + } + + const workflowName = submitBody?.data?.submitWorkflowTemplate?.name; + if (!workflowName) { + fail(`submit mutation returned no workflows name. Status=${submitResponse.status}`); + } + console.log(`submitted workflow name=${workflowName}`); + + let connectionAck = false; + let nextCount = 0; + let terminalStatus: string | null = null; + let timedOut = false; + + if (!graphWsUrl) { + fail("GRAPH_WS_URL required"); + } + console.log(`connecting websocket url=${graphWsUrl} timeoutSeconds=${timeoutSeconds}`); + const response = ws.connect( + graphWsUrl, + { + headers: { + Authorization: `Bearer ${data.token}`, + 'Sec-WebSocket-Protocol': 'graphql-transport-ws', + }, + tags: { endpoint: 'graphql_ws', scenario: 'ws_subscription' }, + }, + (socket) => { + socket.on('open', () => { + console.log('websocket open; sending connection_init'); + socket.send(JSON.stringify({ type: 'connection_init', payload: { Authorization: `Bearer ${data.token}` } })); + socket.setTimeout(() => { + timedOut = true; + console.log(`websocket timed out after ${timeoutSeconds}s; closing`); + socket.close(); + }, timeoutSeconds * 1000); + }); + + socket.on('message', (message) => { + console.log(`websocket message=${message}`); + const frame = JSON.parse(message) as { + type: string; + payload?: { data?: { workflow?: { status?: { __typename?: string } } } }; + }; + if (frame.type === 'connection_ack') { + connectionAck = true; + console.log(`websocket connection_ack; subscribing workflow=${workflowName}`); + socket.send(JSON.stringify({ + id: '1', + type: 'subscribe', + payload: { + operationName: 'K6WsSubscription', + query: subscriptionQuery, + variables: { visit, name: workflowName }, + }, + })); + return; + } + if (frame.type === 'next') { + nextCount += 1; + terminalStatus = frame.payload?.data?.workflow?.status?.__typename || null; + console.log(`websocket next count=${nextCount} terminalStatus=${terminalStatus}`); + if (terminalStatus === 'WorkflowRunningStatus') { + console.log(`workflow is running workflow=${workflowName}`); + } + if ( + terminalStatus === 'WorkflowSucceededStatus' || + terminalStatus === 'WorkflowFailedStatus' || + terminalStatus === 'WorkflowErroredStatus' + ) { + console.log(`websocket terminal status=${terminalStatus}; sending complete and closing`); + socket.send(JSON.stringify({ id: '1', type: 'complete' })); + socket.close(); + } + } + }); + + socket.on('close', () => { + console.log('websocket closed'); + }); + + socket.on('error', (err) => { + console.log(`websocket error=${JSON.stringify(err)}`); + }); + }, + ); + console.log(`websocket connect response status=${response.status}`); + + check(response, { + 'websocket upgrade succeeded': (r) => r.status === 101, + }); + console.log( + `websocket final state connectionAck=${connectionAck} nextCount=${nextCount} terminalStatus=${terminalStatus} timedOut=${timedOut}`, + ); + check({ connectionAck, nextCount, terminalStatus, timedOut }, { + 'websocket connection acknowledged': (state) => state.connectionAck, + 'websocket emitted updates': (state) => state.nextCount > 0, + 'subscription saw workflow reach terminal success': (state) => + state.terminalStatus === 'WorkflowSucceededStatus', + 'websocket did not time out': (state) => !state.timedOut, + }); +} diff --git a/charts/k6-operator/values.yaml b/charts/k6-operator/values.yaml index b9cbf014c..eada324f9 100644 --- a/charts/k6-operator/values.yaml +++ b/charts/k6-operator/values.yaml @@ -8,3 +8,6 @@ k6-operator: limits: cpu: 2000m memory: 2Gi + +sessionspace: + enabled: false diff --git a/charts/workflows-cluster/Chart.yaml b/charts/workflows-cluster/Chart.yaml index 6deeaad9f..29af492dd 100644 --- a/charts/workflows-cluster/Chart.yaml +++ b/charts/workflows-cluster/Chart.yaml @@ -3,7 +3,7 @@ name: workflows-cluster description: A virtual cluster for Data Analysis workflows type: application -version: 0.12.1 +version: 0.12.2 dependencies: - name: common version: 2.23.0 diff --git a/charts/workflows-cluster/charts/secrets/templates/graph-proxy-k6-auth.yaml b/charts/workflows-cluster/charts/secrets/templates/graph-proxy-k6-auth.yaml new file mode 100644 index 000000000..359cfa868 --- /dev/null +++ b/charts/workflows-cluster/charts/secrets/templates/graph-proxy-k6-auth.yaml @@ -0,0 +1,16 @@ +{{- if eq .Values.cluster "pollux" }} +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + name: graph-proxy-k6-auth + namespace: workflows +spec: + encryptedData: + KEYCLOAK_CLIENT_ID: AgCSOzbJVQb/al9FiYSz2Y25Y6jHTtSlldwc8GvBjSnLS6w86deIOuwCDyNUfcdPJtDIVQmBZM77iRBx6N2JWcrAipQQwb534fmkVsE1p/O/gpw3CU0vdd4cGc9NCeXkSmJarcLb/+HYP7ggTc+T9r6SxqdoQ2CKTxvPWuR19//SQ92AjIspzFE0bCdEyLcHf5fkp7vWcR28wXbCxUzA/dQtNY2yMfUDQtBks9noTVeUYmcwcmTrcqrntZtSoQvup/Mz/gqaoNIQWl4FqLYo0q7v39QwtBQuuWmkrSiWpJKeick6zXHmorRyBfCl+lnWhQrF+Ajt+9Sh+rwJr49j3OrIpCYv03sekO0pnabphNiP7RrgHjXghPnGb+T5Fr2Lfm1m/hoVNEiFpuoyAAMGEWS50MK4GmGRsHJZNkvCuwDSv4Y7Dpegsw40P7E1xXMlMb5kqXO/F8jWQvMIvZ+mPFtYcwbbg6CPSimUERXueWk+BWQExvdJhfgf45r5zHmhIDgLckIVC5L6IxCpmyqKGpHmB3mcZJBMTwQOYa0hDBosCOC6Tr0CvrCh65Yt4J+n9oFCqIremY01xpykSYiiiTgT0CctFMEVDV356mGC4iAWVvV6TxNZO7e79J6RLIeFeBYzQCi4yZ23IaXIsPCjmV+92QaSzxjULzeJJbAdxsiWoYyv7/Zq07Eg/vWZ1rNIIt1PNtdsMafq3JZ2 + KEYCLOAK_CLIENT_SECRET: AgBhpvOKYOeFINnruWr+NWKyWRJLpfyTa8DI5mwWmTpETEaSrj3AU4DfaYF7uCwpQSw9P4o/zC5uZP+ccIFPUC2ptGLTOlAMklPzZhWyehg6sPJVBH02wwA8fyExOdPoUroz1JcMZYg3N3HBowRJ04t99LZYCt3Ll3xnjdAXMtm9rX5UG9u4TLu7WF2fRiCIH+jtOO/NivdCwSqSK466JnDgMDCF1EeOnmd7aszWjXQky+xU7Hbwi+VZoQrXGGJ62WPGHtqHwli8Fg/DxiYdDqI7hpgrmlgC9HNC7Eel9pKkN2ujEA6EKlZlZoAjVsORZIOUSbpOUikeFRNDfREBnbk3r8SOz16WE22+NtuN7RbLJDjgZGi7rLA9UQVRE/uJAbsGpa10wLou3p61cVWOY/ehUC7/6RfNcT14+C0UI2gpGpN2pzd48/nw4ocSJ4nv2gALE6ZkHsZpiAKddeUUZut4d8z9HB2R4VY2nKVeaCNiPSZJg44gI6E4WKDM30cQY/CSsQX3KFpYjuL8FpgLWE90QNfA/XTBO/7qP3h1TDLvoNnyFj9HDnf4riPA44qBMz0CXaDHlHKRoeYmosgix+jAyChE1UAPidb7Bf9BSXtShBx/rFTiImkoAw8ihebe/qih9RYt659GuVcv/ilu4PkYngFkrCHRxvdPhXILAg6x/cwzT7uRb4mmJ6x4Nt62Ufz3uOxtUZDq8ujYMJD2CXU7iyv8apMrCbxzDsSaiFSFlA== + template: + metadata: + name: graph-proxy-k6-auth + namespace: workflows + type: Opaque +{{- end }} diff --git a/charts/workflows-cluster/staging-values.yaml b/charts/workflows-cluster/staging-values.yaml index d30c54d38..91e46714d 100644 --- a/charts/workflows-cluster/staging-values.yaml +++ b/charts/workflows-cluster/staging-values.yaml @@ -77,6 +77,7 @@ vcluster: "/postgres-argo-workflows-password": "workflows/postgres-argo-workflows-password" "/postgres-application-passwords": "workflows/postgres-application-passwords" "/postgres-initdb-script": "workflows/postgres-initdb-script" + "/graph-proxy-k6-auth": "k6/graph-proxy-k6-auth" ingress: secretName: letsencrypt-kubernetes-staging-workflows-diamond-ac-uk