From 62e667c1d99501191b970cc7313f28f156f6eaac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-Edouard=20Br=C3=A9t=C3=A9ch=C3=A9?= Date: Tue, 6 Feb 2024 09:16:58 +0100 Subject: [PATCH] chore: migrate testcertificate and testmetrics to chainsaw (#2942) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Charles-Edouard Brétéché --- .github/actions/spelling/expect.txt | 1 + .github/workflows/integration-test.yml | 8 +- .sonarcloud.properties | 1 + Makefile | 16 ++ .../cert-recreates/00-assert.yaml | 24 +++ .../cert-recreates/01-assert.yaml | 24 +++ .../cert-recreates/01-delete.yaml | 6 + .../cert-recreates/02-assert.yaml | 26 ++++ .../cert-recreates/02-install.yaml | 13 ++ .../cert-recreates/chainsaw-test.yaml | 44 ++++++ .../testmetrics/metrics-hpa/00-install.yaml | 49 ++++++ .../metrics-hpa/chainsaw-test.yaml | 30 ++++ .../testmetrics/metrics-hpa/deployment.yaml | 15 ++ .../chainsaw/testmetrics/metrics-hpa/hpa.yaml | 23 +++ .../testmetrics/metrics-hpa/metric.yaml | 19 +++ .../testmetrics/metrics-hpa/mock-server.yaml | 140 ++++++++++++++++++ .../metrics-provider/00-install.yaml | 32 ++++ .../metrics-provider/chainsaw-test.yaml | 16 ++ .../testmetrics/metrics-provider/logs.sh | 19 +++ .../testmetrics/metrics/00-install.yaml | 23 +++ .../testmetrics/metrics/badmetric1.yaml | 11 ++ .../testmetrics/metrics/badmetric2.yaml | 12 ++ .../testmetrics/metrics/badmetric3.yaml | 13 ++ .../testmetrics/metrics/chainsaw-test.yaml | 79 ++++++++++ .../metrics/check-active-metrics.sh | 12 ++ .../testmetrics/metrics/goodmetric1.yaml | 11 ++ .../testmetrics/metrics/goodmetric2.yaml | 11 ++ .../testmetrics/metrics/goodmetric3.yaml | 11 ++ .../testmetrics/metrics/goodmetric4.yaml | 9 ++ .../testmetrics/metrics/goodmetric5.yaml | 13 ++ .../testmetrics/metrics/goodmetric6.yaml | 14 ++ .../testmetrics/metrics/retrieve-metrics.sh | 27 ++++ 32 files changed, 748 insertions(+), 4 deletions(-) create mode 100644 test/chainsaw/testcertificate/cert-recreates/00-assert.yaml create mode 100644 test/chainsaw/testcertificate/cert-recreates/01-assert.yaml create mode 100644 test/chainsaw/testcertificate/cert-recreates/01-delete.yaml create mode 100644 test/chainsaw/testcertificate/cert-recreates/02-assert.yaml create mode 100644 test/chainsaw/testcertificate/cert-recreates/02-install.yaml create mode 100755 test/chainsaw/testcertificate/cert-recreates/chainsaw-test.yaml create mode 100644 test/chainsaw/testmetrics/metrics-hpa/00-install.yaml create mode 100755 test/chainsaw/testmetrics/metrics-hpa/chainsaw-test.yaml create mode 100644 test/chainsaw/testmetrics/metrics-hpa/deployment.yaml create mode 100644 test/chainsaw/testmetrics/metrics-hpa/hpa.yaml create mode 100644 test/chainsaw/testmetrics/metrics-hpa/metric.yaml create mode 100644 test/chainsaw/testmetrics/metrics-hpa/mock-server.yaml create mode 100644 test/chainsaw/testmetrics/metrics-provider/00-install.yaml create mode 100755 test/chainsaw/testmetrics/metrics-provider/chainsaw-test.yaml create mode 100755 test/chainsaw/testmetrics/metrics-provider/logs.sh create mode 100644 test/chainsaw/testmetrics/metrics/00-install.yaml create mode 100644 test/chainsaw/testmetrics/metrics/badmetric1.yaml create mode 100644 test/chainsaw/testmetrics/metrics/badmetric2.yaml create mode 100644 test/chainsaw/testmetrics/metrics/badmetric3.yaml create mode 100755 test/chainsaw/testmetrics/metrics/chainsaw-test.yaml create mode 100755 test/chainsaw/testmetrics/metrics/check-active-metrics.sh create mode 100644 test/chainsaw/testmetrics/metrics/goodmetric1.yaml create mode 100644 test/chainsaw/testmetrics/metrics/goodmetric2.yaml create mode 100644 test/chainsaw/testmetrics/metrics/goodmetric3.yaml create mode 100644 test/chainsaw/testmetrics/metrics/goodmetric4.yaml create mode 100644 test/chainsaw/testmetrics/metrics/goodmetric5.yaml create mode 100644 test/chainsaw/testmetrics/metrics/goodmetric6.yaml create mode 100755 test/chainsaw/testmetrics/metrics/retrieve-metrics.sh diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index f7574d6a50..5359486120 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -163,6 +163,7 @@ envsubst envtest errorlint Etco +euo evaluatemetrics evaluationdefinition evaluationhandler diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 8d151a637e..38521ddbea 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -105,10 +105,10 @@ jobs: working-directory: . run: make chainsaw-integration-test-allowed-namespaces - # - name: (Chainsaw) Run Integration Tests - # if: inputs.allowed-namespaces == 'allowed_ns_off' - # working-directory: . - # run: make integration-test + - name: (Chainsaw) Run Integration Tests + if: inputs.allowed-namespaces == 'allowed_ns_off' + working-directory: . + run: make chainsaw-integration-test - name: Create reports if: failure() diff --git a/.sonarcloud.properties b/.sonarcloud.properties index 28c412839f..2a64e4df32 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -1,6 +1,7 @@ sonar.projectKey=keptn_lifecycle-toolkit sonar.projectName=lifecycle-toolkit sonar.exclusions=test/kuttl/**/*.yaml,\ + test/chainsaw/**/*.yaml,\ docs/docs/**/*.yaml,\ test/prometheus/**/*.yaml,\ examples/**/*.yaml diff --git a/Makefile b/Makefile index 2181dd2b1a..0c85c0bee4 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,22 @@ integration-test-allowed-namespaces-local: install-prometheus # CHAINSAW # ############ +.PHONY: chainsaw-integration-test #these tests should run on a real cluster! +chainsaw-integration-test: + kubectl apply -f ./lifecycle-operator/config/crd/bases +# chainsaw test --test-dir ./test/chainsaw/integration/ + chainsaw test --test-dir ./test/chainsaw/testmetrics/ +# chainsaw test --test-dir ./test/chainsaw/testanalysis/ + chainsaw test --test-dir ./test/chainsaw/testcertificate/ + +.PHONY: chainsaw-integration-test-local #these tests should run on a real cluster! +chainsaw-integration-test-local: + kubectl apply -f ./lifecycle-operator/config/crd/bases +# chainsaw test --test-dir ./test/chainsaw/integration/ --config ./.chainsaw-local.yaml + chainsaw test --test-dir ./test/chainsaw/testmetrics/ --config ./.chainsaw-local.yaml +# chainsaw test --test-dir ./test/chainsaw/testanalysis/ --config ./.chainsaw-local.yaml + chainsaw test --test-dir ./test/chainsaw/testcertificate/ --config ./.chainsaw-local.yaml + .PHONY: chainsaw-integration-test-scheduling-gates #these tests should run on a real cluster! chainsaw-integration-test-scheduling-gates: chainsaw test --test-dir ./test/chainsaw/scheduling-gates/ diff --git a/test/chainsaw/testcertificate/cert-recreates/00-assert.yaml b/test/chainsaw/testcertificate/cert-recreates/00-assert.yaml new file mode 100644 index 0000000000..05a31f9cd5 --- /dev/null +++ b/test/chainsaw/testcertificate/cert-recreates/00-assert.yaml @@ -0,0 +1,24 @@ +# certificate is recreated and there are operators instances available +apiVersion: v1 +kind: Secret +metadata: + name: keptn-certs + namespace: keptn-system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: keptn-system + labels: + control-plane: metrics-operator +status: + readyReplicas: 1 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: keptn-system + labels: + control-plane: lifecycle-operator +status: + readyReplicas: 1 diff --git a/test/chainsaw/testcertificate/cert-recreates/01-assert.yaml b/test/chainsaw/testcertificate/cert-recreates/01-assert.yaml new file mode 100644 index 0000000000..05a31f9cd5 --- /dev/null +++ b/test/chainsaw/testcertificate/cert-recreates/01-assert.yaml @@ -0,0 +1,24 @@ +# certificate is recreated and there are operators instances available +apiVersion: v1 +kind: Secret +metadata: + name: keptn-certs + namespace: keptn-system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: keptn-system + labels: + control-plane: metrics-operator +status: + readyReplicas: 1 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: keptn-system + labels: + control-plane: lifecycle-operator +status: + readyReplicas: 1 diff --git a/test/chainsaw/testcertificate/cert-recreates/01-delete.yaml b/test/chainsaw/testcertificate/cert-recreates/01-delete.yaml new file mode 100644 index 0000000000..e287393aa2 --- /dev/null +++ b/test/chainsaw/testcertificate/cert-recreates/01-delete.yaml @@ -0,0 +1,6 @@ +# second scenario: certificate is removed with no restart +apiVersion: v1 +kind: Secret +metadata: + name: keptn-certs + namespace: keptn-system diff --git a/test/chainsaw/testcertificate/cert-recreates/02-assert.yaml b/test/chainsaw/testcertificate/cert-recreates/02-assert.yaml new file mode 100644 index 0000000000..19f43f6912 --- /dev/null +++ b/test/chainsaw/testcertificate/cert-recreates/02-assert.yaml @@ -0,0 +1,26 @@ +# certificate is recreated and there are operators instances available +apiVersion: v1 +kind: Secret +metadata: + name: keptn-certs + namespace: keptn-system + annotations: + mycert: "true" # make sure this is the latest secret +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + control-plane: metrics-operator + namespace: keptn-system +status: + readyReplicas: 1 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + control-plane: lifecycle-operator + namespace: keptn-system +status: + readyReplicas: 1 diff --git a/test/chainsaw/testcertificate/cert-recreates/02-install.yaml b/test/chainsaw/testcertificate/cert-recreates/02-install.yaml new file mode 100644 index 0000000000..bd4821a4b0 --- /dev/null +++ b/test/chainsaw/testcertificate/cert-recreates/02-install.yaml @@ -0,0 +1,13 @@ +# third scenario: certificate is invalid/expired +apiVersion: v1 +kind: Secret +metadata: + name: keptn-certs + namespace: keptn-system + annotations: + mycert: "true" +data: + # yamllint disable rule:line-length + tls.crt: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNkekNDQWg2Z0F3SUJBZ0lRZUpBWkJMcmxCY2VqNzh3cm4wV1ZIekFLQmdncWhrak9QUVFEQWpDQmlURUwKa0ZGY1FpY29hdE8yRFJnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t" + # yamllint disable rule:line-length + tls.key: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNkekNDQWg2Z0F3SUJBZ0lRZUpBWkJMcmxCY2VqNzh3cm4wV1ZIekFLQmdncWhrak9QUVFEQWpDQmlURUwKa0ZGY1FpY29hdE8yRFJnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t" diff --git a/test/chainsaw/testcertificate/cert-recreates/chainsaw-test.yaml b/test/chainsaw/testcertificate/cert-recreates/chainsaw-test.yaml new file mode 100755 index 0000000000..ad67557087 --- /dev/null +++ b/test/chainsaw/testcertificate/cert-recreates/chainsaw-test.yaml @@ -0,0 +1,44 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: cert-recreates +spec: + steps: + - name: step-00 + try: + - delete: + ref: + apiVersion: v1 + kind: Secret + namespace: keptn-system + name: keptn-certs + - script: + content: | + set -e + kubectl rollout restart deployment -n keptn-system -l control-plane=lifecycle-operator + kubectl rollout restart deployment -n keptn-system -l control-plane=metrics-operator + - assert: + file: 00-assert.yaml + - name: step-01 + try: + - apply: + file: 01-delete.yaml + - assert: + file: 01-assert.yaml + - name: step-02 + try: + - apply: + file: 02-install.yaml + - script: + content: | + str1=$(kubectl get secret keptn-certs -n keptn-system -o=go-template='{{index .data "tls.crt"}}') + str2="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNkekNDQWg2Z0F3SUJBZ0lRZUpBWkJMcmxCY2VqNzh3cm4wV1ZIekFLQmdncWhrak9QUVFEQWpDQmlURUwKa0ZGY1FpY29hdE8yRFJnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t" + if [ "$str1" == "$str2" ]; then + echo "Strings are equal" $str1 + exit 1 + else + echo "Strings are not equal" $str1 "!=" $str2 + fi + - assert: + file: 02-assert.yaml diff --git a/test/chainsaw/testmetrics/metrics-hpa/00-install.yaml b/test/chainsaw/testmetrics/metrics-hpa/00-install.yaml new file mode 100644 index 0000000000..3fde10dabe --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-hpa/00-install.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: podtato-head-entry + labels: + app: podtato-head +spec: + selector: + matchLabels: + component: podtato-head-entry + replicas: 1 + template: + metadata: + labels: + component: podtato-head-entry + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: server + image: ghcr.io/podtato-head/entry:0.2.8 + imagePullPolicy: Always + resources: + limits: + cpu: 10m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + ports: + - containerPort: 9000 + env: + - name: PODTATO_PORT + value: "9000" +--- +apiVersion: v1 +kind: Service +metadata: + name: podtato-head-entry + labels: + app: podtato-head +spec: + selector: + component: podtato-head-entry + ports: + - name: http + port: 9000 + protocol: TCP + targetPort: 9000 + type: ClusterIP diff --git a/test/chainsaw/testmetrics/metrics-hpa/chainsaw-test.yaml b/test/chainsaw/testmetrics/metrics-hpa/chainsaw-test.yaml new file mode 100755 index 0000000000..44e2d8ce8a --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-hpa/chainsaw-test.yaml @@ -0,0 +1,30 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + creationTimestamp: null + name: metrics-hpa +spec: + steps: + - name: step-00 + try: + - apply: + file: 00-install.yaml + - script: + content: | + kubectl apply -f mock-server.yaml -n $NAMESPACE + - script: + content: | + echo "registering the metric" + envsubst < metric.yaml | kubectl apply -f - -n $NAMESPACE + echo "configuring HPA" + kubectl apply -f hpa.yaml -n $NAMESPACE + catch: + - podLogs: + selector: app=podtato-head + - script: + content: | + kubectl logs -l app=metrics-operator -n keptn-system + kubectl describe keptnmetric podtatometric -n $NAMESPACE + kubectl describe keptnmetricsprovider dynatrace -n $NAMESPACE + kubectl describe pods -l app=podtato-head -n $NAMESPACE diff --git a/test/chainsaw/testmetrics/metrics-hpa/deployment.yaml b/test/chainsaw/testmetrics/metrics-hpa/deployment.yaml new file mode 100644 index 0000000000..c56170d909 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-hpa/deployment.yaml @@ -0,0 +1,15 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: podtato-head-entry + labels: + app: podtato-head +spec: + selector: + matchLabels: + component: podtato-head-entry + replicas: 3 + template: + metadata: + labels: + component: podtato-head-entry diff --git a/test/chainsaw/testmetrics/metrics-hpa/hpa.yaml b/test/chainsaw/testmetrics/metrics-hpa/hpa.yaml new file mode 100644 index 0000000000..a3107b7a4a --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-hpa/hpa.yaml @@ -0,0 +1,23 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: podtato-metrics-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: podtato-head-entry + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Object + object: + metric: + name: cpu-throttling + describedObject: + apiVersion: metrics.keptn.sh/v1beta1 + kind: KeptnMetric + name: cpu-throttling + target: + type: Value + value: "0.05" diff --git a/test/chainsaw/testmetrics/metrics-hpa/metric.yaml b/test/chainsaw/testmetrics/metrics-hpa/metric.yaml new file mode 100644 index 0000000000..6c72b1c91c --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-hpa/metric.yaml @@ -0,0 +1,19 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetricsProvider +metadata: + name: my-provider +spec: + type: prometheus + targetServer: "http://mockserver.$NAMESPACE.svc.cluster.local:1080" +--- +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: cpu-throttling +spec: + provider: + name: my-provider + query: 'avg(rate(container_cpu_cfs_throttled_seconds_total{container="server", namespace="podtato-metrics"}))' + fetchIntervalSeconds: 10 + range: + interval: "1m" diff --git a/test/chainsaw/testmetrics/metrics-hpa/mock-server.yaml b/test/chainsaw/testmetrics/metrics-hpa/mock-server.yaml new file mode 100644 index 0000000000..6ad8365e0a --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-hpa/mock-server.yaml @@ -0,0 +1,140 @@ +apiVersion: v1 +kind: Service +metadata: + name: mockserver +spec: + ports: + - name: serviceport + port: 1080 + protocol: TCP + targetPort: serviceport + selector: + app: mockserver + sessionAffinity: None + type: ClusterIP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: mockserver + name: mockserver +spec: + replicas: 1 + selector: + matchLabels: + app: mockserver + template: + metadata: + labels: + app: mockserver + name: mockserver + spec: + containers: + - env: + - name: MOCKSERVER_LOG_LEVEL + value: INFO + - name: SERVER_PORT + value: "1080" + image: mockserver/mockserver:mockserver-5.13.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 10 + initialDelaySeconds: 10 + periodSeconds: 5 + successThreshold: 1 + tcpSocket: + port: serviceport + timeoutSeconds: 1 + name: mockserver + ports: + - containerPort: 1080 + name: serviceport + protocol: TCP + readinessProbe: + failureThreshold: 10 + initialDelaySeconds: 2 + periodSeconds: 2 + successThreshold: 1 + tcpSocket: + port: serviceport + timeoutSeconds: 1 + volumeMounts: + - mountPath: /config + name: config-volume + - mountPath: /libs + name: libs-volume + terminationGracePeriodSeconds: 30 + volumes: + - configMap: + defaultMode: 420 + name: mockserver-config + optional: true + name: config-volume + - configMap: + defaultMode: 420 + name: mockserver-config + optional: true + name: libs-volume +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: mockserver-config +data: + initializerJson.json: |- + [ + { + "httpRequest": { + "path": "/api/v1/query_range", + "method": "POST" + }, + "httpResponse": { + "body": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "__name__": "cpu-throttling", + "job": "", + "instance": "" + }, + "values": [[1669714193.275, "4.0"]] + } + ] + } + }, + "statusCode": 200 + } + } + ] + mockserver.properties: |- + ############################### + # MockServer & Proxy Settings # + ############################### + # Socket & Port Settings + # socket timeout in milliseconds (default 120000) + mockserver.maxSocketTimeout=120000 + # Certificate Generation + # dynamically generated CA key pair (if they don't already exist in + specified directory) + mockserver.dynamicallyCreateCertificateAuthorityCertificate=true + # save dynamically generated CA key pair in working directory + mockserver.directoryToSaveDynamicSSLCertificate=. + # certificate domain name (default "localhost") + mockserver.sslCertificateDomainName=localhost + # comma separated list of ip addresses for Subject Alternative Name domain + names (default empty list) + mockserver.sslSubjectAlternativeNameDomains=www.example.com,www.another.com + # comma separated list of ip addresses for Subject Alternative Name ips + (default empty list) + mockserver.sslSubjectAlternativeNameIps=127.0.0.1 + # CORS + # enable CORS for MockServer REST API + mockserver.enableCORSForAPI=true + # enable CORS for all responses + mockserver.enableCORSForAllResponses=true + # Json Initialization + mockserver.initializationJsonPath=/config/initializerJson.json diff --git a/test/chainsaw/testmetrics/metrics-provider/00-install.yaml b/test/chainsaw/testmetrics/metrics-provider/00-install.yaml new file mode 100644 index 0000000000..0144dc52d4 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-provider/00-install.yaml @@ -0,0 +1,32 @@ +apiVersion: v1 +kind: Secret +metadata: + name: dynatrace + namespace: keptn-system +type: Opaque +data: + DT_TOKEN: dG9rZW46IG15dG9rZW4= +--- +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtatometric + namespace: keptn-system +spec: + provider: + name: "dynatrace" + query: "query" + fetchIntervalSeconds: 5 + +--- +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetricsProvider +metadata: + name: dynatrace + namespace: keptn-system +spec: + secretKeyRef: + key: DT_TOKEN + name: dynatrace + type: dynatrace + targetServer: "http://localhost:8080" # string diff --git a/test/chainsaw/testmetrics/metrics-provider/chainsaw-test.yaml b/test/chainsaw/testmetrics/metrics-provider/chainsaw-test.yaml new file mode 100755 index 0000000000..88fedf6d08 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-provider/chainsaw-test.yaml @@ -0,0 +1,16 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: metrics-provider +spec: + steps: + - name: step-00 + try: + - apply: + file: 00-install.yaml + - name: step-01 + try: + - script: + timeout: 5m + content: ./logs.sh diff --git a/test/chainsaw/testmetrics/metrics-provider/logs.sh b/test/chainsaw/testmetrics/metrics-provider/logs.sh new file mode 100755 index 0000000000..5674082879 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics-provider/logs.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +NAMESPACE="keptn-system" +RETRY_COUNT=3 +SLEEP_TIME=5 + +for i in $(seq 1 $RETRY_COUNT); do + VAR=$(kubectl logs -n $NAMESPACE deployments/lifecycle-operator | grep -c "Error while parsing response") + # shellcheck disable=SC1072 + if [ "$VAR" -ge 1 ]; then + echo "Controller could access secret" + exit 0 + fi + if [ "$i" -lt "$RETRY_COUNT" ]; then + echo "Sleeping for ${SLEEP_TIME} seconds before retrying..." + sleep ${SLEEP_TIME} + fi +done +echo "Retried ${RETRY_COUNT} times, but custom metric value did not meet the condition. Exiting..."exit 1 diff --git a/test/chainsaw/testmetrics/metrics/00-install.yaml b/test/chainsaw/testmetrics/metrics/00-install.yaml new file mode 100644 index 0000000000..6916e95967 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/00-install.yaml @@ -0,0 +1,23 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetricsProvider +metadata: + name: my-provider +spec: + type: prometheus + targetServer: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" +--- +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetricsProvider +metadata: + name: my-provider2 +spec: + type: prometheus + targetServer: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" +--- +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetricsProvider +metadata: + name: prometheus +spec: + type: prometheus + targetServer: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" diff --git a/test/chainsaw/testmetrics/metrics/badmetric1.yaml b/test/chainsaw/testmetrics/metrics/badmetric1.yaml new file mode 100644 index 0000000000..96fef3d6c3 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/badmetric1.yaml @@ -0,0 +1,11 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head1 +spec: + provider: + name: "my-provider" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5mins" diff --git a/test/chainsaw/testmetrics/metrics/badmetric2.yaml b/test/chainsaw/testmetrics/metrics/badmetric2.yaml new file mode 100644 index 0000000000..c5fd1ccbe0 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/badmetric2.yaml @@ -0,0 +1,12 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head1 +spec: + provider: + name: "my-provider" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" + step: "1mins" diff --git a/test/chainsaw/testmetrics/metrics/badmetric3.yaml b/test/chainsaw/testmetrics/metrics/badmetric3.yaml new file mode 100644 index 0000000000..2dbbc08d6f --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/badmetric3.yaml @@ -0,0 +1,13 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head1 +spec: + provider: + name: "my-provider" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" + step: "1m" + aggregation: "p91" diff --git a/test/chainsaw/testmetrics/metrics/chainsaw-test.yaml b/test/chainsaw/testmetrics/metrics/chainsaw-test.yaml new file mode 100755 index 0000000000..a393e6f211 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/chainsaw-test.yaml @@ -0,0 +1,79 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + creationTimestamp: null + name: metrics +spec: + steps: + - name: step-00 + try: + - apply: + file: 00-install.yaml + - name: step-01 + try: + - apply: + file: badmetric1.yaml + expect: + - check: + ($error != null): true + - apply: + file: badmetric2.yaml + expect: + - check: + ($error != null): true + - apply: + file: badmetric3.yaml + expect: + - check: + ($error != null): true + - apply: + file: goodmetric1.yaml + - apply: + file: goodmetric2.yaml + - apply: + file: goodmetric3.yaml + - apply: + file: goodmetric4.yaml + - apply: + file: goodmetric5.yaml + - apply: + file: goodmetric6.yaml + - name: step-02 + try: + - assert: + file: goodmetric1.yaml + - assert: + file: goodmetric2.yaml + - assert: + file: goodmetric3.yaml + - assert: + file: goodmetric4.yaml + - assert: + file: goodmetric5.yaml + - assert: + file: goodmetric6.yaml + - error: + file: badmetric1.yaml + - error: + file: badmetric2.yaml + - error: + file: badmetric3.yaml + - name: step-03 + try: + - script: + content: ./retrieve-metrics.sh "podtato-head1" + - script: + content: ./retrieve-metrics.sh "podtato-head2" + - script: + content: ./retrieve-metrics.sh "podtato-head3" + - script: + content: ./retrieve-metrics.sh "podtato-head4" + - script: + content: ./retrieve-metrics.sh "podtato-head5" + - script: + content: ./retrieve-metrics.sh "podtato-head6" + - name: step-04 + try: + - script: + content: ./check-active-metrics.sh "keptn_lifecycle_active" diff --git a/test/chainsaw/testmetrics/metrics/check-active-metrics.sh b/test/chainsaw/testmetrics/metrics/check-active-metrics.sh new file mode 100755 index 0000000000..dacd571298 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/check-active-metrics.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Usage: ./retrieve-metrics.sh + +component_name=$1 + +metrics_url="http://lifecycle-operator-metrics-service.keptn-system.svc.cluster.local:2222/metrics" + +# Fetch keptn_lifecycle_active metrics +metrics=$(curl -s $metrics_url | grep "${component_name}") + +echo "$metrics" diff --git a/test/chainsaw/testmetrics/metrics/goodmetric1.yaml b/test/chainsaw/testmetrics/metrics/goodmetric1.yaml new file mode 100644 index 0000000000..9e0b73f3ab --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/goodmetric1.yaml @@ -0,0 +1,11 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head1 +spec: + provider: + name: "my-provider" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" diff --git a/test/chainsaw/testmetrics/metrics/goodmetric2.yaml b/test/chainsaw/testmetrics/metrics/goodmetric2.yaml new file mode 100644 index 0000000000..a03242714c --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/goodmetric2.yaml @@ -0,0 +1,11 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head2 +spec: + provider: + name: "prometheus" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" diff --git a/test/chainsaw/testmetrics/metrics/goodmetric3.yaml b/test/chainsaw/testmetrics/metrics/goodmetric3.yaml new file mode 100644 index 0000000000..b531508f3c --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/goodmetric3.yaml @@ -0,0 +1,11 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head3 +spec: + provider: + name: "my-provider2" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" diff --git a/test/chainsaw/testmetrics/metrics/goodmetric4.yaml b/test/chainsaw/testmetrics/metrics/goodmetric4.yaml new file mode 100644 index 0000000000..83375eebf7 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/goodmetric4.yaml @@ -0,0 +1,9 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head4 +spec: + provider: + name: "prometheus" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 diff --git a/test/chainsaw/testmetrics/metrics/goodmetric5.yaml b/test/chainsaw/testmetrics/metrics/goodmetric5.yaml new file mode 100644 index 0000000000..72ade8cc6a --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/goodmetric5.yaml @@ -0,0 +1,13 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head5 +spec: + provider: + name: "my-provider2" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" + step: "1m" + aggregation: "p90" diff --git a/test/chainsaw/testmetrics/metrics/goodmetric6.yaml b/test/chainsaw/testmetrics/metrics/goodmetric6.yaml new file mode 100644 index 0000000000..3cfdce1104 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/goodmetric6.yaml @@ -0,0 +1,14 @@ +apiVersion: metrics.keptn.sh/v1beta1 +kind: KeptnMetric +metadata: + name: podtato-head6 +spec: + provider: + name: "my-provider2" + query: "sum(kube_pod_container_resource_limits{resource='cpu'})" + fetchIntervalSeconds: 5 + range: + interval: "5m" + step: "1m" + aggregation: "p90" + storedResults: 5 diff --git a/test/chainsaw/testmetrics/metrics/retrieve-metrics.sh b/test/chainsaw/testmetrics/metrics/retrieve-metrics.sh new file mode 100755 index 0000000000..777f096727 --- /dev/null +++ b/test/chainsaw/testmetrics/metrics/retrieve-metrics.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +METRIC_NAME=$1 +RETRY_COUNT=3 +SLEEP_TIME=5 + +for i in $(seq 1 $RETRY_COUNT); do + # Retrieve the custom metric value + METRIC_VALUE=$(kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/${NAMESPACE}/keptnmetrics.metrics.sh/${METRIC_NAME}/${METRIC_NAME}") + + LENGTH_ITEMS=$(echo $METRIC_VALUE | jq '.items | length') + + if [[ $LENGTH_ITEMS == 1 ]]; then + echo "Found the expected metric $METRIC_NAME" + exit 0 + else + echo "The length of the property .items of $METRIC_NAME is not 1, it is: $LENGTH_ITEMS" + fi + + if [ "$i" -lt "$RETRY_COUNT" ]; then + echo "Sleeping for ${SLEEP_TIME} seconds before retrying..." + sleep ${SLEEP_TIME} + fi +done + +echo "Retried ${RETRY_COUNT} times, but custom metric value did not meet the condition. Exiting..." +exit 1