diff --git a/test/testmetrics/metrics-hpa/00-install.yaml b/test/testmetrics/metrics-hpa/00-install.yaml new file mode 100644 index 0000000000..3fde10dabe --- /dev/null +++ b/test/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/testmetrics/metrics-hpa/00-teststep-template.yaml b/test/testmetrics/metrics-hpa/00-teststep-template.yaml new file mode 100644 index 0000000000..c89fc648cc --- /dev/null +++ b/test/testmetrics/metrics-hpa/00-teststep-template.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: | + kubectl apply -f mock-server.yaml -n $NAMESPACE + # substitutes namespace, making sure they are changed to env var first + # to prevent bad files in case of a test interrupt + - script: | + echo "registering the metric" + envsubst < metric.yaml | kubectl apply -f - -n $NAMESPACE + echo "configuring HPA" + kubectl apply -f hpa.yaml -n $NAMESPACE diff --git a/test/testmetrics/metrics-hpa/01-assert.yaml b/test/testmetrics/metrics-hpa/01-assert.yaml new file mode 100644 index 0000000000..c56170d909 --- /dev/null +++ b/test/testmetrics/metrics-hpa/01-assert.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/testmetrics/metrics-hpa/hpa.yaml b/test/testmetrics/metrics-hpa/hpa.yaml new file mode 100644 index 0000000000..6c320790c7 --- /dev/null +++ b/test/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/v1alpha3 + kind: KeptnMetric + name: cpu-throttling + target: + type: Value + value: "0.05" diff --git a/test/testmetrics/metrics-hpa/metric.yaml b/test/testmetrics/metrics-hpa/metric.yaml new file mode 100644 index 0000000000..7dad85e297 --- /dev/null +++ b/test/testmetrics/metrics-hpa/metric.yaml @@ -0,0 +1,19 @@ +apiVersion: metrics.keptn.sh/v1alpha3 +kind: KeptnMetricsProvider +metadata: + name: my-provider +spec: + type: prometheus + targetServer: "http://mockserver.$NAMESPACE.svc.cluster.local:1080" +--- +apiVersion: metrics.keptn.sh/v1alpha3 +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/testmetrics/metrics-hpa/mock-server.yaml b/test/testmetrics/metrics-hpa/mock-server.yaml new file mode 100644 index 0000000000..6ad8365e0a --- /dev/null +++ b/test/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