From f947ed63be23b5fa52b2a1f4b6e4b42e2270cb5f Mon Sep 17 00:00:00 2001 From: TheRealNoob Date: Mon, 24 Mar 2025 14:51:59 -0700 Subject: [PATCH 1/6] [kube-prometheus-stack] allow extraManifests as map/list Signed-off-by: TheRealNoob --- charts/kube-prometheus-stack/Chart.yaml | 2 +- .../templates/extra-objects.yaml | 17 ++++++++++++++--- charts/kube-prometheus-stack/values.yaml | 6 ++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/charts/kube-prometheus-stack/Chart.yaml b/charts/kube-prometheus-stack/Chart.yaml index 5db531d32483..da7d0017e661 100644 --- a/charts/kube-prometheus-stack/Chart.yaml +++ b/charts/kube-prometheus-stack/Chart.yaml @@ -31,7 +31,7 @@ name: kube-prometheus-stack sources: - https://github.com/prometheus-community/helm-charts - https://github.com/prometheus-operator/kube-prometheus -version: 70.3.0 +version: 70.4.0 appVersion: v0.81.0 kubeVersion: ">=1.19.0-0" home: https://github.com/prometheus-operator/kube-prometheus diff --git a/charts/kube-prometheus-stack/templates/extra-objects.yaml b/charts/kube-prometheus-stack/templates/extra-objects.yaml index 567f7bf32971..b0ec6fad2c58 100644 --- a/charts/kube-prometheus-stack/templates/extra-objects.yaml +++ b/charts/kube-prometheus-stack/templates/extra-objects.yaml @@ -1,4 +1,15 @@ -{{ range .Values.extraManifests }} +{{- /* Normalize extraObjects to a list, easier to loop over */ -}} +{{- $extraObjects := .Values.extraManifests | default (list) -}} + +{{- if kindIs "map" $extraObjects -}} + {{- $extraObjects = values $extraObjects -}} +{{- end -}} + +{{- range $extraObjects }} --- -{{ tpl (toYaml .) $ }} -{{ end }} + {{- if kindIs "map" . }} + {{- tpl (toYaml .) $ | nindent 0 }} + {{- else if kindIs "string" . }} + {{- tpl . $ | nindent 0 }} + {{- end }} +{{- end }} diff --git a/charts/kube-prometheus-stack/values.yaml b/charts/kube-prometheus-stack/values.yaml index 79075aa51dca..242f3b7efa3a 100644 --- a/charts/kube-prometheus-stack/values.yaml +++ b/charts/kube-prometheus-stack/values.yaml @@ -5300,8 +5300,10 @@ thanosRuler: ## cleanPrometheusOperatorObjectNames: false -## Extra manifests to deploy as an array -extraManifests: [] +## Extra manifests to deploy. Can be of type map or slice. +## If slice, keys are ignored and only values are used. +## Items contained within extraObjects can be defined as dict or string and are passed through tpl. +extraManifests: null # - apiVersion: v1 # kind: ConfigMap # metadata: From 2e0eea61f83d5f5da315373b201b0f35d2b2d9f8 Mon Sep 17 00:00:00 2001 From: TheRealNoob Date: Mon, 24 Mar 2025 20:22:35 -0700 Subject: [PATCH 2/6] fix comment Signed-off-by: TheRealNoob --- charts/kube-prometheus-stack/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/kube-prometheus-stack/values.yaml b/charts/kube-prometheus-stack/values.yaml index 242f3b7efa3a..a533cfa2b885 100644 --- a/charts/kube-prometheus-stack/values.yaml +++ b/charts/kube-prometheus-stack/values.yaml @@ -5301,7 +5301,7 @@ thanosRuler: cleanPrometheusOperatorObjectNames: false ## Extra manifests to deploy. Can be of type map or slice. -## If slice, keys are ignored and only values are used. +## If map, keys are ignored and only values are used. ## Items contained within extraObjects can be defined as dict or string and are passed through tpl. extraManifests: null # - apiVersion: v1 From df0a4a2a281180c0c9fc020b032898bbedbe6980 Mon Sep 17 00:00:00 2001 From: TheRealNoob Date: Mon, 24 Mar 2025 20:26:31 -0700 Subject: [PATCH 3/6] change comment to common vernacular Signed-off-by: TheRealNoob --- charts/kube-prometheus-stack/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/kube-prometheus-stack/values.yaml b/charts/kube-prometheus-stack/values.yaml index a533cfa2b885..341bb7022faa 100644 --- a/charts/kube-prometheus-stack/values.yaml +++ b/charts/kube-prometheus-stack/values.yaml @@ -5300,8 +5300,8 @@ thanosRuler: ## cleanPrometheusOperatorObjectNames: false -## Extra manifests to deploy. Can be of type map or slice. -## If map, keys are ignored and only values are used. +## Extra manifests to deploy. Can be of type dict or list. +## If dict, keys are ignored and only values are used. ## Items contained within extraObjects can be defined as dict or string and are passed through tpl. extraManifests: null # - apiVersion: v1 From af3e816a552f9baa30f6a8994c0a9bb178fe3a7d Mon Sep 17 00:00:00 2001 From: TheRealNoob Date: Tue, 25 Mar 2025 11:57:35 -0700 Subject: [PATCH 4/6] add tests & examples Signed-off-by: TheRealNoob --- .../ci/03-non-defaults-values.yaml | 26 +++++++++++++++++++ .../05-ingress-and-gateway-routes-values.yaml | 19 ++++++++++++++ charts/kube-prometheus-stack/values.yaml | 15 +++++++++++ 3 files changed, 60 insertions(+) diff --git a/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml b/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml index dcfe23ef199f..b6b51d23b977 100644 --- a/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml +++ b/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml @@ -1,5 +1,9 @@ # this file tests some non default values to increase the test coverage +commonLabels: + foo: one + bar: two + defaultRules: additionalRuleLabels: key: value @@ -93,3 +97,25 @@ nodeExporter: prometheus-node-exporter: kubeRBACProxy: enabled: true + +extraObjects: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: test-cm + data: + plaintext: foobar + templated: '{{ print "foobar" | upper }}' + - | + apiVersion: v1 + kind: Secret + type: Opaque + metadata: + name: test-secret + labels: + {{- range $key, $value := .Values.commonLabels }} + {{ $key: $value }} + {{- end }} + data: + plaintext: Zm9vYmFy + templated: '{{ print "foobar" | upper | b64enc }}' diff --git a/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml b/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml index 5b380725c461..99c2d258d16c 100644 --- a/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml +++ b/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml @@ -88,3 +88,22 @@ thanosRuler: - path: type: PathPrefix value: /foo/ + +extraObjects: + configmap: + apiVersion: v1 + kind: ConfigMap + metadata: + name: test-cm + data: + plaintext: foobar + templated: '{{ print "foobar" | upper }}' + secret: | + apiVersion: v1 + kind: Secret + type: Opaque + metadata: + name: test-secret + data: + plaintext: Zm9vYmFy + templated: '{{ print "foobar" | upper | b64enc }}' diff --git a/charts/kube-prometheus-stack/values.yaml b/charts/kube-prometheus-stack/values.yaml index 341bb7022faa..ae18f9d37d23 100644 --- a/charts/kube-prometheus-stack/values.yaml +++ b/charts/kube-prometheus-stack/values.yaml @@ -5311,3 +5311,18 @@ extraManifests: null # name: prometheus-extra # data: # extra-data: "value" + # + # can also be defined as a string, useful for templating field names + # - | + # apiVersion: v1 + # kind: Secret + # type: Opaque + # metadata: + # name: super-secret + # labels: + # {{- range $key, $value := .Values.commonLabels }} + # {{ $key: $value }} + # {{- end }} + # data: + # plaintext: Zm9vYmFy + # templated: '{{ print "foobar" | upper | b64enc }}' From 6784985439a51a8d1e7a2bda6f7fd669faa2f33b Mon Sep 17 00:00:00 2001 From: TheRealNoob Date: Tue, 25 Mar 2025 12:39:31 -0700 Subject: [PATCH 5/6] fix example Signed-off-by: TheRealNoob --- charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml | 2 +- charts/kube-prometheus-stack/values.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml b/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml index b6b51d23b977..c49849032746 100644 --- a/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml +++ b/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml @@ -114,7 +114,7 @@ extraObjects: name: test-secret labels: {{- range $key, $value := .Values.commonLabels }} - {{ $key: $value }} + {{ $key }}: {{ $value }} {{- end }} data: plaintext: Zm9vYmFy diff --git a/charts/kube-prometheus-stack/values.yaml b/charts/kube-prometheus-stack/values.yaml index ae18f9d37d23..d7a784a4450b 100644 --- a/charts/kube-prometheus-stack/values.yaml +++ b/charts/kube-prometheus-stack/values.yaml @@ -5321,7 +5321,7 @@ extraManifests: null # name: super-secret # labels: # {{- range $key, $value := .Values.commonLabels }} - # {{ $key: $value }} + # {{ $key }}: {{ $value }} # {{- end }} # data: # plaintext: Zm9vYmFy From e611e0d7509aab594c1545cd5f5a6dc5d39516d6 Mon Sep 17 00:00:00 2001 From: TheRealNoob Date: Thu, 27 Mar 2025 11:23:27 -0700 Subject: [PATCH 6/6] move tests to unittest Signed-off-by: TheRealNoob --- .../ci/03-non-defaults-values.yaml | 26 ---- .../05-ingress-and-gateway-routes-values.yaml | 19 --- .../unittests/extra-objects_test.yaml | 141 ++++++++++++++++++ 3 files changed, 141 insertions(+), 45 deletions(-) create mode 100644 charts/kube-prometheus-stack/unittests/extra-objects_test.yaml diff --git a/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml b/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml index c49849032746..dcfe23ef199f 100644 --- a/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml +++ b/charts/kube-prometheus-stack/ci/03-non-defaults-values.yaml @@ -1,9 +1,5 @@ # this file tests some non default values to increase the test coverage -commonLabels: - foo: one - bar: two - defaultRules: additionalRuleLabels: key: value @@ -97,25 +93,3 @@ nodeExporter: prometheus-node-exporter: kubeRBACProxy: enabled: true - -extraObjects: - - apiVersion: v1 - kind: ConfigMap - metadata: - name: test-cm - data: - plaintext: foobar - templated: '{{ print "foobar" | upper }}' - - | - apiVersion: v1 - kind: Secret - type: Opaque - metadata: - name: test-secret - labels: - {{- range $key, $value := .Values.commonLabels }} - {{ $key }}: {{ $value }} - {{- end }} - data: - plaintext: Zm9vYmFy - templated: '{{ print "foobar" | upper | b64enc }}' diff --git a/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml b/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml index 99c2d258d16c..5b380725c461 100644 --- a/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml +++ b/charts/kube-prometheus-stack/ci/05-ingress-and-gateway-routes-values.yaml @@ -88,22 +88,3 @@ thanosRuler: - path: type: PathPrefix value: /foo/ - -extraObjects: - configmap: - apiVersion: v1 - kind: ConfigMap - metadata: - name: test-cm - data: - plaintext: foobar - templated: '{{ print "foobar" | upper }}' - secret: | - apiVersion: v1 - kind: Secret - type: Opaque - metadata: - name: test-secret - data: - plaintext: Zm9vYmFy - templated: '{{ print "foobar" | upper | b64enc }}' diff --git a/charts/kube-prometheus-stack/unittests/extra-objects_test.yaml b/charts/kube-prometheus-stack/unittests/extra-objects_test.yaml new file mode 100644 index 000000000000..d8ba148ca31a --- /dev/null +++ b/charts/kube-prometheus-stack/unittests/extra-objects_test.yaml @@ -0,0 +1,141 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/helm-unittest/helm-unittest/main/schema/helm-testsuite.json +suite: test extraManifests +templates: + - extra-objects.yaml +tests: + - it: should handle empty manifests gracefully + set: + extraManifests: [] + asserts: + - hasDocuments: + count: 0 + + - it: should process a single string manifest + set: + extraManifests: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: test-cm + asserts: + - isKind: + of: ConfigMap + - equal: + path: metadata.name + value: test-cm + + - it: should process string manifest with tpl values + set: + name: myapp + extraManifests: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{ .Values.name }}-cm + asserts: + - equal: + path: metadata.name + value: myapp-cm + + - it: should process string manifest with tpl function + set: + name: MyApp + extraManifests: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{ lower .Values.name }}-cm + asserts: + - equal: + path: metadata.name + value: myapp-cm + + - it: should process a single map manifest + set: + extraManifests: + - apiVersion: v1 + kind: Secret + metadata: + name: test-secret + asserts: + - equal: + path: kind + value: Secret + - equal: + path: metadata.name + value: test-secret + + - it: should process map manifest with tpl values + set: + env: prod + extraManifests: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: config-{{ .Values.env }} + asserts: + - equal: + path: metadata.name + value: config-prod + + - it: should process multiple slice-based manifests with tpl + set: + version: v1 + extraManifests: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: cm-{{ .Values.version }} + - apiVersion: v1 + kind: Secret + metadata: + name: secret-{{ .Values.version }} + asserts: + - hasDocuments: + count: 2 + - equal: + path: metadata.name + value: cm-v1 + documentSelector: + path: kind + value: ConfigMap + - equal: + path: metadata.name + value: secret-v1 + documentSelector: + path: kind + value: Secret + + - it: should handle multiple map-based manifests with tpl + set: + app: myapp + extraManifests: + cm1: + apiVersion: v1 + kind: ConfigMap + metadata: + name: "{{ .Values.app }}-cm1" + secret1: + apiVersion: v1 + kind: Secret + metadata: + name: "{{ .Values.app }}-secret1" + asserts: + - hasDocuments: + count: 2 + - equal: + path: metadata.name + value: myapp-cm1 + documentSelector: + path: kind + value: ConfigMap + - equal: + path: metadata.name + value: myapp-secret1 + documentSelector: + path: kind + value: Secret