<.Chart.Name>: can't evaluate field Chart in type string

RuBiCK picture RuBiCK · Jan 14, 2019 · Viewed 7.5k times · Source

When I deploy the following I get this error:

{{- if .Values.front.ingress.enabled -}}
{{- $fullName := include "marketplace.fullname" . -}}
{{- $ingressPaths := .Values.front.ingress.paths -}}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $fullName }}-{{ .Values.environment }}-front
  labels:
    app.kubernetes.io/name: {{ include "marketplace.name" . }}-{{ .Values.front.name }}
    helm.sh/chart: {{ include "marketplace.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}-{{ .Values.front.name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
  {{- with .Values.front.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
{{- if .Values.front.ingress.tls }}
  tls:
  {{- range .Values.front.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.front.ingress.hosts }}
    - host: {{ . | quote }}
      http:
        paths:
    {{- range $ingressPaths }}
          - path: /
            backend:
              serviceName: {{ include "marketplace.name" . }}-{{ $.Values.front.name }}
              servicePort: 3000
    {{- end }}
  {{- end }}
{{- end }}

Error:

  Error: UPGRADE FAILED: render error in "marketplace/templates/front-ingress.yaml": template: marketplace/templates/front-ingress.yaml:36:30: executing "marketplace/templates/front-ingress.yaml" at <include "marketplace...>: error calling include: template: marketplace/templates/_helpers.tpl:6:18: executing "marketplace.name" at <.Chart.Name>: can't evaluate field Chart in type string

marketplace.name is defined in _helpers.tpl:

{{- define "marketplace.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

.Chart.Name is an internal variable and the order of preference is explained here but even setting nameOverride the error is the same.

The strange thing is if I remove this template, .Chart.Name works fine within any other template so I think the problem is related to the scopes of the range used.

Values used:

front:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx-int
      nginx.ingress.kubernetes.io/rewrite-target: /
      nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    paths:
      - /
    hosts:
      - myhost.mydomain.cloud
    tls: []

Answer

edbighead picture edbighead · Jan 14, 2019

Please see related issue.

Based on this workaround, you can store . in a variable, since inside of range loop, . refers to actual value of paths:

Also you may want to replace - path: / with - path: {{ . }}

{{- if .Values.front.ingress.enabled -}}
{{- $fullName := include "bchart.fullname" . -}}
{{- $ingressPaths := .Values.front.ingress.paths -}}
{{- $dot := . }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
...
...
    {{- range $ingressPaths }}
          - path: {{ . }}
            backend:
              serviceName: {{ include "bchart.name" $dot }}-{{ $.Values.front.name }}
              servicePort: 3000
    {{- end }}