Aller au contenu

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 :

  1. d'utiliser un scope partiel, autre que $;
  2. 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"