Шлем слиться и диктовать директивы? - PullRequest
0 голосов
/ 10 апреля 2020

Я на одном из примеров диаграммы Хелма встречаю следующие строки:

{{- define "common.deployment" -}}
{{- $common := dict "Values" .Values.common -}} 
{{- $noCommon := omit .Values "common" -}} 
{{- $overrides := dict "Values" $noCommon -}} 
{{- $noValues := omit . "Values" -}} 
{{- with merge $noValues $overrides $common -}}

Но я не могу найти в документации руля информацию о директивах omit, merge и dict.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Они являются частью библиотеки шаблонов под названием Sprig , а точнее, ее функций для работы с словарями .

Используя подобные конструкции, можно запускать шаблоны с тем, что выглядит как объекты альтернативных значений, конструируя их из других частей исходных значений. В вашем примере, скажем, следующая строка (внутри {{ with }}...{{ end }}) блока была просто {{ toYaml .Values }}. Если исходный файл values.yaml содержит что-то вроде

common:
  a: "one"
  b: "two"
a: "three"
c: "four"

, то код, который вы показываете, фактически «продвигает» общий контент на верхний уровень, но при этом фактические значения верхнего уровня переопределяют его, и вы будете get out

a: "three"
b: "two"
c: "four"

($common - словарь, содержащий содержимое .Values.common, под ключом "Values" верхнего уровня. $noCommon - словарь, содержащий все .Values, кроме Клавиша common, все еще находящаяся под "Values", а $noValues - это словарь, содержащий "Chart", "Release" и другие значения верхнего уровня. Все они объединяются в один словарь с переопределением $noCommon $common.)

1 голос
/ 10 апреля 2020

Эти шаблонные функции на самом деле из базового пакета sprig , который helm использует .


Создание словарей выполняется путем вызова функции dict и передачи ей списка пар.

Следующее создает словарь с тремя элементами:

$myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3"

Объединение двух или более словарей в один, отдавая приоритет словарю dest :

$newdict := merge $dest $source1 $source2

Это операция глубокого слияния, но не операция глубокого копирования. Вложенные объекты, которые объединяются, являются одним и тем же экземпляром в обоих разделах. Если вы хотите глубокое копирование вместе со слиянием, тогда используйте функцию deepCopy вместе со слиянием. Например,

deepCopy $source | merge $dest

mustMerge вернет ошибку в случае неудачного слияния.


Функция omit аналогична pick , за исключением того, что возвращает новый dict со всеми клавишами, которые не соответствуют указанным клавишам.

$new := omit $myDict "name1" "name3"
...