You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by mi...@apache.org on 2026/09/12 20:32:31 UTC
(airflow) branch chart/v1-2x-test updated: [chart/v1-2x-test] Fix Helm chart rendering an invalid label for multi-team executors (#72200) (#72441)
This is an automated email from the ASF dual-hosted git repository.
Miretpl 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 9e2fa672177 [chart/v1-2x-test] Fix Helm chart rendering an invalid label for multi-team executors (#72200) (#72441)
9e2fa672177 is described below
commit 9e2fa672177840b7e934848d0b41d3efdb07a1ac
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Sat Sep 12 22:32:22 2026 +0200
[chart/v1-2x-test] Fix Helm chart rendering an invalid label for multi-team executors (#72200) (#72441)
The scheduler Deployment copies the executor value into a pod label and sanitises "," and ":" on the way through. Multi-team executor config uses ";" and "=" as its separators, and neither is legal in a Kubernetes label value, so a chart configured the documented multi-team way renders a label the API server rejects and the deploy fails outright.
Why this is worth fixing rather than working around: multi-team executors are what the edge worker's --team-name flag depends on. EdgeExecutor stamps each edge_job row with its executor's team, and a worker started with --team-name only picks up jobs whose team matches. Without a per-team executor entry the jobs get stamped NULL, the worker sits there reporting it has no work, and the tasks stay queued.
There isn't a good way around it from values.yaml. Quoting doesn't help, because the restriction is on the characters in the label rather than on the YAML. Setting config.core.executor instead is refused by the check in NOTES.txt. Overriding the label through .Values.labels does render, but it stamps the label on every object in the chart and breaks the migrations Job, whose pod template can't be changed in place.
Sanitising ";" and "=" alongside the separators the chart already handles keeps the label legal while airflow.cfg still gets the real value.
(cherry picked from commit 7036d244b138463acc7849d5e38b419cd800e990)
Co-authored-by: KidAmnesiac1 <co...@gmail.com>
Co-authored-by: Przemysław Mirowski <17...@users.noreply.github.com>
---
.../templates/scheduler/scheduler-deployment.yaml | 2 +-
.../helm_tests/airflow_core/test_scheduler.py | 23 ++++++++++++++++++++--
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/chart/templates/scheduler/scheduler-deployment.yaml b/chart/templates/scheduler/scheduler-deployment.yaml
index 9999d856627..bfb28dc5555 100644
--- a/chart/templates/scheduler/scheduler-deployment.yaml
+++ b/chart/templates/scheduler/scheduler-deployment.yaml
@@ -54,7 +54,7 @@ metadata:
release: {{ .Release.Name }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
heritage: {{ .Release.Service }}
- executor: {{ .Values.executor | replace "," "-" | replace ":" "-" | trunc 63 | trimSuffix "-" | trimSuffix ":" | trimSuffix "_" | trimSuffix "." | quote }}
+ executor: {{ .Values.executor | replace "," "-" | replace ":" "-" | replace ";" "-" | replace "=" "-" | trunc 63 | trimSuffix "-" | trimSuffix ":" | trimSuffix "_" | trimSuffix "." | quote }}
{{- with .Values.labels }}
{{- toYaml . | nindent 4 }}
{{- end }}
diff --git a/helm-tests/tests/helm_tests/airflow_core/test_scheduler.py b/helm-tests/tests/helm_tests/airflow_core/test_scheduler.py
index 4622db151a8..1fb01e25d0e 100644
--- a/helm-tests/tests/helm_tests/airflow_core/test_scheduler.py
+++ b/helm-tests/tests/helm_tests/airflow_core/test_scheduler.py
@@ -16,6 +16,8 @@
# under the License.
from __future__ import annotations
+import re
+
import jmespath
import pytest
from chart_utils.helm_template_generator import render_chart
@@ -1145,6 +1147,20 @@ class TestSchedulerService:
("KubernetesExecutor", "KubernetesExecutor"),
("LocalKubernetesExecutor", "LocalKubernetesExecutor"),
("CeleryExecutor,KubernetesExecutor", "CeleryExecutor-KubernetesExecutor"),
+ (
+ "CeleryExecutor,harvest_exec:KubernetesExecutor",
+ "CeleryExecutor-harvest_exec-KubernetesExecutor",
+ ),
+ ("LocalExecutor;team_a=CeleryExecutor", "LocalExecutor-team_a-CeleryExecutor"),
+ (
+ "LocalExecutor;team_a=CeleryExecutor;team_b=KubernetesExecutor",
+ "LocalExecutor-team_a-CeleryExecutor-team_b-KubernetesExecutor",
+ ),
+ (
+ "airflow.providers.edge3.executors.EdgeExecutor;"
+ "team_b=airflow.providers.edge3.executors.EdgeExecutor",
+ "airflow.providers.edge3.executors.EdgeExecutor-team_b-airflow.p",
+ ),
],
)
def test_should_add_executor_labels(self, executor, expected_label):
@@ -1155,8 +1171,11 @@ class TestSchedulerService:
show_only=["templates/scheduler/scheduler-deployment.yaml"],
)
- assert "executor" in jmespath.search("metadata.labels", docs[0])
- assert jmespath.search("metadata.labels", docs[0])["executor"] == expected_label
+ label = jmespath.search("metadata.labels", docs[0])["executor"]
+ assert label == expected_label
+ assert re.fullmatch(r"[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?", label), (
+ f"{label!r} is not a valid Kubernetes label value"
+ )
class TestSchedulerServiceAccount: