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

10,176

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 }}
Share:
10,176
RuBiCK
Author by

RuBiCK

Technology lover, cloud enthusiastic and working as devops

Updated on June 26, 2022

Comments

  • RuBiCK
    RuBiCK almost 2 years

    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: []