Helm Coding Patterns#
Scopes#
Usuellement, un chemin de clés relatif est utilisé dans le code Helm.
# values.yaml
x:
y:
z: "hello"
{{ .Values.x.y.z }}
Mais il est possible de partir de la racine, définie par $. Le code suivant est équivalent :
{{ $.Values.x.y.z }}
Certaines instructions telles que with modifient le scope de référence.
{{- with .Values.x }}
{{ .y.z }}
Dictionnaire et valeurs#
Souvent, les fonctions Helm renvoient le contenu d'un champ. Il est parfois nécessaire de réétablir la clé principale, en particulier lors d'opérations de fusion sur des dictionnaires.
{{- dict "key" $values }}
Exemple:
# values.yaml
something:
skipthatfield: "ignore this"
foo: "bar"
voguesurlenil: "racuda"
{{- $someValues := omit .Values.something "skipthatfield" }}
# $someValues
foo: "bar"
voguesurlenil: "racuda"
{{- dict "something" $someValues | toYaml }}
# result
something:
foo: "bar"
voguesurlenil: "racuda"
Merge de dictionnaires#
{{- $_ := mergeOverwrite $dictToModify $newValues1 $newValues2 }}
Warning
Même si la fonction mergeOverwrite retourne explicitement un nouveau dictionnaire, $dictToModify est altéré par l'opération.
Il n'est pas possible d'omettre la capture du retour de la fonction, il est donc assigné à la variable $_. Dans le reste du code, seul $dictToModify est utilisé.
template vs include vs tpl#
# values.yaml
name: "jean-pierre"
what:
is:
going: "on?"
{{- define "mytemplate" }}
someYaml:
wahou: "awesome"
name: "{{ .Values.name | default "john" }}"
{{- end }}
La fonction template va effectuer le remplacement des instructions helm du code et faire le rendu de la ressource :
{{- template "mytemplate" }}
# result
someYaml:
wahou: "awesome"
name: "jean-pierre"
Cependant il est impossible :
- d'utiliser un scope partiel, autre que
$; - de capturer ce rendu et de travailler avec.
La fonction include répond à ce besoin :
{{- include "mytemplate" .Values.what }}
# result
someYaml:
wahou: "awesome"
name: "john"
La fonction tpl permet d'effectuer les mêmes remplacements, mais en travaillant à partir d'un bloc de texte et non d'un define :
# values.yaml
helmifythis:
someYaml:
wahou: "awesome"
name: "{{ .Values.name | default "john" }}"
{{- tpl .Values.helmifythis $ }}
# result
someYaml:
wahou: "awesome"
name: "jean-pierre"