This is an automated email from the ASF dual-hosted git repository.

Miretpl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new e420143333a Support image digest in worker pod template image (#69776)
e420143333a is described below

commit e420143333a6eab368c678ec766f712f686054d7
Author: Preetham Sanji <[email protected]>
AuthorDate: Wed Jul 22 20:37:57 2026 +0530

    Support image digest in worker pod template image (#69776)
    
    The pod_template_image helper only rendered repository:tag, ignoring
    digests, while airflow_image supports repository@digest with digest
    taking precedence over tag. Add images.pod_template.digest (falling
    back to defaultAirflowDigest) so worker pods can pin images by digest.
    
    Closes: #58625
    
    Co-authored-by: Przemysław Mirowski 
<[email protected]>
---
 chart/templates/_helpers.yaml                      |  9 +++++-
 .../airflow_aux/test_pod_template_file.py          | 33 ++++++++++++++++++++++
 chart/values.schema.json                           |  8 ++++++
 chart/values.yaml                                  |  8 ++++--
 4 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/chart/templates/_helpers.yaml b/chart/templates/_helpers.yaml
index 2fefc497905..b069c38f97c 100644
--- a/chart/templates/_helpers.yaml
+++ b/chart/templates/_helpers.yaml
@@ -372,7 +372,14 @@ If release name contains chart name it will be used as a 
full name.
 {{- end }}
 
 {{- define "pod_template_image" -}}
-  {{- printf "%s:%s" (.Values.images.pod_template.repository | default 
.Values.defaultAirflowRepository) (.Values.images.pod_template.tag | default 
.Values.defaultAirflowTag) }}
+  {{- $repository := .Values.images.pod_template.repository | default 
.Values.defaultAirflowRepository -}}
+  {{- $tag := .Values.images.pod_template.tag | default 
.Values.defaultAirflowTag -}}
+  {{- $digest := .Values.images.pod_template.digest | default 
.Values.defaultAirflowDigest -}}
+  {{- if $digest }}
+    {{- printf "%s@%s" $repository $digest -}}
+  {{- else }}
+    {{- printf "%s:%s" $repository $tag -}}
+  {{- end }}
 {{- end }}
 
 {{/* This helper is used for airflow containers that do not need the users 
code */}}
diff --git a/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py 
b/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py
index 34d03fe7762..42a776b5fb6 100644
--- a/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py
+++ b/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py
@@ -356,6 +356,39 @@ class TestPodTemplateFile:
         assert jmespath.search("spec.containers[0].imagePullPolicy", docs[0]) 
== "Always"
         assert jmespath.search("spec.containers[0].name", docs[0]) == "base"
 
+    @pytest.mark.parametrize(
+        ("expected_image", "tag", "digest"),
+        [
+            ("dummy_image:user-tag", "user-tag", None),
+            ("dummy_image@user-digest", None, "user-digest"),
+            ("dummy_image@user-digest", "user-tag", "user-digest"),
+        ],
+    )
+    def test_should_use_correct_pod_template_image(self, expected_image, tag, 
digest):
+        docs = render_chart(
+            values={
+                "images": {
+                    "pod_template": {"repository": "dummy_image", "tag": tag, 
"digest": digest},
+                },
+            },
+            show_only=["templates/pod-template-file.yaml"],
+            chart_dir=self.temp_chart_dir,
+        )
+
+        assert jmespath.search("spec.containers[0].image", docs[0]) == 
expected_image
+
+    def test_should_use_default_airflow_digest_in_pod_template(self):
+        docs = render_chart(
+            values={
+                "defaultAirflowRepository": "test-repo",
+                "defaultAirflowDigest": "user-digest",
+            },
+            show_only=["templates/pod-template-file.yaml"],
+            chart_dir=self.temp_chart_dir,
+        )
+
+        assert jmespath.search("spec.containers[0].image", docs[0]) == 
"test-repo@user-digest"
+
     def test_mount_airflow_cfg(self):
         docs = render_chart(
             show_only=["templates/pod-template-file.yaml"],
diff --git a/chart/values.schema.json b/chart/values.schema.json
index 7eb865997c7..3513f073e12 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -801,6 +801,14 @@
                             ],
                             "default": null
                         },
+                        "digest": {
+                            "description": "The pod_template image digest. If 
set, it will override the tag. If 
``config.kubernetes_executor.worker_container_repository`` and 
``config.kubernetes_executor.worker_container_tag`` are set, the k8s executor 
will use those instead.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "default": null
+                        },
                         "pullPolicy": {
                             "description": "The pod_template image pull 
policy.",
                             "type": "string",
diff --git a/chart/values.yaml b/chart/values.yaml
index 890f9976d97..299e21386b5 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -83,12 +83,14 @@ images:
   # timeout (in seconds) for airflow-migrations to complete
   migrationsWaitTimeout: 60
   pod_template:
-    # Note that `images.pod_template.repository` and `images.pod_template.tag` 
parameters can be overridden
-    # in `config.kubernetes_executor` section. So for these parameters to have 
effect
-    # `config.kubernetes_executor.worker_container_repository` and
+    # Note that `images.pod_template.repository`, `images.pod_template.tag` 
and `images.pod_template.digest`
+    # parameters can be overridden in `config.kubernetes_executor` section. So 
for these parameters
+    # to have effect `config.kubernetes_executor.worker_container_repository` 
and
     # `config.kubernetes_executor.worker_container_tag` must be not set .
     repository: ~
     tag: ~
+    # Specifying digest takes precedence over tag.
+    digest: ~
     pullPolicy: IfNotPresent
   flower:
     repository: ~

Reply via email to