Helm необязательные вложенные переменные - PullRequest
2 голосов
/ 18 января 2020

Как сделать необязательный блок в файле значений и затем обратиться к нему в шаблоне?

Например, скажем, у меня есть файл значений, который выглядит следующим образом:

# values.yaml
foo:
   bar: "something"

А затем у меня есть шаблон руля, который выглядит следующим образом:

{{ .Values.foo.bar }}
* 1008 Что делать, если я хочу сделать foo.bar в файле значений необязательным? Ошибка возникает, если ключ foo не существует в значениях.

Я попытался добавить условное условие if. Тем не менее, это все равно не работает, если отсутствует ключ foo:

{{ if .Values.foo.bar }}
{{ .Values.foo.bar }}
{{ end }}

Любые мысли очень ценятся.

Ответы [ 3 ]

4 голосов
/ 18 января 2020

Техника, которую я успешно использовал, состоит в том, чтобы использовать переменную для хранения значения внешнего блока, которая затем может использовать шаблонные конструкции, такие как default и Sprig's dict helper.

{{- $foo := .Values.foo | default dict -}}
Bar is {{ $foo.bar | default "not in the values file" }}

Это обеспечивает запасной словарь, если foo отсутствует в файле, поэтому $foo всегда определено, и вы можете посмотреть $foo.bar в нем.

2 голосов
/ 18 января 2020

В большинстве диаграмм родительский объект по умолчанию будет иметь пустую карту в values.yaml, поэтому он всегда существует.

foo: {}

Тогда {{ if .Values.foo.bar }} работает.

Если это невозможно, проверьте обе клавиши:

{{ if .Values.foo }}
{{ if .Values.foo.bar }}
{{ .Values.foo.bar }}
{{ end }}
{{ end }}

Использование функции and не работает в этот случай из-за and оценки всех параметров, даже если первым является фальси.

Существует также функция hasKey, включенная из sprig , если вам когда-либо понадобится проверить существование фальси или пустое значение:

{{ if hasKey .Values.foo "bar" }}
0 голосов
/ 08 марта 2020

Я искал ответ на этот же вопрос и ничего не мог найти. Кажется, вы должны использовать пользовательскую функцию, поэтому я написал одну. Вот что я придумал. Это работает для моих случаев использования, отзывы / улучшения приветствуются.

_helpers.tpl

{{- define "hasDeepKey" -}}
  {{- $mapToCheck := index . "mapToCheck" -}}
  {{- $keyToFind := index . "keyToFind" -}}
  {{- $keySet := (splitList "." $keyToFind) -}}
  {{- $firstKey := first $keySet -}}
  {{- if index $mapToCheck $firstKey -}}{{*/ The key was found */}}
    {{- if eq 1 (len $keySet) -}}{{*/ The final key in the set implies we're done */}}
true
    {{- else }}{{*/ More keys to check, recurse */}}
      {{- include "hasDeepKey" (dict "mapToCheck" (index $mapToCheck $firstKey) "keyToFind" (join "." (rest $keySet))) }}
    {{- end }}
  {{- else }}{{/* The key was not found */}}
false
  {{- end }}
{{- end }}

values.yaml:

    {{- if eq "true" (include "hasDeepKey" (dict "mapToCheck" .Values "keyToFind" "foo.bar")) }}
      bar: {{- .Values.foo.bar }}
    {{- end }}
...