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

jscheffl pushed a commit to branch chart/v1-2x-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/chart/v1-2x-test by this push:
     new fc24bacfc45 [chart/v1-2x-test] Add workers.celery.safeToEvict & 
workers.kubernetes.safeToEvict (#61915) (#64396)
fc24bacfc45 is described below

commit fc24bacfc452bf06ead7c334b926bd9c777b7ec1
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sun Mar 29 11:10:26 2026 +0200

    [chart/v1-2x-test] Add workers.celery.safeToEvict & 
workers.kubernetes.safeToEvict (#61915) (#64396)
    
    * Add workers.celery.safeToEvict & workers.kubernetes.safeToEvict
    
    * Add newsfragment
    
    * Fix rebase & comments
    (cherry picked from commit 824d3dfac84e0d71594992430292c294d7fa4391)
    
    Co-authored-by: Przemysław Mirowski <[email protected]>
---
 chart/files/pod-template-file.kubernetes-helm-yaml |   2 +-
 chart/newsfragments/61915.significant.rst          |   1 +
 chart/templates/NOTES.txt                          |   8 ++
 chart/values.schema.json                           |  18 +++-
 chart/values.yaml                                  |  10 ++
 .../airflow_aux/test_pod_template_file.py          |  31 ++++--
 .../tests/helm_tests/airflow_core/test_worker.py   | 120 +++++++++++++++++++++
 .../helm_tests/airflow_core/test_worker_sets.py    |  50 ++++++---
 8 files changed, 214 insertions(+), 26 deletions(-)

diff --git a/chart/files/pod-template-file.kubernetes-helm-yaml 
b/chart/files/pod-template-file.kubernetes-helm-yaml
index 8a93d8f7f10..aece6eabf9b 100644
--- a/chart/files/pod-template-file.kubernetes-helm-yaml
+++ b/chart/files/pod-template-file.kubernetes-helm-yaml
@@ -28,7 +28,7 @@
 {{- $containerLifecycleHooksKerberosInitContainer := or 
.Values.workers.kubernetes.kerberosInitContainer.containerLifecycleHooks 
.Values.workers.kerberosInitContainer.containerLifecycleHooks 
.Values.containerLifecycleHooks }}
 {{- $containerSecurityContext := include "containerSecurityContext" (list 
.Values.workers.kubernetes .Values.workers .Values) }}
 {{- $containerLifecycleHooks := or 
.Values.workers.kubernetes.containerLifecycleHooks 
.Values.workers.containerLifecycleHooks .Values.containerLifecycleHooks }}
-{{- $safeToEvict := dict "cluster-autoscaler.kubernetes.io/safe-to-evict" 
(.Values.workers.safeToEvict | toString) }}
+{{- $safeToEvict := dict "cluster-autoscaler.kubernetes.io/safe-to-evict" (or 
.Values.workers.kubernetes.safeToEvict (and (not (has 
.Values.workers.kubernetes.safeToEvict (list true false))) 
.Values.workers.safeToEvict) | toString) }}
 {{- $podAnnotations := mergeOverwrite (deepCopy .Values.airflowPodAnnotations) 
$safeToEvict .Values.workers.podAnnotations }}
 {{- $schedulerName := or .Values.workers.schedulerName .Values.schedulerName }}
 apiVersion: v1
diff --git a/chart/newsfragments/61915.significant.rst 
b/chart/newsfragments/61915.significant.rst
new file mode 100644
index 00000000000..37c3c07a18c
--- /dev/null
+++ b/chart/newsfragments/61915.significant.rst
@@ -0,0 +1 @@
+``workers.safeToEvict`` section is now deprecated in favor of 
``workers.celery.safeToEvict`` and ``workers.kubernetes.safeToEvict``. Please 
update your configuration accordingly.
diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt
index bec0dbad801..55852c89ecf 100644
--- a/chart/templates/NOTES.txt
+++ b/chart/templates/NOTES.txt
@@ -621,6 +621,14 @@ DEPRECATION WARNING:
 
 {{- end }}
 
+{{- if .Values.workers.safeToEvict }}
+
+ DEPRECATION WARNING:
+    `workers.safeToEvict` has been renamed to 
`workers.celery.safeToEvict`/`workers.kubernetes.safeToEvict`.
+    Please change your values as support for the old name will be dropped in a 
future release.
+
+{{- end }}
+
 {{- if not (empty .Values.workers.nodeSelector) }}
 
  DEPRECATION WARNING:
diff --git a/chart/values.schema.json b/chart/values.schema.json
index 449c55de913..b724734ce2d 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -2288,7 +2288,7 @@
                     "default": 600
                 },
                 "safeToEvict": {
-                    "description": "This setting tells Kubernetes that it's ok 
to evict when it wants to scale a node down. It is used by Airflow Celery 
workers and pod-template-file.",
+                    "description": "This setting tells Kubernetes that it's ok 
to evict when it wants to scale a node down. It is used by Airflow Celery 
workers and pod-template-file (deprecated, use ``workers.celery.safeToEvict`` 
or/and ``workers.kubernetes.safeToEvict`` instead).",
                     "type": "boolean",
                     "default": false
                 },
@@ -3286,6 +3286,14 @@
                             ],
                             "default": null
                         },
+                        "safeToEvict": {
+                            "description": "This setting tells Kubernetes that 
it's ok to evict when it wants to scale a node down.",
+                            "type": [
+                                "boolean",
+                                "null"
+                            ],
+                            "default": null
+                        },
                         "nodeSelector": {
                             "description": "Select certain nodes for Airflow 
Celery worker pods.",
                             "type": "object",
@@ -3575,6 +3583,14 @@
                             ],
                             "default": null
                         },
+                        "safeToEvict": {
+                            "description": "This setting tells Kubernetes that 
it's ok to evict when it wants to scale a node down.",
+                            "type": [
+                                "boolean",
+                                "null"
+                            ],
+                            "default": null
+                        },
                         "nodeSelector": {
                             "description": "Select certain nodes for pods 
created with pod-template-file.",
                             "type": "object",
diff --git a/chart/values.yaml b/chart/values.yaml
index 70aa347d6bd..f135ea8eb29 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -1022,6 +1022,10 @@ workers:
 
   # This setting tells kubernetes that its ok to evict when it wants to scale 
a node down.
   # It is used by Airflow Celery workers and pod-template-file.
+  # (deprecated, use
+  #   workers.celery.safeToEvict or/and
+  #   workers.kubernetes.safeToEvict
+  # instead)
   safeToEvict: false
 
   # Launch additional containers into Airflow Celery worker
@@ -1376,6 +1380,9 @@ workers:
     # Grace period for tasks to finish after SIGTERM is sent from kubernetes
     terminationGracePeriodSeconds: ~
 
+    # This setting tells kubernetes that its ok to evict when it wants to 
scale a node down
+    safeToEvict: ~
+
     # Select certain nodes for Airflow Celery worker pods
     nodeSelector: {}
 
@@ -1446,6 +1453,9 @@ workers:
     # Grace period for tasks to finish after SIGTERM is sent from kubernetes
     terminationGracePeriodSeconds: ~
 
+    # This setting tells kubernetes that its ok to evict when it wants to 
scale a node down
+    safeToEvict: ~
+
     # Select certain nodes for pods created with pod-template-file
     nodeSelector: {}
 
diff --git a/helm-tests/tests/helm_tests/airflow_aux/test_pod_template_file.py 
b/helm-tests/tests/helm_tests/airflow_aux/test_pod_template_file.py
index fcf8c193fb8..f4c2971d6ce 100644
--- a/helm-tests/tests/helm_tests/airflow_aux/test_pod_template_file.py
+++ b/helm-tests/tests/helm_tests/airflow_aux/test_pod_template_file.py
@@ -934,23 +934,38 @@ class TestPodTemplateFile:
         assert "my_annotation" in annotations
         assert "annotated!" in annotations["my_annotation"]
 
-    @pytest.mark.parametrize("safe_to_evict", [True, False])
-    def test_safe_to_evict_annotation(self, safe_to_evict: bool):
+    @pytest.mark.parametrize(
+        ("workers_values", "expected"),
+        [
+            ({"safeToEvict": True}, "true"),
+            ({"kubernetes": {"safeToEvict": True}}, "true"),
+            ({"safeToEvict": False, "kubernetes": {"safeToEvict": True}}, 
"true"),
+            ({"safeToEvict": False}, "false"),
+            ({"kubernetes": {"safeToEvict": False}}, "false"),
+            ({"safeToEvict": True, "kubernetes": {"safeToEvict": False}}, 
"false"),
+        ],
+    )
+    def test_safe_to_evict_annotation(self, workers_values, expected):
         docs = render_chart(
-            values={"workers": {"safeToEvict": safe_to_evict}},
+            values={"workers": workers_values},
             show_only=["templates/pod-template-file.yaml"],
             chart_dir=self.temp_chart_dir,
         )
         annotations = jmespath.search("metadata.annotations", docs[0])
-        assert annotations == {
-            "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" if 
safe_to_evict else "false"
-        }
+        assert annotations == 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": expected}
 
-    def test_safe_to_evict_annotation_other_services(self):
+    @pytest.mark.parametrize(
+        "workers_values",
+        [
+            {"safeToEvict": False},
+            {"kubernetes": {"safeToEvict": False}},
+        ],
+    )
+    def test_safe_to_evict_annotation_other_services(self, workers_values):
         """Workers' safeToEvict value should not overwrite safeToEvict value 
of other services."""
         docs = render_chart(
             values={
-                "workers": {"safeToEvict": False},
+                "workers": workers_values,
                 "scheduler": {"safeToEvict": True},
                 "triggerer": {"safeToEvict": True},
                 "executor": "KubernetesExecutor",
diff --git a/helm-tests/tests/helm_tests/airflow_core/test_worker.py 
b/helm-tests/tests/helm_tests/airflow_core/test_worker.py
index 73ccb6b0efa..0aa34273eed 100644
--- a/helm-tests/tests/helm_tests/airflow_core/test_worker.py
+++ b/helm-tests/tests/helm_tests/airflow_core/test_worker.py
@@ -1269,7 +1269,11 @@ class TestWorker:
         [
             ({}, {}, "false"),
             ({}, {"safeToEvict": True}, "true"),
+            ({}, {"celery": {"safeToEvict": True}}, "true"),
             ({}, {"safeToEvict": False}, "false"),
+            ({}, {"celery": {"safeToEvict": False}}, "false"),
+            ({}, {"safeToEvict": False, "celery": {"safeToEvict": True}}, 
"true"),
+            ({}, {"safeToEvict": True, "celery": {"safeToEvict": False}}, 
"false"),
             (
                 {},
                 {
@@ -1278,6 +1282,14 @@ class TestWorker:
                 },
                 "true",
             ),
+            (
+                {},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                    "celery": {"safeToEvict": True},
+                },
+                "true",
+            ),
             (
                 {},
                 {
@@ -1286,6 +1298,14 @@ class TestWorker:
                 },
                 "true",
             ),
+            (
+                {},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                    "celery": {"safeToEvict": False},
+                },
+                "true",
+            ),
             (
                 {},
                 {
@@ -1294,6 +1314,14 @@ class TestWorker:
                 },
                 "false",
             ),
+            (
+                {},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                    "celery": {"safeToEvict": True},
+                },
+                "false",
+            ),
             (
                 {},
                 {
@@ -1302,26 +1330,54 @@ class TestWorker:
                 },
                 "false",
             ),
+            (
+                {},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                    "celery": {"safeToEvict": False},
+                },
+                "false",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
                 {"safeToEvict": True},
                 "true",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                {"celery": {"safeToEvict": True}},
+                "true",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
                 {"safeToEvict": False},
                 "false",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                {"celery": {"safeToEvict": False}},
+                "false",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
                 {"safeToEvict": True},
                 "true",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                {"celery": {"safeToEvict": True}},
+                "true",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
                 {"safeToEvict": False},
                 "false",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                {"celery": {"safeToEvict": False}},
+                "false",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
                 {
@@ -1330,6 +1386,14 @@ class TestWorker:
                 },
                 "true",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                    "celery": {"safeToEvict": False},
+                },
+                "true",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
                 {
@@ -1338,6 +1402,14 @@ class TestWorker:
                 },
                 "false",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                    "celery": {"safeToEvict": False},
+                },
+                "false",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
                 {
@@ -1346,6 +1418,14 @@ class TestWorker:
                 },
                 "true",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                    "celery": {"safeToEvict": False},
+                },
+                "true",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
                 {
@@ -1354,6 +1434,14 @@ class TestWorker:
                 },
                 "false",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                    "celery": {"safeToEvict": False},
+                },
+                "false",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
                 {
@@ -1362,6 +1450,14 @@ class TestWorker:
                 },
                 "true",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                    "celery": {"safeToEvict": True},
+                },
+                "true",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
                 {
@@ -1370,6 +1466,14 @@ class TestWorker:
                 },
                 "false",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                    "celery": {"safeToEvict": True},
+                },
+                "false",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
                 {
@@ -1378,6 +1482,14 @@ class TestWorker:
                 },
                 "true",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"},
+                    "celery": {"safeToEvict": True},
+                },
+                "true",
+            ),
             (
                 {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
                 {
@@ -1386,6 +1498,14 @@ class TestWorker:
                 },
                 "false",
             ),
+            (
+                {"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                {
+                    "podAnnotations": 
{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"},
+                    "celery": {"safeToEvict": True},
+                },
+                "false",
+            ),
         ],
     )
     def test_safetoevict_annotations(self, globalScope, localScope, 
precedence):
diff --git a/helm-tests/tests/helm_tests/airflow_core/test_worker_sets.py 
b/helm-tests/tests/helm_tests/airflow_core/test_worker_sets.py
index 69c8234bd99..d5f3180b22b 100644
--- a/helm-tests/tests/helm_tests/airflow_core/test_worker_sets.py
+++ b/helm-tests/tests/helm_tests/airflow_core/test_worker_sets.py
@@ -2210,16 +2210,26 @@ class TestWorkerSets:
 
         assert 
jmespath.search("spec.template.spec.terminationGracePeriodSeconds", docs[0]) == 
5
 
-    def test_overwrite_safe_to_evict_enable(self):
-        docs = render_chart(
-            values={
-                "workers": {
-                    "celery": {
-                        "enableDefault": False,
-                        "sets": [{"name": "set1", "safeToEvict": True}],
-                    },
+    @pytest.mark.parametrize(
+        "workers_values",
+        [
+            {"celery": {"enableDefault": False, "sets": [{"name": "set1", 
"safeToEvict": True}]}},
+            {
+                "celery": {
+                    "safeToEvict": False,
+                    "enableDefault": False,
+                    "sets": [{"name": "set1", "safeToEvict": True}],
                 }
             },
+            {
+                "safeToEvict": False,
+                "celery": {"enableDefault": False, "sets": [{"name": "set1", 
"safeToEvict": True}]},
+            },
+        ],
+    )
+    def test_overwrite_safe_to_evict_enable(self, workers_values):
+        docs = render_chart(
+            values={"workers": workers_values},
             show_only=["templates/workers/worker-deployment.yaml"],
         )
 
@@ -2230,17 +2240,25 @@ class TestWorkerSets:
             == "true"
         )
 
-    def test_overwrite_safe_to_evict_disable(self):
-        docs = render_chart(
-            values={
-                "workers": {
+    @pytest.mark.parametrize(
+        "workers_values",
+        [
+            {
+                "celery": {
                     "safeToEvict": True,
-                    "celery": {
-                        "enableDefault": False,
-                        "sets": [{"name": "set1", "safeToEvict": False}],
-                    },
+                    "enableDefault": False,
+                    "sets": [{"name": "set1", "safeToEvict": False}],
                 }
             },
+            {
+                "safeToEvict": True,
+                "celery": {"enableDefault": False, "sets": [{"name": "set1", 
"safeToEvict": False}]},
+            },
+        ],
+    )
+    def test_overwrite_safe_to_evict_disable(self, workers_values):
+        docs = render_chart(
+            values={"workers": workers_values},
             show_only=["templates/workers/worker-deployment.yaml"],
         )
 

Reply via email to