Есть ли способ проверить / проанализировать файл YAML с переменными go -template в нем? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть файл "YAML". И я хочу проверить его, прежде чем отображать в нем переменные шаблона go. Например:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

Типичный анализатор YAML здесь не работает, так как он будет анализировать { как начало карты.

err := yaml.Unmarshal(data, &Content)
// Failed to parse the provided YAML: yaml: line 4: did not find expected key

Интересно, есть ли любой пакет, который может помочь мне в этом? Я искал в Интернете какое-то время, но безуспешно. Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Жалуется не только синтаксический анализатор YAML: на самом деле это недопустимый YAML (потому что {...} является синтаксисом встроенного сопоставления). Похоже, это исходит от инструмента развертывания Kubernetes Helm , и некоторые рутинные, но интересные применения действительно требуют рендеринга YAML.

На практике вы, вероятно, захотите использовать helm template, чтобы отобразить диаграмму в многодокументном YAML, а затем запустить на ней валидатор YAML. Кажется, это не задокументировано, но Helm версии 3 фактически выполняет эту проверку самостоятельно (Helm 2 этого не делает), поэтому, если ваша диаграмма выдает недопустимый YAML, вы получите ошибку в этот момент.

Как работает Helm, он интерпретирует этот "YAML" файл как простой текстовый файл и применяет к нему шаблон Go text/template, а затем считывает его обратно как YAML. В некоторой степени вы могли бы сделать этот YAML корректным, цитируя строки самостоятельно:

name: "{{ .Release.Name }}-configmap"

Но есть некоторые довольно распространенные конструкции, в которых это фактически нарушит сгенерированный YAML. Например, шаблон helm create генерирует

{{/* _helpers.tpl */}}
{{- define "<CHARTNAME>.labels" -}}
helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
{{- end -}}
metadata:
  name: {{ include "<CHARTNAME>.fullname" . }}
  labels:
    {{- include "<CHARTNAME>.labels" . | nindent 4 }}

, и никакое цитирование не сделает этот YAML действительным. Очень возможно поместить во вспомогательный шаблон «метки» что-то, что недопустимо в контексте сопоставления YAML, и вы хотите уловить это на этапе проверки.

0 голосов
/ 05 августа 2020

Нет, это невозможно. Сначала оцените шаблон.

...