How to make nested variables optional in Helm

Simple workaround

Wrap each nullable level with parentheses ().

{{ ((.Values.foo).bar) }}

Or

{{ if ((.Values.foo).bar) }}
{{ .Values.foo.bar }}
{{ end }}

How does it work?

Helm uses the go text/template and inherits the behaviours from there.

Each pair of parentheses () can be considered a pipeline.

From the doc (https://pkg.go.dev/text/template#hdr-Actions)

It is:

The default textual representation (the same as would be printed by fmt.Print)…

With the behaviour:

If the value of the pipeline is empty, no output is generated… The empty values are false, 0, any nil pointer or interface value, and any array, slice, map, or string of length zero.

As such, by wrapping each nullable level with parentheses, when they are chained, the predecessor nil pointer gracefully generates no output to the successor and so on, achieving the nested nullable fields workaround.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)