I am trying to get some values from Umbrella chart in helm in _helpers.tpl but I for some reason I am getting the error executing "gluu.ldaplist" at <.Values.ldap.extraHo...>: can't evaluate field extraHosts in type interface {}
This is what I am trying to do. _helpers.ptl
{{- define "gluu.ldaplist" -}}
{{- $hosts := .Values.ldap.extraHosts -}}
{{- $genLdap := dict "host" (printf "%s-%s" .Release.Name .Values.ldapType) "port" .Values.ldapPort -}}
{{- $hosts := prepend $hosts $genLdap -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := $hosts -}}
{{- if not $local.first -}},{{- end -}}{{- printf "%s:%.f" $v.host $v.port -}}{{- $_ := set $local "first" false -}}
{{- end -}}
{{- end -}}And this is part of values.yml for the umbrella chart values.yml
ldap:
enabled: true
type: opendj
extraHosts: [
host: opendj,
port: 3434
] #array of k,v e.g host: host1, port: port1Directory structure
helm/
charts/
chart_a/
templates/
configMap.yml ----->>> this is where I want to use it
templates/
_helpers.tpl ---->>>> where the failing function is
requirements.yml
values.yml ---------->>> where the ldap values are
The configMap.yml looks like below
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "oxauth.fullname" . }}-cm
data:
GLUU_CONFIG_ADAPTER: {{ .Values.global.configAdapterName | quote }}
GLUU_LDAP_URL: {{ template "gluu.ldaplist" . }}NOTE: The _helpers.tpl is under the main/umbrella chart. chart_a is a subchart.
Expected results are something like GLUU_LDAP_URL:"opendj:3434"
Helm version:
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}Expected result is that the function {{- define "gluu.ldaplist" -}} in _helpers.tpl completes without error even if no values are provided in the array. If there are values provided, the expected string is host:port as output.
If this can be done in another way, I welcome any suggestion.
This can be solved with global values which allow values in the parent chart to override (or supply unspecified) values in the child subcharts.
From the Helm docs on Subcharts and Global Values:
- A subchart is considered “stand-alone”, which means a subchart can never explicitly depend on its parent chart.
- For that reason, a subchart cannot access the values of its parent.
- A parent chart can override values for subcharts.
- Helm has a concept of global values that can be accessed by all charts.
(At first I didn't think to search for "helm subchart" but once I did an Internet search for that term, this was the first or second result)
Here's a minimal example that solves your issue:
helm
├── Chart.yaml
├── charts
│ └── chart_a
│ ├── Chart.yaml
│ └── templates
│ └── configMap.yml
├── templates
│ └── _helpers.tpl
└── values.yaml
Note: I added Chart.yaml files to make it actually work, renamed values.yml to values.yaml so that it works by default without extra flags, and removed requirements.yml since it wasn't necessary to reproduce the problem and solution.
values.yamlglobal:
ldap:
enabled: true
type: opendj
extraHosts:
- host: opendj
port: 3434
ldapType: xxx
ldapPort: 123The key was to nest what you had under a special global key. Note, I also added ldapType and ldapPort since they were in your _helpers.tpl, and I fixed the YAML structure you had under extraHosts. What was there before didn't actually represent a list of maps with host and port keys. Without this fix, the helm command doesn't fail but doesn't output what you want either.
$ helm template .
---
# Source: helm/charts/chart_a/templates/configMap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm
data:
GLUU_LDAP_URL: release-name-xxx:123,opendj:3434