From 9f623c816ae622c043dd87affc6692f93b945507 Mon Sep 17 00:00:00 2001 From: Yogananth Subramanian Date: Thu, 7 Nov 2024 14:01:56 +0530 Subject: [PATCH] Fix: Ephemeral namespace perf test This patch resolves an issue related to running integration performance tests in the Ephemeral namespace by using the service endpoint instead of the route. This patch also makes setting a secret for the horreum optional. --- .tekton/rhtap-perf-integration-test.yaml | 156 +++++++++++++---------- .tekton/rhtap-perf-k6-test.js | 8 +- 2 files changed, 91 insertions(+), 73 deletions(-) diff --git a/.tekton/rhtap-perf-integration-test.yaml b/.tekton/rhtap-perf-integration-test.yaml index 7c279172..8177797f 100644 --- a/.tekton/rhtap-perf-integration-test.yaml +++ b/.tekton/rhtap-perf-integration-test.yaml @@ -12,14 +12,6 @@ spec: name: SNAPSHOT default: '{"components": [{"name":"test-app", "containerImage": "quay.io/example/repo:latest"}]}' type: string - - description: 'Namespace where the application is running' - name: NAMESPACE - default: "default" - type: string - - description: 'Application endpoint port' - name: PORT - default: "" - type: string - description: 'Horreum Test Name' name: HR_TEST_NAME default: "" @@ -75,15 +67,43 @@ spec: else exit 1 fi + - name: extract-secrets + taskSpec: + results: + - name: HORREUM_PASSWORD + type: string + - name: HORREUM_URI + type: string + - name: HORREUM_USER + type: string + - name: HORREUM_COFIG_SET + type: string + steps: + - name: extract-secrets + image: registry.redhat.io/openshift4/ose-cli:latest + script: | + #!/bin/bash + horreum_sec_set='true' + horreum_password='' + horreum_uri='' + horreum_user='' + oc get secret horreum + if [ $? -ne 0 ]; then + horreum_sec_set='false' + else + horreum_password=$(oc get secret horreum -o jsonpath='{.data.horreum_password}' | base64 --decode) + horreum_uri=$(oc get secret horreum -o jsonpath='{.data.horreum_uri}' | base64 --decode) + horreum_user=$(oc get secret horreum -o jsonpath='{.data.horreum_user}' | base64 --decode) + fi + echo -n "${horreum_password}" | tee $(results.HORREUM_PASSWORD.path) + echo -n "${horreum_uri}" | tee $(results.HORREUM_URI.path) + echo -n "${horreum_user}" | tee $(results.HORREUM_USER.path) + echo -n "${horreum_sec_set}" | tee $(results.HORREUM_COFIG_SET.path) - name: deploy-app runAfter: [provision-env] params: - name: SNAPSHOT value: $(params.SNAPSHOT) - - name: NAMESPACE - value: $(params.NAMESPACE) - - name: PORT - value: $(params.PORT) - name: HR_TEST_NAME value: $(params.HR_TEST_NAME) - name: HR_REG_VAR @@ -116,10 +136,6 @@ spec: env: - name: SNAPSHOT value: $(params.SNAPSHOT) - - name: NAMESPACE - value: $(params.NAMESPACE) - - name: PORT - value: $(params.PORT) - name: KUBECONFIG_VALUE valueFrom: secretKeyRef: @@ -161,21 +177,15 @@ spec: mkdir -p /tmp/templates/ for i in $(ls templates/*yml); do j=${i#*/}; outf=${j%.*};oc process --kubeconfig /tmp/cfg --filename="$i" --local="true" --ignore-unknown-parameters="true" --param="ENVIRONMENT"=development --param="GLOG_V"=10 --param="DATABASE_HOST"=trex-db.$(oc project --short) --param="DATABASE_NAME"=rhtrex --param="DATABASE_PASSWORD"=foobar-bizz-buzz --param="DATABASE_PORT"=5432 --param="DATABASE_USER"=trex --param="DATABASE_SSLMODE"=disable --param="ENABLE_SENTRY"=false --param="SENTRY_KEY"=TODO --param="JWKS_URL"=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/certs --param="OCM_SERVICE_CLIENT_ID"=${CLIENT_ID} --param="OCM_SERVICE_CLIENT_SECRET"=${CLIENT_SEC} --param="OCM_BASE_URL"=https://api.integration.openshift.com --param="IMAGE_REGISTRY="$image_reg --param="IMAGE_REPOSITORY="$image_rep --param="IMAGE_TAG="$image_tag > /tmp/templates/${outf}.json; done oc apply --kubeconfig /tmp/cfg -f /tmp/templates/db-template.json + sleep 60 oc apply --kubeconfig /tmp/cfg -f /tmp/templates/secrets-template.json oc apply --kubeconfig /tmp/cfg -f /tmp/templates/service-template.json - oc expose --kubeconfig /tmp/cfg service trex + sleep 60 oc get --kubeconfig /tmp/cfg all - ROUTE_NAME=$(oc get --kubeconfig /tmp/cfg routes trex -o name --insecure-skip-tls-verify) - HOST=$(oc get --kubeconfig /tmp/cfg "${ROUTE_NAME}" -o jsonpath={.spec.host} --insecure-skip-tls-verify) - echo "Found target host ${HOST} for app ${APPLICATION_NAME}" - - # Check the application endpoint - ENDPOINT_OUTPUT=$(curl -k http://${HOST}:${PORT}) - echo -e "The endpoint outputs the following:\n ${ENDPOINT_OUTPUT}" - echo -e "Snapshot output:\n ${SNAPSHOT}" + oc get --kubeconfig /tmp/cfg events + oc describe --kubeconfig /tmp/cfg pod -l app=trex + oc logs --kubeconfig /tmp/cfg -l app=trex - echo ${HOST} > /tekton/home/endpoint_url - echo -n ${HOST} | tee $(results.APP_URL.path) if [ -z $(params.HR_TEST_NAME) ] then echo '$(params.SNAPSHOT)'|jq -r .components[].name | tr -d '\n\t' | tee $(results.test_name.path) @@ -189,19 +199,44 @@ spec: else echo -n '$(params.HR_REG_VAR)' | tee $(results.reg_var.path) fi - - name: perf-benchmark + - name: perf-benchmark params: - - name: url - value: $(tasks.deploy-app.results.APP_URL) - name: test_name value: $(tasks.deploy-app.results.test_name) - name: reg_var value: $(tasks.deploy-app.results.reg_var) + - name: HORREUM_COFIG_SET + value: $(tasks.extract-secrets.results.HORREUM_COFIG_SET) + - name: HORREUM_PASSWORD + value: $(tasks.extract-secrets.results.HORREUM_PASSWORD) + - name: HORREUM_URI + value: $(tasks.extract-secrets.results.HORREUM_URI) + - name: HORREUM_USER + value: $(tasks.extract-secrets.results.HORREUM_USER) taskSpec: params: - - name: url - name: test_name - - name: reg_var + - name: reg_var + - name: HORREUM_COFIG_SET + - name: HORREUM_PASSWORD + - name: HORREUM_URI + - name: HORREUM_USER + sidecars: + - name: port-forward + image: registry.redhat.io/openshift4/ose-cli:latest + env: + - name: KUBECONFIG_VALUE + valueFrom: + secretKeyRef: + name: "$(tasks.provision-env.results.secretRef)" + key: kubeconfig + ports: + - containerPort: 8080 + script: | + #!/usr/bin/env bash + cat <<< "$KUBECONFIG_VALUE" > /tmp/cfg + export KUBECONFIG=/tmp/cfg + oc port-forward --kubeconfig /tmp/cfg svc/trex 8080:8000 steps: - image: grafana/k6 name: run-perf @@ -213,50 +248,37 @@ spec: key: ocmtoken script: | #!/usr/bin/env sh - export - echo "Transform result to json format" wget -O /tmp/ocm https://github.com/openshift-online/ocm-cli/releases/download/v0.1.65/ocm-linux-amd64 chmod +x /tmp/ocm - echo ${OCM_TOKEN} - /tmp/ocm login --token=${OCM_TOKEN} --url=http://$(params.url) - export BASE_URL=http://$(params.url) - wget -O /tmp/script.js https://raw.githubusercontent.com/yogananth-subramanian/rh-trex/main/.tekton/rhtap-perf-k6-test.js + /tmp/ocm login --token=${OCM_TOKEN} --url=https://127.0.0.1:8080 --debug + export BASE_URL=https://127.0.0.1:8080 + wget -O /tmp/script.js https://raw.githubusercontent.com/openshift-online/rh-trex/refs/heads/main/.tekton/rhtap-perf-k6-test.js echo -n `/tmp/ocm token`>/tmp/token k6 run /tmp/script.js cat /workspace/output.json - image: quay.io/yogananth_subramanian/curl-yq-jq name: check-regression - env: - - name: HORREUM_PASSWORD - valueFrom: - secretKeyRef: - name: horreum - key: horreum_password - - name: HORREUM_URI - valueFrom: - secretKeyRef: - name: horreum - key: horreum_uri - - name: HORREUM_USER - valueFrom: - secretKeyRef: - name: horreum - key: horreum_user script: | - set -xv - echo "Transform result to json format" - cat /workspace/output.json - test_name=$(params.test_name) - reg_var=$(params.reg_var) - KEYCLOAK_URI=$(curl -s -k -X GET ${HORREUM_URI}/api/config/keycloak|jq -r .url) - TOKEN=$(curl -s -k ${KEYCLOAK_URI}/realms/horreum/protocol/openid-connect/token -d "username=$HORREUM_USER" -d "password=$HORREUM_PASSWORD" -d 'grant_type=password' -d 'client_id=horreum-ui' | jq -r .access_token) - curl -k -s -v ${HORREUM_URI}'/api/run/data?start=$.startTime&stop=$.endTime&test='$test_name -X POST -H 'Authorization: Bearer '${TOKEN} -H 'Content-Type: application/json' -d @/workspace/output.json - testid=$(curl -s -k -X GET ${HORREUM_URI}'/api/test/byName/'$test_name|jq -r .id) - varid=$(curl -s -k -X GET ${HORREUM_URI}'/api/alerting/variables?test='$testid|jq -r --arg regvar "$reg_var" '.[] | select(.name==$regvar)| .id ') - changes=`curl -s -k -X GET ${HORREUM_URI}'/api/alerting/changes?var='$varid |jq '.| length'` - if [ -z $changes ] || [ $changes -gt 0 ] ;then echo "Regression check failed";exit 1;fi + set -x + horreum_sec_set=$(params.HORREUM_COFIG_SET) + if [ ${horreum_sec_set} == 'false' ]; then + echo "Horreum config not set" + else + echo "Transform result to json format" + cat /workspace/output.json + test_name=$(params.test_name) + reg_var=$(params.reg_var) + KEYCLOAK_URI=$(curl -s -k -X GET ${HORREUM_URI}/api/config/keycloak|jq -r .url) + TOKEN=$(curl -s -k ${KEYCLOAK_URI}/realms/horreum/protocol/openid-connect/token -d "username=$HORREUM_USER" -d "password=$HORREUM_PASSWORD" -d 'grant_type=password' -d 'client_id=horreum-ui' | jq -r .access_token) + curl -k -s -v ${HORREUM_URI}'/api/run/data?start=$.startTime&stop=$.endTime&test='$test_name -X POST -H 'Authorization: Bearer '${TOKEN} -H 'Content-Type: application/json' -d @/workspace/output.json + testid=$(curl -s -k -X GET ${HORREUM_URI}'/api/test/byName/'$test_name|jq -r .id) + varid=$(curl -s -k -X GET ${HORREUM_URI}'/api/alerting/variables?test='$testid|jq -r --arg regvar "$reg_var" '.[] | select(.name==$regvar)| .id ') + changes=`curl -s -k -X GET ${HORREUM_URI}'/api/alerting/changes?var='$varid |jq '.| length'` + if [ -z $changes ] || [ $changes -gt 0 ] ;then echo "Regression check failed";exit 1;fi + fi runAfter: - deploy-app + - extract-secrets finally: - name: cleanup params: @@ -278,4 +300,4 @@ spec: fi TEST_OUTPUT=$(jq -rc --arg date $(date +%s) --arg RESULT "${RESULT}" --null-input \ '{result: $RESULT, timestamp: $date, failures: 0, successes: 0, warnings: 0}') - echo -n "${TEST_OUTPUT}" | tee $(results.TEST_OUTPUT.path) + echo -n "${TEST_OUTPUT}" | tee $(results.TEST_OUTPUT.path) \ No newline at end of file diff --git a/.tekton/rhtap-perf-k6-test.js b/.tekton/rhtap-perf-k6-test.js index 99ba93ce..0d4a535d 100644 --- a/.tekton/rhtap-perf-k6-test.js +++ b/.tekton/rhtap-perf-k6-test.js @@ -6,13 +6,13 @@ import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.2/index.js'; const token = open('/tmp/token'); const BASE_URL = `${__ENV.BASE_URL}`; -const SLEEP_DURATION = 0.2; const listTrend = new Trend('List_API'); const postTrend = new Trend('POST_API'); const getTrend = new Trend('GET_ID_API'); const patchTrend = new Trend('PATCH_API'); export const options = { + insecureSkipTLSVerify: true, scenarios: { k6_rhtrex: { executor: 'constant-arrival-rate', @@ -22,7 +22,7 @@ export const options = { }, }, thresholds: { - iteration_duration: ['med<900'], + iteration_duration: ['med<40'], List_API: ['med<10'], POST_API: ['med<10'], PATCH_API: ['med<20'], @@ -66,7 +66,6 @@ export default function () { "A JSON array of dinosaur objects": (r) => r.status === 200 }); listTrend.add(request.timings.duration); - sleep(SLEEP_DURATION); } { @@ -81,7 +80,6 @@ export default function () { }); postTrend.add(request.timings.duration); - sleep(SLEEP_DURATION); } }); @@ -98,7 +96,6 @@ export default function () { }); getTrend.add(request.timings.duration); - sleep(SLEEP_DURATION); } { @@ -112,7 +109,6 @@ export default function () { patchTrend.add(request.timings.duration); - sleep(SLEEP_DURATION); }