This is an automated email from the ASF dual-hosted git repository.
potiuk 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 57d3fd7cf32 Fix job_name normalization in KubernetesJobOperator
(#60231)
57d3fd7cf32 is described below
commit 57d3fd7cf32111a5b7e1094728a8ee9f4d6a0a52
Author: Quentin Sommer <[email protected]>
AuthorDate: Wed Jan 7 14:56:40 2026 -0500
Fix job_name normalization in KubernetesJobOperator (#60231)
---
.../providers/cncf/kubernetes/operators/job.py | 1 +
.../unit/cncf/kubernetes/operators/test_job.py | 36 ++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git
a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/job.py
b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/job.py
index 46cdb3a29fd..a470b6eac4f 100644
---
a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/job.py
+++
b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/job.py
@@ -188,6 +188,7 @@ class KubernetesJobOperator(KubernetesPodOperator):
return job_request_obj
def execute(self, context: Context):
+ self.name = self._set_name(self.name)
if self.deferrable and not self.wait_until_job_complete:
self.log.warning(
"Deferrable mode is available only with parameter
`wait_until_job_complete=True`. "
diff --git
a/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_job.py
b/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_job.py
index c27c04a80d7..4c8289ed42b 100644
--- a/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_job.py
+++ b/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_job.py
@@ -498,6 +498,42 @@ class TestKubernetesJobOperator:
job = k.build_job_request_obj({})
assert re.match(r"job-a-very-reasonable-task-name-[a-z0-9-]+",
job.metadata.name) is not None
+ @pytest.mark.parametrize("randomize", [True, False])
+ @pytest.mark.non_db_test_override
+
@patch(JOB_OPERATORS_PATH.format("KubernetesJobOperator.get_or_create_pod"))
+
@patch(JOB_OPERATORS_PATH.format("KubernetesJobOperator.build_job_request_obj"))
+ @patch(JOB_OPERATORS_PATH.format("KubernetesJobOperator.create_job"))
+ @patch(HOOK_CLASS)
+ def test_name_normalized_on_execution(
+ self, mock_hook, mock_create_job, mock_build_job_request_obj,
mock_get_or_create_pod, randomize
+ ):
+ """Test that names with underscores are normalized to hyphens on
execution."""
+ name_base = "test_extra-123"
+ normalized_name = "test-extra-123"
+
+ mock_hook.return_value.is_job_failed.return_value = False
+ mock_job = mock.MagicMock()
+ mock_job.metadata.name = f"job-{normalized_name}"
+ mock_job.metadata.namespace = "default"
+ mock_create_job.return_value = mock_job
+ mock_ti = mock.MagicMock()
+ context = dict(ti=mock_ti)
+
+ op = KubernetesJobOperator(
+ name=name_base,
+ random_name_suffix=randomize,
+ task_id="task",
+ )
+
+ with pytest.warns(AirflowProviderDeprecationWarning):
+ op.execute(context=context)
+
+ # Verify the name was normalized (underscore replaced with hyphen)
+ if randomize:
+ assert op.name.startswith(normalized_name)
+ else:
+ assert op.name == normalized_name
+
@pytest.mark.non_db_test_override
@patch(JOB_OPERATORS_PATH.format("KubernetesJobOperator.get_or_create_pod"))
@patch(JOB_OPERATORS_PATH.format("KubernetesJobOperator.build_job_request_obj"))