Создание отфильтрованного списка с помощью помощников шаблона helm - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь использовать вспомогательный шаблон helm для фильтрации значений из списка в моем файле values.yaml на основе значения одного из ключей в каждом элементе списка.

Моя диаграмма в настоящее время состоит из этих файлов -
values.yaml -

namespaces:
- name: filter
  profiles:
  - nonProduction
- name: dont-filter
  profiles:
  - production  
clusterProfile: production

templates / namespaces.yaml

apiVersion: v1
kind: List
items:
{{ $filteredList := include "filteredNamespaces" . }}
{{ range $filteredList }}
  {{ .name }}
{{- end -}}

templates / _profile-match.tpl

{{/* vim: set filetype=mustache: */}}
{{- define "filteredNamespaces" -}}
  {{ $newList := list }}
  {{- range .Values.namespaces }}
    {{- if has $.Values.clusterProfile .profiles -}}
      {{ $newList := append $newList . }}
    {{- end -}}
  {{ end -}}
  {{ $newList }}
{{- end -}}

Проблема в том, что в моем вспомогательном файле переменная $newList заполняется только в области действия range l oop, и я получаю пустой список, возвращающийся к шаблону namespaces.yaml.
Есть ли способ обойти эту проблему? Я принимаю неправильный подход для решения этой проблемы?

1 Ответ

4 голосов
/ 11 апреля 2020

Несмотря на то, что шаблоны Go являются почти функциями общего назначения, у них есть пара ограничений. Одним из таких ограничений является то, что они только возвращают строку; вы не можете написать основные c функциональные помощники, такие как map или filter, потому что вы не можете вернуть результирующий список.

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

items:
{{- range .Values.namespaces }}
{{- if has $.Values.clusterProfile .profiles }}
  - {{ .name }}
{{- end }}
{{- end }}

Хакерский способ заставить эту работу, как у вас есть, состоит в том, чтобы упорядочить список в какой-то другой строковый формат, например JSON:

{{- define "filteredNamespaces" -}}
...
{{ toJson $newList }}
{{- end -}}

{{- range include "filteredNamespaces" . | fromJson -}}...{{- end -}}

Также помните, что вы можете внедрить файлы значений Helm, используя опцию helm install -f. Поэтому вместо того, чтобы перечислять каждую перестановку параметров и затем отфильтровывать те, которые вам не нужны, вы можете реструктурировать это так, чтобы namespaces: содержал только список пространств имен, которые вы на самом деле хотите использовать, но затем вы используете другой файл значений для каждый профиль.

...