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