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

Reply via email to