From 6adfffe9c83f0772de4489e5787a5efac68c3d00 Mon Sep 17 00:00:00 2001 From: Artyom Babiy Date: Sat, 11 Jul 2026 15:36:16 +0300 Subject: [PATCH 1/5] kubernetes-ingress: add extraObjects templating Signed-off-by: Artyom Babiy --- kubernetes-ingress/Chart.yaml | 2 +- kubernetes-ingress/README.md | 7 ++++++ .../ci/extra-objects-configmap-values.yaml | 8 +++++++ kubernetes-ingress/templates/_helpers.tpl | 22 +++++++++++++++++++ .../templates/extra-objects.yaml | 4 ++++ kubernetes-ingress/values.yaml | 14 ++++++++++++ 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 kubernetes-ingress/ci/extra-objects-configmap-values.yaml create mode 100644 kubernetes-ingress/templates/extra-objects.yaml diff --git a/kubernetes-ingress/Chart.yaml b/kubernetes-ingress/Chart.yaml index a38cfa2..4e17382 100644 --- a/kubernetes-ingress/Chart.yaml +++ b/kubernetes-ingress/Chart.yaml @@ -16,7 +16,7 @@ apiVersion: v2 name: kubernetes-ingress description: A Helm chart for HAProxy Kubernetes Ingress Controller type: application -version: 1.52.1 +version: 1.53.0 appVersion: 3.2.12 kubeVersion: ">=1.23.0-0" keywords: diff --git a/kubernetes-ingress/README.md b/kubernetes-ingress/README.md index 8a603cb..12f380c 100644 --- a/kubernetes-ingress/README.md +++ b/kubernetes-ingress/README.md @@ -512,6 +512,13 @@ A Helm `post-install` / `pre-upgrade` hook Job that applies the controller's CRD | `crdjob.nodeSelector` / `.tolerations` / `.affinity` | Scheduling controls for the Job pod. | `{}` / `[]` / `{}` | | `crdjob.resources.requests` / `.limits` | CPU/memory requests and (optional) limits for the Job container. | `cpu: 250m`, `memory: 400Mi` (no limits) | +### Extra Objects + +Declare additional arbitrary raw CR manifests to deploy as a part of the helm release. + +|---|---|---| +| `extraObjects` | Extra raw objects to template | `[]` | + ### Migration notes (1.50.0) - **Prometheus / pprof decoupled from `admin` port.** Previously, setting `controller.service.enablePorts.admin=false` implicitly disabled the controller's `/metrics` and `/debug/pprof` endpoints. Starting in 1.50.0, the dedicated toggles `controller.prometheus.enabled` and `controller.pprof.enabled` control these (both default `true`). If you were relying on the old coupling, set the new toggles to `false` explicitly. diff --git a/kubernetes-ingress/ci/extra-objects-configmap-values.yaml b/kubernetes-ingress/ci/extra-objects-configmap-values.yaml new file mode 100644 index 0000000..fc79ddc --- /dev/null +++ b/kubernetes-ingress/ci/extra-objects-configmap-values.yaml @@ -0,0 +1,8 @@ +extraObjects: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: "{{ .Release.Name }}-extra-conf" + data: + extra.conf: | + example config diff --git a/kubernetes-ingress/templates/_helpers.tpl b/kubernetes-ingress/templates/_helpers.tpl index b18a842..9e526ef 100644 --- a/kubernetes-ingress/templates/_helpers.tpl +++ b/kubernetes-ingress/templates/_helpers.tpl @@ -260,4 +260,26 @@ Create a name for the auxiliary configmap. {{- printf "%s-%s" (include "kubernetes-ingress.fullname" . | trunc 54 | trimSuffix "-") "auxiliary" }} {{- end -}} +{{/* +Create extra raw objects labels +*/}} +{{- define "kubernetes-ingress.extraRawLabels" -}} +metadata: + labels: + {{- include "kubernetes-ingress.labels" $ | nindent 4 }} +{{- end }} + +{{/* +Render extra raw objects that might contain templates +*/}} +{{- define "kubernetes-ingress.renderExtraObjects" -}} + {{- $labels := fromYaml (include "kubernetes-ingress.extraRawLabels" .context) -}} + {{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} + {{- if contains "{{" (toString $value) }} + {{- toYaml (merge (fromYaml (tpl $value .context)) $labels) }} + {{- else }} + {{- toYaml (merge $value $labels) }} + {{- end }} +{{- end -}} + {{/* vim: set filetype=mustache: */}} diff --git a/kubernetes-ingress/templates/extra-objects.yaml b/kubernetes-ingress/templates/extra-objects.yaml new file mode 100644 index 0000000..f0cc828 --- /dev/null +++ b/kubernetes-ingress/templates/extra-objects.yaml @@ -0,0 +1,4 @@ +{{- range .Values.extraObjects }} +--- +{{- include "kubernetes-ingress.renderExtraObjects" (dict "value" . "context" $) }} +{{- end }} diff --git a/kubernetes-ingress/values.yaml b/kubernetes-ingress/values.yaml index 531463f..8bbf088 100644 --- a/kubernetes-ingress/values.yaml +++ b/kubernetes-ingress/values.yaml @@ -735,3 +735,17 @@ crdjob: requests: cpu: 250m memory: 400Mi + +## Extra raw objects to template +## Note: this manifest is not capability-gated; if specific CRDs are +## missing, helm install will fail; this being said, this manifest +## is not intended to be used to deploy ingress.v3.haproxy.org/v3 CRs +## since their CRDs are installed/upgraded via a post-install/pre-upgrade job +extraObjects: [] + # - apiVersion: v1 + # kind: ConfigMap + # metadata: + # name: "{{ .Release.Name }}-extra-conf" + # data: + # extra.conf: | + # example config From 5b3932b9d5aa2c523846dca8d9dca428b61e92b7 Mon Sep 17 00:00:00 2001 From: Artyom Babiy Date: Wed, 15 Jul 2026 15:04:29 +0300 Subject: [PATCH 2/5] Address pr review notes --- kubernetes-ingress/README.md | 3 ++- kubernetes-ingress/templates/_helpers.tpl | 5 ++--- kubernetes-ingress/templates/extra-objects.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kubernetes-ingress/README.md b/kubernetes-ingress/README.md index 12f380c..d7d63dc 100644 --- a/kubernetes-ingress/README.md +++ b/kubernetes-ingress/README.md @@ -516,8 +516,9 @@ A Helm `post-install` / `pre-upgrade` hook Job that applies the controller's CRD Declare additional arbitrary raw CR manifests to deploy as a part of the helm release. +| Key | Description | Default | |---|---|---| -| `extraObjects` | Extra raw objects to template | `[]` | +| `extraObjects` | Extra raw objects to template. | `[]` | ### Migration notes (1.50.0) diff --git a/kubernetes-ingress/templates/_helpers.tpl b/kubernetes-ingress/templates/_helpers.tpl index 9e526ef..67760b8 100644 --- a/kubernetes-ingress/templates/_helpers.tpl +++ b/kubernetes-ingress/templates/_helpers.tpl @@ -276,10 +276,9 @@ Render extra raw objects that might contain templates {{- $labels := fromYaml (include "kubernetes-ingress.extraRawLabels" .context) -}} {{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} {{- if contains "{{" (toString $value) }} - {{- toYaml (merge (fromYaml (tpl $value .context)) $labels) }} - {{- else }} - {{- toYaml (merge $value $labels) }} + {{- $value = tpl $value .context }} {{- end }} + {{- toYaml (merge (fromYaml $value) $labels) }} {{- end -}} {{/* vim: set filetype=mustache: */}} diff --git a/kubernetes-ingress/templates/extra-objects.yaml b/kubernetes-ingress/templates/extra-objects.yaml index f0cc828..c2ab532 100644 --- a/kubernetes-ingress/templates/extra-objects.yaml +++ b/kubernetes-ingress/templates/extra-objects.yaml @@ -1,4 +1,4 @@ {{- range .Values.extraObjects }} --- -{{- include "kubernetes-ingress.renderExtraObjects" (dict "value" . "context" $) }} +{{ include "kubernetes-ingress.renderExtraObjects" (dict "value" . "context" $) }} {{- end }} From fe59f4aff15e677368b66b026cebfc338feb2df7 Mon Sep 17 00:00:00 2001 From: Artyom Babiy Date: Wed, 22 Jul 2026 12:02:38 +0300 Subject: [PATCH 3/5] Try another extra objects approach --- kubernetes-ingress/README.md | 5 +- .../ci/deployment-extraobjects-values.yaml | 17 +++++++ .../ci/extra-objects-configmap-values.yaml | 8 --- kubernetes-ingress/templates/_helpers.tpl | 50 +++++++++++++++---- .../templates/extra-objects.yaml | 15 +++++- kubernetes-ingress/values.yaml | 21 ++++++-- 6 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 kubernetes-ingress/ci/deployment-extraobjects-values.yaml delete mode 100644 kubernetes-ingress/ci/extra-objects-configmap-values.yaml diff --git a/kubernetes-ingress/README.md b/kubernetes-ingress/README.md index d7d63dc..936d42f 100644 --- a/kubernetes-ingress/README.md +++ b/kubernetes-ingress/README.md @@ -514,11 +514,12 @@ A Helm `post-install` / `pre-upgrade` hook Job that applies the controller's CRD ### Extra Objects -Declare additional arbitrary raw CR manifests to deploy as a part of the helm release. +Declare additional CRs to deploy as a part of the helm release. | Key | Description | Default | |---|---|---| -| `extraObjects` | Extra raw objects to template. | `[]` | +| `extraManifests` | Extra arbitrary raw objects. | `[]` | +| `extraTemplates` | Extra arbitrary templated objects. | `[]` | ### Migration notes (1.50.0) diff --git a/kubernetes-ingress/ci/deployment-extraobjects-values.yaml b/kubernetes-ingress/ci/deployment-extraobjects-values.yaml new file mode 100644 index 0000000..f097619 --- /dev/null +++ b/kubernetes-ingress/ci/deployment-extraobjects-values.yaml @@ -0,0 +1,17 @@ +extraManifests: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: example-extra-conf-1 + data: + extra.conf: | + example config +extraTemplates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{ .Release.Name }}-extra-conf-2 + data: + extra.conf: | + example config diff --git a/kubernetes-ingress/ci/extra-objects-configmap-values.yaml b/kubernetes-ingress/ci/extra-objects-configmap-values.yaml deleted file mode 100644 index fc79ddc..0000000 --- a/kubernetes-ingress/ci/extra-objects-configmap-values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -extraObjects: - - apiVersion: v1 - kind: ConfigMap - metadata: - name: "{{ .Release.Name }}-extra-conf" - data: - extra.conf: | - example config diff --git a/kubernetes-ingress/templates/_helpers.tpl b/kubernetes-ingress/templates/_helpers.tpl index 67760b8..a1a1d3a 100644 --- a/kubernetes-ingress/templates/_helpers.tpl +++ b/kubernetes-ingress/templates/_helpers.tpl @@ -261,24 +261,54 @@ Create a name for the auxiliary configmap. {{- end -}} {{/* -Create extra raw objects labels +Create an extra object base with labels. */}} -{{- define "kubernetes-ingress.extraRawLabels" -}} +{{- define "kubernetes-ingress.extraObjectLabels" -}} metadata: labels: {{- include "kubernetes-ingress.labels" $ | nindent 4 }} {{- end }} {{/* -Render extra raw objects that might contain templates +Ensure an extra object is a Kubernetes CR. +It must be a map with at least apiVersion, kind, metadata.name, spec or data keys. */}} -{{- define "kubernetes-ingress.renderExtraObjects" -}} - {{- $labels := fromYaml (include "kubernetes-ingress.extraRawLabels" .context) -}} - {{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} - {{- if contains "{{" (toString $value) }} - {{- $value = tpl $value .context }} - {{- end }} - {{- toYaml (merge (fromYaml $value) $labels) }} +{{- define "kubernetes-ingress.validateExtraObject" -}} +{{- $obj := . -}} +{{- $tplName := "kubernetes-ingress.validateExtraObject" -}} +{{- if not (kindIs "map" $obj) -}} +{{- fail (printf "%s: expected a map, got %s" $tplName (kindOf $obj)) -}} {{- end -}} +{{- if not (hasKey $obj "apiVersion") -}} +{{- fail (printf "%s: object is missing required key 'apiVersion'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "string" $obj.apiVersion) -}} +{{- fail (printf "%s: 'apiVersion' must be a string, got %s" $tplName (kindOf $obj.apiVersion)) -}} +{{- end -}} +{{- $_ := required (printf "%s: 'apiVersion' must not be empty" $tplName) $obj.apiVersion -}} +{{- if not (hasKey $obj "kind") -}} +{{- fail (printf "%s: object is missing required key 'kind'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "string" $obj.kind) -}} +{{- fail (printf "%s: 'kind' must be a string, got %s" $tplName (kindOf $obj.kind)) -}} +{{- end -}} +{{- $_ := required (printf "%s: 'kind' must not be empty" $tplName) $obj.kind -}} +{{- if not (hasKey $obj "metadata") -}} +{{- fail (printf "%s: object is missing required key 'metadata'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "map" $obj.metadata) -}} +{{- fail (printf "%s: 'metadata' must be a map, got %s" $tplName (kindOf $obj.metadata)) -}} +{{- end -}} +{{- if not (hasKey $obj.metadata "name") -}} +{{- fail (printf "%s: object is missing required key 'metadata.name'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "string" $obj.metadata.name) -}} +{{- fail (printf "%s: 'metadata.name' must be a string, got %s" $tplName (kindOf $obj.metadata.name)) -}} +{{- end -}} +{{- $_ := required (printf "%s: 'metadata.name' must not be empty" $tplName) $obj.metadata.name -}} +{{- if not (or (hasKey $obj "spec") (hasKey $obj "data")) -}} +{{- fail (printf "%s: object must have either 'spec' or 'data' key" $tplName) -}} +{{- end -}} +{{- end }} {{/* vim: set filetype=mustache: */}} diff --git a/kubernetes-ingress/templates/extra-objects.yaml b/kubernetes-ingress/templates/extra-objects.yaml index c2ab532..600b696 100644 --- a/kubernetes-ingress/templates/extra-objects.yaml +++ b/kubernetes-ingress/templates/extra-objects.yaml @@ -1,4 +1,15 @@ -{{- range .Values.extraObjects }} +{{- if or .Values.extraManifests .Values.extraTemplates }} +{{- $objBase := fromYaml (include "kubernetes-ingress.extraObjectLabels" .) -}} +{{- range .Values.extraManifests }} +{{- $obj := . -}} +{{- include "kubernetes-ingress.validateExtraObject" $obj }} --- -{{ include "kubernetes-ingress.renderExtraObjects" (dict "value" . "context" $) }} +{{ toYaml (merge $obj $objBase) }} +{{- end }} +{{- range .Values.extraTemplates }} +{{- $obj := fromYaml (tpl . $) -}} +{{- include "kubernetes-ingress.validateExtraObject" $obj }} +--- +{{ toYaml (merge $obj $objBase) }} +{{- end }} {{- end }} diff --git a/kubernetes-ingress/values.yaml b/kubernetes-ingress/values.yaml index 8bbf088..630cff0 100644 --- a/kubernetes-ingress/values.yaml +++ b/kubernetes-ingress/values.yaml @@ -736,16 +736,31 @@ crdjob: cpu: 250m memory: 400Mi -## Extra raw objects to template +## Extra arbitrary raw objects ## Note: this manifest is not capability-gated; if specific CRDs are ## missing, helm install will fail; this being said, this manifest ## is not intended to be used to deploy ingress.v3.haproxy.org/v3 CRs ## since their CRDs are installed/upgraded via a post-install/pre-upgrade job -extraObjects: [] +extraManifests: [] # - apiVersion: v1 # kind: ConfigMap # metadata: - # name: "{{ .Release.Name }}-extra-conf" + # name: example-extra-conf + # data: + # extra.conf: | + # example config + +## Extra arbitrary templated objects +## Note: this manifest is not capability-gated; if specific CRDs are +## missing, helm install will fail; this being said, this manifest +## is not intended to be used to deploy ingress.v3.haproxy.org/v3 CRs +## since their CRDs are installed/upgraded via a post-install/pre-upgrade job +extraTemplates: [] + # - | + # apiVersion: v1 + # kind: ConfigMap + # metadata: + # name: {{ .Release.Name }}-extra-conf # data: # extra.conf: | # example config From e0f085defd56e274391772c46e23e4ac9051bdfc Mon Sep 17 00:00:00 2001 From: Artyom Babiy Date: Wed, 22 Jul 2026 12:16:19 +0300 Subject: [PATCH 4/5] Revert "Try another extra objects approach" This reverts commit fe59f4aff15e677368b66b026cebfc338feb2df7. --- kubernetes-ingress/README.md | 5 +- .../ci/deployment-extraobjects-values.yaml | 17 ------- .../ci/extra-objects-configmap-values.yaml | 8 +++ kubernetes-ingress/templates/_helpers.tpl | 50 ++++--------------- .../templates/extra-objects.yaml | 15 +----- kubernetes-ingress/values.yaml | 21 ++------ 6 files changed, 25 insertions(+), 91 deletions(-) delete mode 100644 kubernetes-ingress/ci/deployment-extraobjects-values.yaml create mode 100644 kubernetes-ingress/ci/extra-objects-configmap-values.yaml diff --git a/kubernetes-ingress/README.md b/kubernetes-ingress/README.md index 936d42f..d7d63dc 100644 --- a/kubernetes-ingress/README.md +++ b/kubernetes-ingress/README.md @@ -514,12 +514,11 @@ A Helm `post-install` / `pre-upgrade` hook Job that applies the controller's CRD ### Extra Objects -Declare additional CRs to deploy as a part of the helm release. +Declare additional arbitrary raw CR manifests to deploy as a part of the helm release. | Key | Description | Default | |---|---|---| -| `extraManifests` | Extra arbitrary raw objects. | `[]` | -| `extraTemplates` | Extra arbitrary templated objects. | `[]` | +| `extraObjects` | Extra raw objects to template. | `[]` | ### Migration notes (1.50.0) diff --git a/kubernetes-ingress/ci/deployment-extraobjects-values.yaml b/kubernetes-ingress/ci/deployment-extraobjects-values.yaml deleted file mode 100644 index f097619..0000000 --- a/kubernetes-ingress/ci/deployment-extraobjects-values.yaml +++ /dev/null @@ -1,17 +0,0 @@ -extraManifests: - - apiVersion: v1 - kind: ConfigMap - metadata: - name: example-extra-conf-1 - data: - extra.conf: | - example config -extraTemplates: - - | - apiVersion: v1 - kind: ConfigMap - metadata: - name: {{ .Release.Name }}-extra-conf-2 - data: - extra.conf: | - example config diff --git a/kubernetes-ingress/ci/extra-objects-configmap-values.yaml b/kubernetes-ingress/ci/extra-objects-configmap-values.yaml new file mode 100644 index 0000000..fc79ddc --- /dev/null +++ b/kubernetes-ingress/ci/extra-objects-configmap-values.yaml @@ -0,0 +1,8 @@ +extraObjects: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: "{{ .Release.Name }}-extra-conf" + data: + extra.conf: | + example config diff --git a/kubernetes-ingress/templates/_helpers.tpl b/kubernetes-ingress/templates/_helpers.tpl index a1a1d3a..67760b8 100644 --- a/kubernetes-ingress/templates/_helpers.tpl +++ b/kubernetes-ingress/templates/_helpers.tpl @@ -261,54 +261,24 @@ Create a name for the auxiliary configmap. {{- end -}} {{/* -Create an extra object base with labels. +Create extra raw objects labels */}} -{{- define "kubernetes-ingress.extraObjectLabels" -}} +{{- define "kubernetes-ingress.extraRawLabels" -}} metadata: labels: {{- include "kubernetes-ingress.labels" $ | nindent 4 }} {{- end }} {{/* -Ensure an extra object is a Kubernetes CR. -It must be a map with at least apiVersion, kind, metadata.name, spec or data keys. +Render extra raw objects that might contain templates */}} -{{- define "kubernetes-ingress.validateExtraObject" -}} -{{- $obj := . -}} -{{- $tplName := "kubernetes-ingress.validateExtraObject" -}} -{{- if not (kindIs "map" $obj) -}} -{{- fail (printf "%s: expected a map, got %s" $tplName (kindOf $obj)) -}} +{{- define "kubernetes-ingress.renderExtraObjects" -}} + {{- $labels := fromYaml (include "kubernetes-ingress.extraRawLabels" .context) -}} + {{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} + {{- if contains "{{" (toString $value) }} + {{- $value = tpl $value .context }} + {{- end }} + {{- toYaml (merge (fromYaml $value) $labels) }} {{- end -}} -{{- if not (hasKey $obj "apiVersion") -}} -{{- fail (printf "%s: object is missing required key 'apiVersion'" $tplName) -}} -{{- end -}} -{{- if not (kindIs "string" $obj.apiVersion) -}} -{{- fail (printf "%s: 'apiVersion' must be a string, got %s" $tplName (kindOf $obj.apiVersion)) -}} -{{- end -}} -{{- $_ := required (printf "%s: 'apiVersion' must not be empty" $tplName) $obj.apiVersion -}} -{{- if not (hasKey $obj "kind") -}} -{{- fail (printf "%s: object is missing required key 'kind'" $tplName) -}} -{{- end -}} -{{- if not (kindIs "string" $obj.kind) -}} -{{- fail (printf "%s: 'kind' must be a string, got %s" $tplName (kindOf $obj.kind)) -}} -{{- end -}} -{{- $_ := required (printf "%s: 'kind' must not be empty" $tplName) $obj.kind -}} -{{- if not (hasKey $obj "metadata") -}} -{{- fail (printf "%s: object is missing required key 'metadata'" $tplName) -}} -{{- end -}} -{{- if not (kindIs "map" $obj.metadata) -}} -{{- fail (printf "%s: 'metadata' must be a map, got %s" $tplName (kindOf $obj.metadata)) -}} -{{- end -}} -{{- if not (hasKey $obj.metadata "name") -}} -{{- fail (printf "%s: object is missing required key 'metadata.name'" $tplName) -}} -{{- end -}} -{{- if not (kindIs "string" $obj.metadata.name) -}} -{{- fail (printf "%s: 'metadata.name' must be a string, got %s" $tplName (kindOf $obj.metadata.name)) -}} -{{- end -}} -{{- $_ := required (printf "%s: 'metadata.name' must not be empty" $tplName) $obj.metadata.name -}} -{{- if not (or (hasKey $obj "spec") (hasKey $obj "data")) -}} -{{- fail (printf "%s: object must have either 'spec' or 'data' key" $tplName) -}} -{{- end -}} -{{- end }} {{/* vim: set filetype=mustache: */}} diff --git a/kubernetes-ingress/templates/extra-objects.yaml b/kubernetes-ingress/templates/extra-objects.yaml index 600b696..c2ab532 100644 --- a/kubernetes-ingress/templates/extra-objects.yaml +++ b/kubernetes-ingress/templates/extra-objects.yaml @@ -1,15 +1,4 @@ -{{- if or .Values.extraManifests .Values.extraTemplates }} -{{- $objBase := fromYaml (include "kubernetes-ingress.extraObjectLabels" .) -}} -{{- range .Values.extraManifests }} -{{- $obj := . -}} -{{- include "kubernetes-ingress.validateExtraObject" $obj }} +{{- range .Values.extraObjects }} --- -{{ toYaml (merge $obj $objBase) }} -{{- end }} -{{- range .Values.extraTemplates }} -{{- $obj := fromYaml (tpl . $) -}} -{{- include "kubernetes-ingress.validateExtraObject" $obj }} ---- -{{ toYaml (merge $obj $objBase) }} -{{- end }} +{{ include "kubernetes-ingress.renderExtraObjects" (dict "value" . "context" $) }} {{- end }} diff --git a/kubernetes-ingress/values.yaml b/kubernetes-ingress/values.yaml index 630cff0..8bbf088 100644 --- a/kubernetes-ingress/values.yaml +++ b/kubernetes-ingress/values.yaml @@ -736,31 +736,16 @@ crdjob: cpu: 250m memory: 400Mi -## Extra arbitrary raw objects +## Extra raw objects to template ## Note: this manifest is not capability-gated; if specific CRDs are ## missing, helm install will fail; this being said, this manifest ## is not intended to be used to deploy ingress.v3.haproxy.org/v3 CRs ## since their CRDs are installed/upgraded via a post-install/pre-upgrade job -extraManifests: [] +extraObjects: [] # - apiVersion: v1 # kind: ConfigMap # metadata: - # name: example-extra-conf - # data: - # extra.conf: | - # example config - -## Extra arbitrary templated objects -## Note: this manifest is not capability-gated; if specific CRDs are -## missing, helm install will fail; this being said, this manifest -## is not intended to be used to deploy ingress.v3.haproxy.org/v3 CRs -## since their CRDs are installed/upgraded via a post-install/pre-upgrade job -extraTemplates: [] - # - | - # apiVersion: v1 - # kind: ConfigMap - # metadata: - # name: {{ .Release.Name }}-extra-conf + # name: "{{ .Release.Name }}-extra-conf" # data: # extra.conf: | # example config From 001890e0568651ebd5b6ab8bbf675b518786dfa8 Mon Sep 17 00:00:00 2001 From: Artyom Babiy Date: Wed, 22 Jul 2026 12:34:42 +0300 Subject: [PATCH 5/5] Combine two approaches --- .../ci/deployment-extraobjects-values.yaml | 16 +++++ .../ci/extra-objects-configmap-values.yaml | 8 --- kubernetes-ingress/templates/_helpers.tpl | 65 ++++++++++++++++--- .../templates/extra-objects.yaml | 2 +- kubernetes-ingress/values.yaml | 14 +++- 5 files changed, 85 insertions(+), 20 deletions(-) create mode 100644 kubernetes-ingress/ci/deployment-extraobjects-values.yaml delete mode 100644 kubernetes-ingress/ci/extra-objects-configmap-values.yaml diff --git a/kubernetes-ingress/ci/deployment-extraobjects-values.yaml b/kubernetes-ingress/ci/deployment-extraobjects-values.yaml new file mode 100644 index 0000000..6e86bad --- /dev/null +++ b/kubernetes-ingress/ci/deployment-extraobjects-values.yaml @@ -0,0 +1,16 @@ +extraObjects: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: extra-conf-1 + data: + extra.conf: | + example_config_1 + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{ .Release.Name }}-extra-conf-2 + data: + extra.conf: | + example_config_2 diff --git a/kubernetes-ingress/ci/extra-objects-configmap-values.yaml b/kubernetes-ingress/ci/extra-objects-configmap-values.yaml deleted file mode 100644 index fc79ddc..0000000 --- a/kubernetes-ingress/ci/extra-objects-configmap-values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -extraObjects: - - apiVersion: v1 - kind: ConfigMap - metadata: - name: "{{ .Release.Name }}-extra-conf" - data: - extra.conf: | - example config diff --git a/kubernetes-ingress/templates/_helpers.tpl b/kubernetes-ingress/templates/_helpers.tpl index 67760b8..578727d 100644 --- a/kubernetes-ingress/templates/_helpers.tpl +++ b/kubernetes-ingress/templates/_helpers.tpl @@ -261,7 +261,7 @@ Create a name for the auxiliary configmap. {{- end -}} {{/* -Create extra raw objects labels +Create extra raw objects labels. */}} {{- define "kubernetes-ingress.extraRawLabels" -}} metadata: @@ -270,15 +270,62 @@ metadata: {{- end }} {{/* -Render extra raw objects that might contain templates +Ensure an extra object is a Kubernetes CR. +It must be a map with at least apiVersion, kind, metadata.name, spec or data keys. */}} -{{- define "kubernetes-ingress.renderExtraObjects" -}} - {{- $labels := fromYaml (include "kubernetes-ingress.extraRawLabels" .context) -}} - {{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} - {{- if contains "{{" (toString $value) }} - {{- $value = tpl $value .context }} - {{- end }} - {{- toYaml (merge (fromYaml $value) $labels) }} +{{- define "kubernetes-ingress.validateExtraObject" -}} +{{- $obj := . -}} +{{- $tplName := "kubernetes-ingress.validateExtraObject" -}} +{{- if not (kindIs "map" $obj) -}} +{{- fail (printf "%s: expected a map, got %s" $tplName (kindOf $obj)) -}} +{{- end -}} +{{- if not (hasKey $obj "apiVersion") -}} +{{- fail (printf "%s: object is missing required key 'apiVersion'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "string" $obj.apiVersion) -}} +{{- fail (printf "%s: 'apiVersion' must be a string, got %s" $tplName (kindOf $obj.apiVersion)) -}} +{{- end -}} +{{- $_ := required (printf "%s: 'apiVersion' must not be empty" $tplName) $obj.apiVersion -}} +{{- if not (hasKey $obj "kind") -}} +{{- fail (printf "%s: object is missing required key 'kind'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "string" $obj.kind) -}} +{{- fail (printf "%s: 'kind' must be a string, got %s" $tplName (kindOf $obj.kind)) -}} +{{- end -}} +{{- $_ := required (printf "%s: 'kind' must not be empty" $tplName) $obj.kind -}} +{{- if not (hasKey $obj "metadata") -}} +{{- fail (printf "%s: object is missing required key 'metadata'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "map" $obj.metadata) -}} +{{- fail (printf "%s: 'metadata' must be a map, got %s" $tplName (kindOf $obj.metadata)) -}} +{{- end -}} +{{- if not (hasKey $obj.metadata "name") -}} +{{- fail (printf "%s: object is missing required key 'metadata.name'" $tplName) -}} +{{- end -}} +{{- if not (kindIs "string" $obj.metadata.name) -}} +{{- fail (printf "%s: 'metadata.name' must be a string, got %s" $tplName (kindOf $obj.metadata.name)) -}} +{{- end -}} +{{- $_ := required (printf "%s: 'metadata.name' must not be empty" $tplName) $obj.metadata.name -}} +{{- if not (or (hasKey $obj "spec") (hasKey $obj "data")) -}} +{{- fail (printf "%s: object must have either 'spec' or 'data' key" $tplName) -}} +{{- end -}} +{{- end }} + +{{/* +Render an extra object that might contain templates. +*/}} +{{- define "kubernetes-ingress.renderExtraObject" -}} +{{- $labels := fromYaml (include "kubernetes-ingress.extraRawLabels" .context) -}} +{{- if typeIs "string" .value }} + {{- /* string form is an explicit opt-in to templating */ -}} + {{- $templatedValue := fromYaml (tpl .value .context) -}} + {{- include "kubernetes-ingress.validateExtraObject" $templatedValue }} + {{- toYaml (merge $templatedValue $labels) }} +{{- else }} + {{- /* map form is emitted verbatim; foreign {{ }} left untouched */ -}} + {{- include "kubernetes-ingress.validateExtraObject" .value }} + {{- toYaml (merge (deepCopy .value) $labels) }} +{{- end }} {{- end -}} {{/* vim: set filetype=mustache: */}} diff --git a/kubernetes-ingress/templates/extra-objects.yaml b/kubernetes-ingress/templates/extra-objects.yaml index c2ab532..343940f 100644 --- a/kubernetes-ingress/templates/extra-objects.yaml +++ b/kubernetes-ingress/templates/extra-objects.yaml @@ -1,4 +1,4 @@ {{- range .Values.extraObjects }} --- -{{ include "kubernetes-ingress.renderExtraObjects" (dict "value" . "context" $) }} +{{ include "kubernetes-ingress.renderExtraObject" (dict "value" . "context" $) }} {{- end }} diff --git a/kubernetes-ingress/values.yaml b/kubernetes-ingress/values.yaml index 8bbf088..57db135 100644 --- a/kubernetes-ingress/values.yaml +++ b/kubernetes-ingress/values.yaml @@ -742,10 +742,20 @@ crdjob: ## is not intended to be used to deploy ingress.v3.haproxy.org/v3 CRs ## since their CRDs are installed/upgraded via a post-install/pre-upgrade job extraObjects: [] + ## Use maps to declare raw manifests # - apiVersion: v1 # kind: ConfigMap # metadata: - # name: "{{ .Release.Name }}-extra-conf" + # name: extra-conf-1 # data: # extra.conf: | - # example config + # example_config_1 + ## Use multiline strings to declare templated manifests + # - | + # apiVersion: v1 + # kind: ConfigMap + # metadata: + # name: {{ .Release.Name }}-extra-conf-2 + # data: + # extra.conf: | + # example_config_2