Home > Enterprise >  How to Return Part of another YAML file in Helm Go Template
How to Return Part of another YAML file in Helm Go Template

Time:11-11

I have a Yaml file in a folder as abc.yaml and the content is

metadata:
  test1: apple
  test2: banana
  test3: cat
container:
  image: foo
  text: xyz
variables:
  ojb: one
  meta: two

and I have another file values.yaml.j2 which needs part of the above content.

metadata:
  test4: dog
  test5: elephant
  {{ .... Here I need test1, test2, test3 from the above (abc.yaml).... }}
container:
  name: test
  {{ .... Here I need image and text from the above (abc.yaml) ....}}
variables:
  ping: pong
  {{ ..... Here I need ojb and meta from the above (abc.yaml) .... }}

When I was exploring Helm go templates, I found, Files.Lines will return line by line. But I need specific lines as I mentioned above.

Any solution with go template wo get the part of other yaml file?

CodePudding user response:

If you know the other file is YAML, Helm contains a lightly-documented fromYaml extension that can parse it.

{{- $abc := .Files.Get "abc.yaml" | fromYaml }}

From there you have a couple of options on how to proceed. One tool you have is the corresponding, also lightly-documented, toYaml extension that converts an arbitrary structure back to YAML.

So one choice is to directly emit the values you think you need:

metadata:
  test4: dog
  test5: elephant
  test1: {{ $abc.metadata.test1 }}
  test2: {{ $abc.metadata.test2 }}
  test3: {{ $abc.metadata.test3 }}

A second is to emit the new values for each block, plus the existing content:

metadata:
  test4: dog
  test5: elephant
{{ $abc.metadata | toYaml | indent 2 -}}

A third is to modify the structure in-place, and then ask Helm to write out the whole thing as YAML. Unusual for Helm template functions, set modifies the dictionary it's given in place.

{{- $_ := $abc.metadata | set "test4" "dog" | set "test5" "elephant" -}}
{{- toYaml $abc -}}
  • Related