Search code examples
kubernetes-helm

Check if a key/value exists in helm chart yaml and add a value to it if exists, otherwise create a new key-pair value


Let's say that I have the following structure in one helm template file

{{- define "deployAnnotations" -}}  
"key1" : "value1",  
"key2" : "value2"  
"ip_range": "20.20.20.20/32"  
{{- end -}}  

and the above are included in the deployment.yaml file of my helm chart

  template:
    metadata:
      annotations: 
         {{ include "podAnnotations" . | nindent 8 }}

Now I want to add one more annotation that also define in a template file the following one:

{{- define "ipdeployAnnotations" -}}  
ip_range: 10.10.10.10/32  
{{- end -}}  

My question is how can I search if ip_range exists in the podAnnotations structure. If exists I just want to add the 10.10.10.10/32 to the existing line , otherwise I would like to create a new one.

I imagine something like below but in operator is not working for me , and also I do not know how to add the additional value to ip_range

template:    
    metadata:    
      annotations:     
         {{ include "podAnnotations" . | nindent 8 }}  
         {{ - if "ip_range" in "podAnnotations" }}  
         // do something in order to have the following result  
         "ip_range": "20.20.20.20/32", "10.10.10.10/32"
         {{- else }}
          {{ include "ipdeployAnnotations" . | nindent 8 }} 
         {{- end }}
       

Solution

  • You may convert it to a struct first, and then use it in the way of manipulating dictionary.

    templates/_helper.tpl

    {{- define "deployAnnotations" -}}
    "key1" : "value1"
    "key2" : "value2"
    "ip_range": "20.20.20.20/32"
    {{- end -}}
    
    {{- define "ipdeployAnnotations" -}}
    ip_range: "10.10.10.10/32"
    {{- end -}}
    

    templates/xxx.yaml

    ...
    {{- $da :=  (include "deployAnnotations" . | fromYaml) }}
    {{- $ida :=  (include "ipdeployAnnotations" . | fromYaml) }}
    {{- if (hasKey $da "ip_range") }}
    {{- $_ := set $da "ip_range" (printf "%s, %s" $da.ip_range $ida.ip_range) }}
    {{- else }}
    {{- $_ := set $da "ip_range" $ida.ip_range }}
    {{- end }}
    {{- range $k, $v := $da }}
    {{ $k }}: {{ $v }}
    {{- end }}
    ...
    

    output

    ip_range: 20.20.20.20/32, 10.10.10.10/32
    key1: value1
    key2: value2