Search code examples
yamlkubernetes-helmkubernetes-cronjob

helm yaml iterate causes nil pointer


I am trying to iterate over jobsContainer array to generate multiple instances in the cronjob I am creating. Ny values.yaml look like the below:

jobContainers:
  - cleaner1:
    env:
      keepRunning: false
    logsPath: /nfs/data_etl/logs

  - cleaner2:
    env:
      keepRunning: false
    logsPath: /nfs/data_etl/logs

and my template cronJob.yaml looks like:

      {{- range $job, $val := .Values.jobContainers }}
        - image: "{{ $image.repository }}:{{ $image.tag }}"
          imagePullPolicy: {{ $image.pullPolicy }}
          name: {{ $job }}
          env:
            - name: KEEP_RUNNING
              value: "{{ .env.keepRunning }}"
          volumeMounts:
          - name: {{ .logsPathName }}
            mountPath: /log

        restartPolicy: Never
      {{- end }}

helm install returns the following error:

executing "/templates/cronjob.yaml" at <.env.keepRunning>: nil pointer evaluating interface {}.keepRunning

My cronjob.Yaml is below:

    {{- $image := .Values.image }}

apiVersion: batch/v1beta1

kind: CronJob
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Release.Name }}
    chart: ni-filecleaner
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: {{ .Release.Name }}
            cron: {{ .Values.filesjob.jobName }}
        spec:
          containers:
          {{- range $job, $val := .Values.jobContainers }}
            - image: "{{ $image.repository }}:{{ $image.tag }}"
              imagePullPolicy: {{ $image.pullPolicy }}
              name: {{ $job }}
              env:
                - name: KEEP_RUNNING
                  value: "{{ $val.env.keepRunning }}"
                - name: FILE_RETENTION_DAYS
                  value: "{{ .env.retentionPeriod }}"
                - name: FILE_MASK
                  value: "{{ .env.fileMask }}"
                - name: ID
                  value: "{{ .env.id }}"
              volumeMounts:
              - mountPath: /data
                name: {{ .dataPathName }}
              - name: {{ .logsPathName }}
                mountPath: /log
  
            restartPolicy: Never
            volumes:
              - name: {{ .dataPathName }}
                nfs:
                  server: {{ .nfsIp }}
                  path: {{ .dataPath }}
              - name: {{ .logsPathName }}
                nfs:
                  server: {{ .nfsIp }}
                  path: {{ .logsPath }}
          {{- end }}

  schedule: "{{ .Values.filesjob.schedule }}"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: {{ .Values.filesjob.successfulJobsHistoryLimit }}
  failedJobsHistoryLimit: {{ .Values.filesjob.failedJobsHistoryLimit }}

  {{- with .Values.nodeSelector }}

  nodeSelector:
    {{- toYaml . | nindent 12 }}
  {{- end }}

The full values.yaml is below:

    replicaCount: 1
image:
  repository: app.corp/ni-etl-filecleaner
  tag: "3.0.3.1"
  pullPolicy: IfNotPresent

jobContainers:
  - processed:
      env:
        keepRunning: false
        fileMask: ne*.*
        retentionPeriod: 3
        id: processed
      jobName: processed
      dataPathName: path-to-clean-processed
      logsPathName: path-logfiles-processed
      dataPath: /nfs/data_etl/loader/processed
      logsPath: /nfs/data_etl/logs
      nfsIp: ngs.corp

  - incoming:
      env:
        keepRunning: false
        fileMask: ne*.*
        retentionPeriod: 3
        id: incoming
      jobName: incoming
      dataPathName: path-to-clean-incoming
      logsPathName: path-logfiles-incoming
      dataPath: /nfs/data_etl/loader/incoming
      logsPath: /nfs/data_etl/logs
      nfsIp: ngs.corp

resources: {}

nodeSelector: {}

tolerations: []

affinity: {}

Solution

  • It seems there are some indentation issue with both of your values file and template file. Here, is the correct template and values file.

    {{- $image := .Values.image }}
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: {{ .Release.Name }}
      labels:
        app: {{ .Release.Name }}
        chart: ni-filecleaner
        release: {{ .Release.Name }}
        heritage: {{ .Release.Service }}
    spec:
      jobTemplate:
        spec:
          template:
            metadata:
              labels:
                app: {{ .Release.Name }}
                cron: {{ .Values.filesjob.jobName }}
            spec:
              containers:
              {{- range $job, $val := .Values.jobContainers }}
                - image: "{{ $image.repository }}:{{ $image.tag }}"
                  imagePullPolicy: {{ $image.pullPolicy }}
                  name: "{{ $job }}"
                  env:
                    - name: KEEP_RUNNING
                      value: "{{ $val.env.keepRunning }}"
                    - name: FILE_RETENTION_DAYS
                      value: "{{ $val.env.retentionPeriod }}"
                    - name: FILE_MASK
                      value: "{{ $val.env.fileMask }}"
                    - name: ID
                      value: "{{ $val.env.id }}"
                  volumeMounts:
                  - mountPath: /data
                    name: {{ $val.dataPathName }}
                  - name: {{ $val.logsPathName }}
                    mountPath: /log
              restartPolicy: Never
              volumes:
                - name: {{ $val.dataPathName }}
                  nfs:
                    server: {{ $val.nfsIp }}
                    path: {{ $val.dataPath }}
                - name: {{ $val.logsPathName }}
                  nfs:
                    server: {{ $val.nfsIp }}
                    path: {{ $val.logsPath }}
              {{- end }}
    
      schedule: "{{ .Values.filesjob.schedule }}"
      concurrencyPolicy: Forbid
      successfulJobsHistoryLimit: {{ .Values.filesjob.successfulJobsHistoryLimit }}
      failedJobsHistoryLimit: {{ .Values.filesjob.failedJobsHistoryLimit }}
    
      {{- with .Values.nodeSelector }}
    
      nodeSelector:
        {{- toYaml . | nindent 12 }}
      {{- end }}
    
    replicaCount: 1
    image:
      repository: app.corp/ni-etl-filecleaner
      tag: "3.0.3.1"
      pullPolicy: IfNotPresent
    
    filesjob:
      name: cleaner
    
    jobContainers:
      - processed:
        env:
          keepRunning: false
          fileMask: ne*.*
          retentionPeriod: 3
          id: processed
        jobName: processed
        dataPathName: path-to-clean-processed
        logsPathName: path-logfiles-processed
        dataPath: /nfs/data_etl/loader/processed
        logsPath: /nfs/data_etl/logs
        nfsIp: ngs.corp
    
      - incoming:
        env:
          keepRunning: false
          fileMask: ne*.*
          retentionPeriod: 3
          id: incoming
        jobName: incoming
        dataPathName: path-to-clean-incoming
        logsPathName: path-logfiles-incoming
        dataPath: /nfs/data_etl/loader/incoming
        logsPath: /nfs/data_etl/logs
        nfsIp: ngs.corp
    
    resources: {}
    
    nodeSelector: {}
    
    tolerations: []
    
    affinity: {}