Как рассчитать глобальный индекс для двух диапазонов в шаблонах Kubernetes Sprig / helm? - PullRequest
0 голосов
/ 18 сентября 2018

В таблице рулевого управления мне нужны следующие значения

dataCenters:
  - name: a
    replicas: 3
  - name: b
    replicas: 2

При создании шаблона я хотел бы, чтобы мой вывод был похож на следующий

server.1 = a-1
server.2 = a-2
server.3 = a-3
server.4 = b-1
server.5 = b-2

Я попробовал этот код

{{- $index := 0 -}}
{{ range $dc := .Values.cluster.dataCenters -}}
{{ range $seq := (int $dc.replicas | until) -}}
{{- $index := (add $index 1) -}}
server.{{ $index }}={{ $dc.name }}-{{ $seq }}
{{ end -}}
{{ end -}}

однако в шаблонах руля я не думаю, что вы можете переназначить значение индекса, когда моя 4-я строка пытается и из-за этого я выхожу

server.1 = a-1
...
server.1 = b-2

Как рассчитатьглобальный индекс 0 до 4 (от 1 до 5 в моей ситуации) с использованием языка шаблонов Sprig / Helm?

1 Ответ

0 голосов
/ 19 сентября 2018

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

Шаблон Go / Helm принимает один параметр, но библиотека sprig дает вамвозможность создавать списки, а функция text / template index позволяет выбирать объекты из списка.Это позволяет вам написать шаблон «функции», который принимает несколько параметров, упакованных в список.

Скажем, мы хотим вывести одну строку этого вывода.Нам нужно отслеживать, какой номер сервера у нас (глобально), какой номер реплики (в текущем центре обработки данных), текущая запись центра обработки данных и записи, которые мы еще не отправили.Если мы подошли к концу текущего списка, распечатайте записи для остальных центров обработки данных;в противном случае выведите одну строку для текущей реплики и повторите для следующего индекса сервера / реплики.

{{ define "emit-dc" -}}
  {{ $server := index . 0 -}}
  {{ $n := index . 1 -}}
  {{ $dc := index . 2 -}}
  {{ $dcs := index . 3 -}}
  {{ if gt $n (int64 $dc.replicas) -}}
    {{ template "emit-dcs" (list $server $dcs) -}}
  {{ else -}}
server.{{ $server }}: {{ $dc.name }}-{{ $n }}
{{ template "emit-dc" (list (add1 $server) (add1 $n) $dc $dcs) -}}
  {{ end -}}
{{ end -}}

На верхнем уровне мы знаем индекс следующего номера сервера плюс список центров обработки данных.Если этот список пуст, мы закончили.В противном случае мы можем начать испускать строки из первого центра обработки данных в списке.

{{ define "emit-dcs" -}}
  {{ $server := index . 0 -}}
  {{ $dcs := index . 1 -}}
  {{ if ne 0 (len $dcs) -}}
    {{ template "emit-dc" (list $server 1 (first $dcs) (rest $dcs)) -}}
  {{ end -}}
{{ end -}}

Затем в вашем фактическом определении ресурса (скажем, в определении ConfigMap) вы можете вызвать этот шаблон с первым номером сервера:

{{ template "emit-dcs" (list 1 .Values.dataCenters) -}}

Скопируйте все это в фиктивную диаграмму Хелма, и вы сможете проверить вывод:

% helm template .
---
# Source: x/templates/test.yaml
server.1: a-1
server.2: a-2
server.3: a-3
server.4: b-1
server.5: b-2

Я подозреваю, что этот трюк не сработает, если количество серверов значительно превысит сотни(Движок шаблонов Go почти наверняка не является хвостовой рекурсивом ), и это несколько пытается навязать стандартные методы языка программирования на язык шаблонов, который не совсем для этого предназначен.Но ... это работает.

...