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"],
)