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

potiuk pushed a commit to branch hardened-python-base-images
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 30adda5d95248bf3aad267a7285e2221bb909ab9
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun Oct 11 17:20:02 2026 +0100

    Export KinD logs when the lang-SDK K8S test setup fails
    
    A failing lang-SDK helm upgrade raised past the log export that every other 
step of the complete K8S test run does, so the cluster was deleted with nothing 
saved and the job's KinD logs artifact stayed empty.
    
    Generated-by: Claude Opus 5
    Claude-Session: https://claude.ai/code/session_014np1fVAxHmGaBFt3qebJ8x
---
 .../airflow_breeze/commands/kubernetes_commands.py | 12 +++++-
 .../tests/test_kubernetes_lang_sdk_commands.py     | 45 ++++++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py 
b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index 1b5761f9174..58bfab51fb5 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -20,6 +20,7 @@ import multiprocessing as mp
 import os
 import re
 import shutil
+import subprocess
 import sys
 import tempfile
 from collections.abc import Callable
@@ -2206,7 +2207,16 @@ def _run_complete_tests(
                 f"\n[info]Provisioning lang-SDK test env for Python {python}, "
                 f"Kubernetes {kubernetes_version}\n"
             )
-            _setup_lang_sdk_test(python=python, 
kubernetes_version=kubernetes_version, output=output)
+            try:
+                _setup_lang_sdk_test(python=python, 
kubernetes_version=kubernetes_version, output=output)
+            except subprocess.CalledProcessError as e:
+                # The cluster is deleted when this returns, so the pod logs 
have to be exported now
+                # for the failing release to be diagnosable at all.
+                _logs(python=python, kubernetes_version=kubernetes_version)
+                return (
+                    e.returncode,
+                    f"Lang-SDK test setup failed for Python {python}, 
Kubernetes {kubernetes_version}",
+                )
         get_console(output=output).print(
             f"\n[info]Running tests Python {python}, Kubernetes 
{kubernetes_version}\n"
         )
diff --git a/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py 
b/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py
index aa26675b6ac..56965024d67 100644
--- a/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py
+++ b/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py
@@ -591,3 +591,48 @@ class TestLangSdkResolveSdkSources:
 
         mock_fetch.assert_called_once_with(tmp_path, None)
         assert (go_sdk, java_sdk) == (tmp_path / "go-sdk", tmp_path / 
"java-sdk")
+
+
+class TestRunCompleteTestsLangSdkSetupFailure:
+    @mock.patch.object(kubernetes_commands, "_run_tests", autospec=True)
+    @mock.patch.object(kubernetes_commands, "_logs", autospec=True)
+    @mock.patch.object(
+        kubernetes_commands,
+        "_setup_lang_sdk_test",
+        autospec=True,
+        side_effect=kubernetes_commands.subprocess.CalledProcessError(1, 
["helm", "upgrade"]),
+    )
+    @mock.patch.object(kubernetes_commands, "_deploy_airflow", autospec=True, 
return_value=(0, ""))
+    @mock.patch.object(
+        kubernetes_commands, "_preload_test_images_to_kind", autospec=True, 
return_value=(0, "")
+    )
+    @mock.patch.object(kubernetes_commands, "_upload_k8s_image", 
autospec=True, return_value=(0, ""))
+    @mock.patch.object(kubernetes_commands, "_configure_k8s_cluster", 
autospec=True, return_value=(0, ""))
+    @mock.patch.object(kubernetes_commands, "_create_cluster", autospec=True, 
return_value=(0, ""))
+    @mock.patch.object(kubernetes_commands, "_rebuild_k8s_image", 
autospec=True, return_value=(0, ""))
+    @mock.patch.object(kubernetes_commands, "_delete_cluster", autospec=True)
+    def 
test_failed_lang_sdk_setup_exports_logs_before_the_cluster_is_deleted(self, 
delete_cluster, *mocks):
+        run_tests, logs = mocks[-1], mocks[-2]
+        returncode, message = kubernetes_commands._run_complete_tests(
+            python="3.11",
+            kubernetes_version="v1.31.12",
+            include_success_outputs=False,
+            executor=kubernetes_commands.KUBERNETES_EXECUTOR,
+            rebuild_base_image=False,
+            copy_local_sources=False,
+            use_uv=True,
+            upgrade=False,
+            wait_time_in_seconds=0,
+            force_recreate_cluster=False,
+            use_standard_naming=False,
+            lang_sdk_test=True,
+            num_tries=1,
+            extra_options=None,
+            test_args=[],
+            output=None,
+        )
+
+        assert returncode == 1
+        assert "Lang-SDK test setup failed" in message
+        logs.assert_called_once_with(python="3.11", 
kubernetes_version="v1.31.12")
+        run_tests.assert_not_called()

Reply via email to