diff --git a/README.md b/README.md index 3eca274d..290f09ac 100644 --- a/README.md +++ b/README.md @@ -82,9 +82,9 @@ helm delete --namespace test my-application | deployment.affinity | object | `nil` | Affinity for the pods. | | deployment.topologySpreadConstraints | list | `nil` | Topology spread constraints for the pods. | | deployment.revisionHistoryLimit | int | `2` | Number of ReplicaSet revisions to retain. | -| deployment.image.repository | string | `""` | Repository. | -| deployment.image.tag | string | `""` | Tag. | -| deployment.image.digest | string | `""` | Image digest. If set to a non-empty value, digest takes precedence on the tag. | +| deployment.image.repository | tpl/string | `""` | Repository. | +| deployment.image.tag | tpl/string | `""` | Tag. | +| deployment.image.digest | tpl/string | `""` | Image digest. If resolved to a non-empty value, digest takes precedence on the tag. | | deployment.image.pullPolicy | string | `"IfNotPresent"` | Image pull policy. | | deployment.dnsConfig | object | `nil` | DNS config for the pods. | | deployment.dnsPolicy | string | `""` | DNS Policy. | diff --git a/application/templates/cronjob.yaml b/application/templates/cronjob.yaml index f72c8a0a..58fc87df 100644 --- a/application/templates/cronjob.yaml +++ b/application/templates/cronjob.yaml @@ -76,13 +76,19 @@ spec: {{- end }} containers: - name: {{ $name }} - {{- $image := required (print "Undefined image repo for container '" $name "'") $job.image.repository }} - {{- with $job.image.tag }} {{- $image = print $image ":" . }} {{- end }} - {{- with $job.image.digest }} {{- $image = print $image "@" . }} {{- end }} + {{- $repo := include "application.tplvalues.render" (dict "value" $job.image.repository "context" $) -}} + {{- $repo = required (printf "Undefined image repo for container '%s'" $name) $repo -}} + + {{- $tag := include "application.tplvalues.render" (dict "value" $job.image.tag "context" $) -}} + {{- $digest := include "application.tplvalues.render" (dict "value" $job.image.digest "context" $) -}} + + {{- $image := $repo -}} + {{- with $tag }} {{- $image = print $image ":" . }} {{- end }} + {{- with $digest }} {{- $image = print $image "@" . }} {{- end }} image: {{ $image }} {{- if $job.image.imagePullPolicy }} imagePullPolicy: {{ $job.image.imagePullPolicy }} - {{ end }} + {{- end }} {{- with $job.env }} env: {{- range $key, $value := $job.env }} diff --git a/application/templates/deployment.yaml b/application/templates/deployment.yaml index 6346d809..ea5b9012 100644 --- a/application/templates/deployment.yaml +++ b/application/templates/deployment.yaml @@ -140,9 +140,15 @@ spec: name: proxy-tls {{- end }} - name: {{ template "application.name" . }} - {{- $image := required "Undefined image for application container" .Values.deployment.image.repository }} - {{- with .Values.deployment.image.tag }} {{- $image = print $image ":" . }} {{- end }} - {{- with .Values.deployment.image.digest }} {{- $image = print $image "@" . }} {{- end }} + {{- $repo := include "application.tplvalues.render" (dict "value" .Values.deployment.image.repository "context" $) -}} + {{- $repo = required "Undefined image for application container" $repo -}} + + {{- $tag := include "application.tplvalues.render" (dict "value" .Values.deployment.image.tag "context" $) -}} + {{- $digest := include "application.tplvalues.render" (dict "value" .Values.deployment.image.digest "context" $) -}} + + {{- $image := $repo -}} + {{- with $tag }} {{- $image = print $image ":" . }} {{- end }} + {{- with $digest }} {{- $image = print $image "@" . }} {{- end }} image: {{ $image }} imagePullPolicy: {{ .Values.deployment.image.pullPolicy }} {{- with .Values.deployment.lifecycle }} diff --git a/application/templates/job.yaml b/application/templates/job.yaml index caf8becd..4ec5b5df 100644 --- a/application/templates/job.yaml +++ b/application/templates/job.yaml @@ -56,13 +56,19 @@ spec: {{- end }} containers: - name: {{ $name }} - {{- $image := required (print "Undefined image repo for container '" $name "'") $job.image.repository }} - {{- with $job.image.tag }} {{- $image = print $image ":" . }} {{- end }} - {{- with $job.image.digest }} {{- $image = print $image "@" . }} {{- end }} + {{- $repo := include "application.tplvalues.render" (dict "value" $job.image.repository "context" $) -}} + {{- $repo = required (printf "Undefined image repo for container '%s'" $name) $repo -}} + + {{- $tag := include "application.tplvalues.render" (dict "value" $job.image.tag "context" $) -}} + {{- $digest := include "application.tplvalues.render" (dict "value" $job.image.digest "context" $) -}} + + {{- $image := $repo -}} + {{- with $tag }} {{- $image = print $image ":" . }} {{- end }} + {{- with $digest }} {{- $image = print $image "@" . }} {{- end }} image: {{ $image }} {{- if $job.image.imagePullPolicy }} imagePullPolicy: {{ $job.image.imagePullPolicy }} - {{ end }} + {{- end }} {{- with $job.env }} env: {{- range $key, $value := $job.env }} diff --git a/application/tests/cronjob_test.yaml b/application/tests/cronjob_test.yaml index 017fd7ae..df170653 100644 --- a/application/tests/cronjob_test.yaml +++ b/application/tests/cronjob_test.yaml @@ -253,3 +253,79 @@ tests: - equal: path: spec.jobTemplate.spec.template.metadata.labels["application.stakater.com/workload-class"] value: scheduled + + - it: uses image templating + set: + custom: + image: + repository: custom-image + tag: custom-tag + digest: sha256:custom-digest + cronJob: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].image + value: custom-image:custom-tag@sha256:custom-digest + + - it: uses image templating (without tag) + set: + custom: + image: + repository: custom-image + digest: sha256:custom-digest + cronJob: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].image + value: custom-image@sha256:custom-digest + + - it: uses image templating (without digest) + set: + custom: + image: + repository: custom-image + tag: custom-tag + cronJob: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].image + value: custom-image:custom-tag + + - it: uses image templating (without tag and digest) + set: + custom: + image: + repository: custom-image + cronJob: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].image + value: custom-image diff --git a/application/tests/deployment_test.yaml b/application/tests/deployment_test.yaml index 8c397ebb..08f8ee97 100644 --- a/application/tests/deployment_test.yaml +++ b/application/tests/deployment_test.yaml @@ -174,3 +174,67 @@ tests: - equal: path: spec.template.metadata.labels["application.stakater.com/workload-class"] value: serving + + - it: uses image templating + set: + custom: + image: + repository: custom-image + tag: custom-tag + digest: sha256:custom-digest + deployment: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image:custom-tag@sha256:custom-digest + + - it: uses image templating (without tag) + set: + custom: + image: + repository: custom-image + digest: sha256:custom-digest + deployment: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image@sha256:custom-digest + + - it: uses image templating (without digest) + set: + custom: + image: + repository: custom-image + tag: custom-tag + deployment: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image:custom-tag + + - it: uses image templating (without tag and digest) + set: + custom: + image: + repository: custom-image + deployment: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image diff --git a/application/tests/job_test.yaml b/application/tests/job_test.yaml index 6fcb8dc9..52e1c61a 100644 --- a/application/tests/job_test.yaml +++ b/application/tests/job_test.yaml @@ -253,3 +253,78 @@ tests: - equal: path: spec.template.metadata.labels["application.stakater.com/workload-class"] value: batch + + - it: uses image templating + set: + custom: + image: + repository: custom-image + tag: custom-tag + digest: sha256:custom-digest + job: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image:custom-tag@sha256:custom-digest + - it: uses image templating (without tag) + set: + custom: + image: + repository: custom-image + digest: sha256:custom-digest + job: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image@sha256:custom-digest + + - it: uses image templating (without digest) + set: + custom: + image: + repository: custom-image + tag: custom-tag + job: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image:custom-tag + + - it: uses image templating (without tag and digest) + set: + custom: + image: + repository: custom-image + job: + enabled: true + jobs: + example: + image: + repository: "{{ .Values.custom.image.repository }}" + tag: "{{ .Values.custom.image.tag }}" + digest: "{{ .Values.custom.image.digest }}" + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom-image diff --git a/application/values.yaml b/application/values.yaml index 4c4cff12..661e2e04 100644 --- a/application/values.yaml +++ b/application/values.yaml @@ -283,13 +283,13 @@ deployment: # @section -- Deployment Parameters revisionHistoryLimit: 2 image: - # -- (string) Repository. + # -- (tpl/string) Repository. # @section -- Deployment Parameters repository: "" - # -- (string) Tag. + # -- (tpl/string) Tag. # @section -- Deployment Parameters tag: "" - # -- (string) Image digest. If set to a non-empty value, digest takes precedence on the tag. + # -- (tpl/string) Image digest. If resolved to a non-empty value, digest takes precedence on the tag. # @section -- Deployment Parameters digest: "" # -- (string) Image pull policy.