kuberneteskubernetes-helmconfigmap

Re-using UUID in helm configmap


There's a similar question that alludes to the possibility of auto-generating a uuid in helm charts when used as a secret or configmap. I'm trying precisely to do that, but I'm getting a new uuid each time.

My test case:

---
{{- $config := (lookup "v1" "ConfigMap" .Release.Namespace "{{ .Release.Name }}-testcase") -}}
apiVersion: v1
kind: ConfigMap
metadata:
  name: "{{ .Release.Name }}-testcase"
  namespace: "{{ .Release.Namespace }}"
  labels:
    app.kubernetes.io/managed-by: "{{ .Release.Service }}"
    app.kubernetes.io/instance: "{{ .Release.Name }}"
    app.kubernetes.io/version: "{{ .Chart.AppVersion }}"
    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
data:
{{- if $config }}
  TEST_VALUE: {{ $config.data.TEST_VALUE | quote }}
{{- else }}
  TEST_VALUE: {{ uuidv4 | quote }}
{{ end }}

I initially deploy this with:

helm upgrade --install --namespace test mytest .

If I run it again, or run with helm diff upgrade --namespace test mytest . I get a new value for TEST_VALUE. When I dump the contents of $config it's an empty map {}.

I'm using Helm v3.9.0, kubectl 1.24, and kube server is 1.22.

NOTE: I couldn't ask in a comment thread on the other post because I don't have enough reputation.


Solution

  • Referring to my issue where you enclosed your stack overflow post : https://github.com/helm/helm/issues/11187

    A way to make your configmap work is to save as a variable before conditionally set your value. This means every time you upgrade, you'll generate a UUID which will normally will not be used, but this is not dramatic.

    When assigning an existing value, := should become =. Also don't forget to b64enc your value in your manifest

    {{- $config := uuidv4 | b64enc | quote -}}
    {{- $config_lookup := (lookup "v1" "ConfigMap" .Release.Namespace "{{ .Release.Name }}-testcase") -}}
    {{- if $config_lookup -}}
    {{- $config = $config_lookup.data.TEST_VALUE -}}
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: "{{ .Release.Name }}-testcase"
      namespace: "{{ .Release.Namespace }}"
      labels:
        app.kubernetes.io/managed-by: "{{ .Release.Service }}"
        app.kubernetes.io/instance: "{{ .Release.Name }}"
        app.kubernetes.io/version: "{{ .Chart.AppVersion }}"
        helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    data:
      TEST_VALUE: {{ $config | quote }}