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: {}
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: {}