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

jason810496 pushed a commit to branch jason/lang-sdk-e2e/08-native-e2e
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit dedaa3048e3b5b3d382cf160beb9544e1d4ba221
Author: ZHE YOU LIU <[email protected]>
AuthorDate: Mon Sep 28 12:34:28 2026 +0000

    Build the k8s TypeScript artifacts only for the native Dag test
    
    setup-lang-sdk-test packed the TypeScript bundle and built its worker image
    for every lang-SDK run, so the Go and Java k8s job, which provisions no Node
    toolchain, failed during setup. Build and upload them only with
    --ts-sdk-native-dag-test (RUN_TS_SDK_NATIVE_DAG_K8S_TESTS), the variable the
    native TypeScript k8s test is gated on.
---
 dev/breeze/doc/images/output_k8s.svg               |  26 ++---
 dev/breeze/doc/images/output_k8s.txt               |   2 +-
 .../doc/images/output_k8s_setup-lang-sdk-test.svg  |  96 +++++++++++++-----
 .../doc/images/output_k8s_setup-lang-sdk-test.txt  |   2 +-
 .../airflow_breeze/commands/kubernetes_commands.py | 100 ++++++++++++-------
 .../commands/kubernetes_commands_config.py         |   1 +
 .../tests/test_kubernetes_lang_sdk_commands.py     | 108 +++++++++++++++++++++
 7 files changed, 261 insertions(+), 74 deletions(-)

diff --git a/dev/breeze/doc/images/output_k8s.svg 
b/dev/breeze/doc/images/output_k8s.svg
index 92f835a53e8..8c3c725e05c 100644
--- a/dev/breeze/doc/images/output_k8s.svg
+++ b/dev/breeze/doc/images/output_k8s.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1026.0" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1050.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-k8s-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="975.0" />
+      <rect x="0" y="0" width="1463.0" height="999.4" />
     </clipPath>
     <clipPath id="breeze-k8s-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -162,9 +162,12 @@
 <clipPath id="breeze-k8s-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-k8s-line-39">
+    <rect x="0" y="953.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1024" rx="8"/><text class="breeze-k8s-title" 
fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1048.4" rx="8"/><text class="breeze-k8s-title" 
fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -206,14 +209,15 @@
 </text><text class="breeze-k8s-r5" x="0" y="727.6" textLength="12.2" 
clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="727.6" textLength="1159" 
clip-path="url(#breeze-k8s-line-29)">resources,&#160;and&#160;run&#160;the&#160;optional&#160;per-overlay&#160;pytest&#160;module.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
 </text><text class="breeze-k8s-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="752" textLength="231.8" 
clip-path="url(#breeze-k8s-line-30)">run-complete-tests&#160;</text><text 
class="breeze-k8s-r1" x="280.6" y="752" textLength="1159" 
clip-path="url(#breeze-k8s-line-30)">Run&#160;complete&#160;k8s&#160;tests&#160;consisting&#160;of:&#160;creating&#160;cluster,&#160;building&#160;and&#160;uploading&#160;image,&#160;d
 [...]
 </text><text class="breeze-k8s-r5" x="0" y="776.4" textLength="12.2" 
clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="776.4" textLength="1159" 
clip-path="url(#breeze-k8s-line-31)">airflow,&#160;running&#160;tests&#160;and&#160;deleting&#160;clusters&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r5" x="1451.8" y="776.4" textLength="12.2" clip-path=" [...]
-</text><text class="breeze-k8s-r5" x="0" y="800.8" textLength="12.2" 
clip-path="url(#breeze-k8s-line-32)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="800.8" textLength="231.8" 
clip-path="url(#breeze-k8s-line-32)">setup-lang-sdk-test</text><text 
class="breeze-k8s-r1" x="280.6" y="800.8" textLength="1159" 
clip-path="url(#breeze-k8s-line-32)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java&#160;+&#160;TypeScript)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;alr
 [...]
-</text><text class="breeze-k8s-r5" x="0" y="825.2" textLength="12.2" 
clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="825.2" textLength="1159" 
clip-path="url(#breeze-k8s-line-33)">KubernetesExecutor&#160;cluster:&#160;build&#160;artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;and&#160;TypeScript&#160;worker&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(# 
[...]
-</text><text class="breeze-k8s-r5" x="0" y="849.6" textLength="12.2" 
clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="849.6" textLength="1159" 
clip-path="url(#breeze-k8s-line-34)">images,&#160;deploy&#160;localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;upgrade&#160;the&#160;Helm&#160;</text><text
 class="breeze-k8s-r5" x="1451.8" y="849.6" textLength="12.2" 
clip-path="url(#breeze-k8s-line [...]
-</text><text class="breeze-k8s-r5" x="0" y="874" textLength="12.2" 
clip-path="url(#breeze-k8s-line-35)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="874" textLength="1024.8" 
clip-path="url(#breeze-k8s-line-35)">release.&#160;Run&#160;the&#160;test&#160;afterwards&#160;with&#160;`RUN_LANG_SDK_K8S_TESTS=true&#160;breeze&#160;k8s&#160;tests&#160;</text><text
 class="breeze-k8s-r4" x="1305.4" y="874" textLength="122" 
clip-path="url(#breeze-k8s-line-35)">--executor</text><text class="breez [...]
-</text><text class="breeze-k8s-r5" x="0" y="898.4" textLength="12.2" 
clip-path="url(#breeze-k8s-line-36)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="898.4" textLength="268.4" 
clip-path="url(#breeze-k8s-line-36)">KubernetesExecutor&#160;--&#160;</text><text
 class="breeze-k8s-r6" x="549" y="898.4" textLength="24.4" 
clip-path="url(#breeze-k8s-line-36)">-k</text><text class="breeze-k8s-r1" 
x="573.4" y="898.4" textLength="866.2" 
clip-path="url(#breeze-k8s-line-36)">&#160;test_lang_sdk_c [...]
-</text><text class="breeze-k8s-r5" x="0" y="922.8" textLength="12.2" 
clip-path="url(#breeze-k8s-line-37)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="922.8" textLength="231.8" 
clip-path="url(#breeze-k8s-line-37)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r1" x="280.6" y="922.8" textLength="1159" 
clip-path="url(#breeze-k8s-line-37)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#16
 [...]
-</text><text class="breeze-k8s-r5" x="0" y="947.2" textLength="12.2" 
clip-path="url(#breeze-k8s-line-38)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="947.2" textLength="231.8" 
clip-path="url(#breeze-k8s-line-38)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r1" x="280.6" y="947.2" textLength="1159" 
clip-path="url(#breeze-k8s-line-38)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;
 [...]
-</text><text class="breeze-k8s-r5" x="0" y="971.6" textLength="1464" 
clip-path="url(#breeze-k8s-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-r1" x="1464" y="971.6" textLength="12.2" 
clip-path="url(#breeze-k8s-line-39)">
+</text><text class="breeze-k8s-r5" x="0" y="800.8" textLength="12.2" 
clip-path="url(#breeze-k8s-line-32)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="800.8" textLength="231.8" 
clip-path="url(#breeze-k8s-line-32)">setup-lang-sdk-test</text><text 
class="breeze-k8s-r1" x="280.6" y="800.8" textLength="1159" 
clip-path="url(#breeze-k8s-line-32)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;&#16
 [...]
+</text><text class="breeze-k8s-r5" x="0" y="825.2" textLength="12.2" 
clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="825.2" textLength="1159" 
clip-path="url(#breeze-k8s-line-33)">KubernetesExecutor&#160;cluster:&#160;build&#160;artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;worker&#160;image,&#160;deploy&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r5" x="1451.8" y="825.2" textLength="12.2" clip-path=" [...]
+</text><text class="breeze-k8s-r5" x="0" y="849.6" textLength="12.2" 
clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="849.6" textLength="1159" 
clip-path="url(#breeze-k8s-line-34)">localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;upgrade&#160;the&#160;Helm&#160;release.&#160;With&#160;&#160;</text><text
 class="breeze-k8s-r5" x="1451.8" y="849.6" textLength="12.2" 
clip-path="url(#breeze-k8s [...]
+</text><text class="breeze-k8s-r5" x="0" y="874" textLength="12.2" 
clip-path="url(#breeze-k8s-line-35)">│</text><text class="breeze-k8s-r4" 
x="280.6" y="874" textLength="292.8" 
clip-path="url(#breeze-k8s-line-35)">--ts-sdk-native-dag-test</text><text 
class="breeze-k8s-r1" x="573.4" y="874" textLength="866.2" 
clip-path="url(#breeze-k8s-line-35)">&#160;it&#160;also&#160;builds&#160;the&#160;TypeScript&#160;bundle&#160;and&#160;worker&#160;image.&#160;Run&#160;the&#160;test&#160;&#160;&#160
 [...]
+</text><text class="breeze-k8s-r5" x="0" y="898.4" textLength="12.2" 
clip-path="url(#breeze-k8s-line-36)">│</text><text class="breeze-k8s-r1" 
x="280.6" y="898.4" textLength="756.4" 
clip-path="url(#breeze-k8s-line-36)">afterwards&#160;with&#160;`RUN_LANG_SDK_K8S_TESTS=true&#160;breeze&#160;k8s&#160;tests&#160;</text><text
 class="breeze-k8s-r4" x="1037" y="898.4" textLength="122" 
clip-path="url(#breeze-k8s-line-36)">--executor</text><text 
class="breeze-k8s-r1" x="1159" y="898.4" textLength [...]
+</text><text class="breeze-k8s-r5" x="0" y="922.8" textLength="12.2" 
clip-path="url(#breeze-k8s-line-37)">│</text><text class="breeze-k8s-r6" 
x="280.6" y="922.8" textLength="24.4" 
clip-path="url(#breeze-k8s-line-37)">-k</text><text class="breeze-k8s-r1" 
x="305" y="922.8" textLength="1134.6" 
clip-path="url(#breeze-k8s-line-37)">&#160;test_lang_sdk_combined_dag_succeeds`.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-k8s-r5" x="0" y="947.2" textLength="12.2" 
clip-path="url(#breeze-k8s-line-38)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="947.2" textLength="231.8" 
clip-path="url(#breeze-k8s-line-38)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r1" x="280.6" y="947.2" textLength="1159" 
clip-path="url(#breeze-k8s-line-38)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#16
 [...]
+</text><text class="breeze-k8s-r5" x="0" y="971.6" textLength="12.2" 
clip-path="url(#breeze-k8s-line-39)">│</text><text class="breeze-k8s-r4" 
x="24.4" y="971.6" textLength="231.8" 
clip-path="url(#breeze-k8s-line-39)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-r1" x="280.6" y="971.6" textLength="1159" 
clip-path="url(#breeze-k8s-line-39)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;
 [...]
+</text><text class="breeze-k8s-r5" x="0" y="996" textLength="1464" 
clip-path="url(#breeze-k8s-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-r1" x="1464" y="996" textLength="12.2" 
clip-path="url(#breeze-k8s-line-40)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_k8s.txt 
b/dev/breeze/doc/images/output_k8s.txt
index b983d60ab98..b33ca1c53a8 100644
--- a/dev/breeze/doc/images/output_k8s.txt
+++ b/dev/breeze/doc/images/output_k8s.txt
@@ -1 +1 @@
-e6bce3a1cc0d3660f16669fe5c4b1338
+7275bb89187fba314464a6566f7bf7fe
diff --git a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg 
b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
index a9e646da6c4..cfecd2b0602 100644
--- a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
+++ b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 684.4" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 952.8" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-k8s-setup-lang-sdk-test-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="633.4" />
+      <rect x="0" y="0" width="1463.0" height="901.8" />
     </clipPath>
     <clipPath id="breeze-k8s-setup-lang-sdk-test-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -120,9 +120,42 @@
 <clipPath id="breeze-k8s-setup-lang-sdk-test-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-28">
+    <rect x="0" y="684.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-29">
+    <rect x="0" y="709.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-30">
+    <rect x="0" y="733.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-31">
+    <rect x="0" y="757.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-32">
+    <rect x="0" y="782.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-33">
+    <rect x="0" y="806.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-34">
+    <rect x="0" y="831.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-35">
+    <rect x="0" y="855.5" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="682.4" rx="8"/><text 
class="breeze-k8s-setup-lang-sdk-test-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;k8s&#160;setup-lang-sdk-test</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="950.8" rx="8"/><text 
class="breeze-k8s-setup-lang-sdk-test-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;k8s&#160;setup-lang-sdk-test</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -135,29 +168,40 @@
     <text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="20" 
textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-0)">
 </text><text class="breeze-k8s-setup-lang-sdk-test-r2" x="12.2" y="44.4" 
textLength="73.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">Usage:</text><text 
class="breeze-k8s-setup-lang-sdk-test-r3" x="97.6" y="44.4" textLength="366" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">breeze&#160;k8s&#160;setup-lang-sdk-test</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="475.8" y="44.4" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">[</te [...]
 </text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="68.8" 
textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-2)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="93.2" 
textLength="1390.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java&#160;+&#160;TypeScript)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;KubernetesExecutor&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="117.6" 
textLength="1439.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-4)">cluster:&#160;build&#160;artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;and&#160;TypeScript&#160;worker&#160;images,&#160;deploy&#160;localstack&#160;S3,&#160;upload&#160;artifacts&#160;+</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test- [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="142" 
textLength="1378.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;upgrade&#160;the&#160;Helm&#160;release.&#160;Run&#160;the&#160;test&#160;afterwards&#160;with&#160;`RUN_LANG_SDK_K8S_TESTS=true&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="142" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="166.4" 
textLength="207.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">breeze&#160;k8s&#160;tests&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r4" x="219.6" y="166.4" textLength="122" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">--executor</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="166.4" 
textLength="280.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">&#1 
[...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="190.8" 
textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-7)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="215.2" 
textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">╭─</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="215.2" textLength="305" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">&#160;K8S&#160;lang-SDK&#160;test&#160;flags&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="329.4" y="215.2" 
textLength="1110.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8 [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="239.6" textLength="244" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">--python&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r5" x="292.8" y="239.6" 
textLength="24.4" clip-path="url(#breeze-k8s [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r7" x="341.6" y="264" textLength="317.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">3.11&#160;|&#160;3.12&#160;|&#160;3.13&#160;|&#160;3.14)</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="264" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-lin [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="288.4" textLength="244" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">--kubernetes-version</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="288.4" textLength="671" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">Kubernetes&#160;version&#160
 [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r7" x="341.6" y="312.8" 
textLength="597.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">v1.31.12&#160;|&#160;v1.32.8&#160;|&#160;v1.33.4&#160;|&#160;v1.34.0&#160;|&#160;v1.35.0)</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="312.8" 
textLength="12.2" clip-path=" [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="337.2" textLength="244" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">--go-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="337.2" textLength="976" 
clip-path="url(#breeze-k8s-setup-la [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="361.6" textLength="244" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">--java-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="361.6" 
textLength="1098" clip-path="url(#breeze-k8s-setup-lang-sdk-te [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="386" textLength="1098" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">the&#160;prod&#160;image&#160;plus&#160;a&#160;headless&#160;JRE&#160;(Dockerfile.java)&#160;and&#160;loading&#160;it&#160;into&#160;the&#160;kind&#160;cluster.</text><text
 class="breeze-k8s-setup-la [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r7" x="341.6" y="410.4" textLength="73.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">(TEXT)</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">│</text><text 
class="breeze-k8s-setup- [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-17)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="434.8" textLength="244" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-17)">--ts-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="434.8" 
textLength="1098" clip-path="url(#breeze-k8s-setup-l [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="459.2" textLength="1098" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">building&#160;the&#160;prod&#160;image&#160;plus&#160;Node&#160;(Dockerfile.typescript)&#160;and&#160;loading&#160;it&#160;into&#160;the&#160;kind&#160;&#160;&#160;&#160;</text><text
 class="breez [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="483.6" 
textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">cluster.&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r7" x="451.4" y="483.6" 
textLength="73.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">(TEXT)</text><text 
class="bree [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="508" 
textLength="1464" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="508" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="532.4" 
textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">╭─</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="532.4" textLength="195.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">&#160;Common&#160;options&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="219.6" y="532.4" 
textLength="1220" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">───────────── [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="556.8" textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">--verbose</text><text 
class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="556.8" textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">-v</text><text 
class="breeze-k8s-set [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-23)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="581.2" textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-23)">--dry-run</text><text 
class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="581.2" textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-23)">-D</text><text 
class="breeze-k8s-set [...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-24)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="605.6" textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-24)">--help&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="605.6" 
textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-24)">-h</text><text class= 
[...]
-</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="630" 
textLength="1464" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="630" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-25)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="93.2" 
textLength="1415.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;KubernetesExecutor&#160;cluster:&#160;build&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="117.6" 
textLength="1427.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-4)">artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;worker&#160;image,&#160;deploy&#160;localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang- [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="142" 
textLength="378.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">upgrade&#160;the&#160;Helm&#160;release.&#160;With&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r4" x="390.4" y="142" textLength="292.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">--ts-sdk-native-dag-test</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="683.2" y="142" textLength="768.6" 
clip-path="url(#breeze-k8 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="166.4" 
textLength="817.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">test&#160;afterwards&#160;with&#160;`RUN_LANG_SDK_K8S_TESTS=true&#160;breeze&#160;k8s&#160;tests&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r4" x="829.6" y="166.4" textLength="122" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">--executor</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="951.6" y="166.4" textLeng [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="190.8" 
textLength="451.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-7)">test_lang_sdk_combined_dag_succeeds`.</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="190.8" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-7)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="215.2" 
textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="239.6" 
textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">╭─</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="239.6" textLength="305" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">&#160;K8S&#160;lang-SDK&#160;test&#160;flags&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="329.4" y="239.6" 
textLength="1110.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="264" textLength="634.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">--python&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="288.4" textLength="97.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">images.&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="829.6" y="288.4" textLength="183" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">[default:&#160;3.10]</text><text
 cl [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r7" x="732" y="312.8" textLength="61" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">3.14)</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">│</text><text 
class="breeze-k8s-setup-lang- [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="337.2" textLength="634.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">--kubernetes-version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="732" y="361.6" textLength="231.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">[default:&#160;v1.30.13]</text><text
 class="breeze-k8s-setup-lang-sdk-test-r7" x="976" y="361.6" textLength="427" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">(&gt;v1.30.13&lt;&#160;|&
 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r7" x="732" y="386" textLength="341.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">v1.33.4&#160;|&#160;v1.34.0&#160;|&#160;v1.35.0)</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="386" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">│</ [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="410.4" textLength="634.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">--go-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-17)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="434.8" textLength="329.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-17)">Defaults&#160;to&#160;the&#160;k8s&#160;image.&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r7" x="1061.4" y="434.8" 
textLength="73.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-lin [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="459.2" textLength="634.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">--java-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="483.6" textLength="707.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">include&#160;a&#160;JRE.&#160;Defaults&#160;to&#160;building&#160;the&#160;prod&#160;image&#160;plus&#160;a&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="483.6" textLen [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="508" textLength="707.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">headless&#160;JRE&#160;(Dockerfile.java)&#160;and&#160;loading&#160;it&#160;into&#160;the&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="508" textLength="1 
[...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="532.4" textLength="170.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">kind&#160;cluster.&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r7" x="902.8" y="532.4" 
textLength="73.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">(TEXT)</text><text cla 
[...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="556.8" textLength="634.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">--ts-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-23)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="581.2" textLength="707.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-23)">Must&#160;include&#160;Node.&#160;Defaults&#160;to&#160;building&#160;the&#160;prod&#160;image&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="581.2" te [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-24)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="605.6" textLength="707.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-24)">plus&#160;Node&#160;(Dockerfile.typescript)&#160;and&#160;loading&#160;it&#160;into&#160;the&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="605.6" 
textLength="12.2" clip [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-25)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="630" textLength="292.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-25)">kind&#160;cluster.&#160;Used&#160;with&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r4" x="1024.8" y="630" 
textLength="292.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-25)">--ts-s [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-26)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="654.4" textLength="292.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-26)">--ts-sdk-native-dag-test</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="317.2" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-26)">/</text><text class=" 
[...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-27)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="678.8" textLength="707.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-27)">TypeScript&#160;bundle,&#160;which&#160;needs&#160;a&#160;Node&#160;toolchain,&#160;and&#160;build</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="678.8" 
textLength="12.2" clip [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-28)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="703.2" textLength="707.6" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-28)">the&#160;TypeScript&#160;worker&#160;image.&#160;Off&#160;by&#160;default,&#160;so&#160;the&#160;Go&#160;+&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="703.2" te [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-29)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r1" x="732" y="727.6" textLength="427" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-29)">Java&#160;test&#160;needs&#160;no&#160;Node&#160;toolchain.&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1159" y="727.6" textLength="122" 
clip-path="url(#breeze-k8s-setup-lang-sdk- [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-30)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="732" y="752" textLength="317.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-30)">no-ts-sdk-native-dag-test]</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="752" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-30)">│</text><text 
class="bree [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="776.4" 
textLength="1464" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="776.4" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-31)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="800.8" 
textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-32)">╭─</text><text 
class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="800.8" textLength="195.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-32)">&#160;Common&#160;options&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r6" x="219.6" y="800.8" 
textLength="1220" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-32)">───────────── [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-33)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="825.2" textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-33)">--verbose</text><text 
class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="825.2" textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-33)">-v</text><text 
class="breeze-k8s-set [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-34)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="849.6" textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-34)">--dry-run</text><text 
class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="849.6" textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-34)">-D</text><text 
class="breeze-k8s-set [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-35)">│</text><text 
class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="874" textLength="109.8" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-35)">--help&#160;&#160;&#160;</text><text
 class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="874" textLength="24.4" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-35)">-h</text><text 
class="breez [...]
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="898.4" 
textLength="1464" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="898.4" textLength="12.2" 
clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-36)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt 
b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
index c9d173a905d..1450c6d09a0 100644
--- a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
+++ b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
@@ -1 +1 @@
-6a9a0568a2b313fb5a6780431efd2937
+2f5c7f33daf8d4b751977d96d8214fc3
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py 
b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index 6b2eb800c5b..933c63b9d87 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -2933,9 +2933,13 @@ def _lang_sdk_deploy_localstack(python: str, 
kubernetes_version: str, output: Ou
 
 
 def _lang_sdk_upload_artifacts(
-    staging: Path, python: str, kubernetes_version: str, output: Output | None
+    staging: Path, python: str, kubernetes_version: str, output: Output | 
None, *, typescript: bool = False
 ) -> None:
-    """Copy artifacts + stub Dag into the localstack pod and create/fill S3 
buckets via awslocal."""
+    """
+    Copy artifacts + stub Dag into the localstack pod and create/fill S3 
buckets via awslocal.
+
+    ``typescript`` also uploads the TypeScript bundle and the Dag its native 
Dag triggers.
+    """
     pod = run_command_with_k8s_env(
         [
             "kubectl",
@@ -2957,30 +2961,43 @@ def _lang_sdk_upload_artifacts(
     ).stdout.strip()
 
     go_bundle = staging / "go-artifacts" / "lang_sdk_combined"
-    ts_bundle = staging / "ts-artifacts" / LANG_SDK_TS_BUNDLE_NAME
     if get_dry_run():
         # The dry-run build steps produce no jar; use the placeholder name so 
the commands still print.
         java_jar = staging / "java-artifacts" / "app.jar"
     else:
         java_jar = next((staging / "java-artifacts").glob("*.jar"))
     stub_dag = LANG_SDK_PATH / "dags" / "lang_sdk_combined.py"
-    # The native TypeScript Dag triggers this one, so it has to be in the
-    # cluster for its trigger task to have a target. It is the same Python Dag
-    # the mixed-language half of `ts-sdk/example` is written against.
-    ts_stub_dag = LANG_SDK_TS_EXAMPLE_PATH / "dags" / "typescript_example.py"
-
-    for src, dest in (
+    copies = [
         (go_bundle, "/tmp/go_bundle"),
         (java_jar, "/tmp/app.jar"),
-        (ts_bundle, f"/tmp/{LANG_SDK_TS_BUNDLE_NAME}"),
         (stub_dag, "/tmp/lang_sdk_combined.py"),
-        (ts_stub_dag, "/tmp/typescript_example.py"),
-    ):
+    ]
+    buckets = ["go-artifacts", "java-artifacts", "dags"]
+    uploads = [
+        ("/tmp/go_bundle", "s3://go-artifacts/lang_sdk_combined"),
+        ("/tmp/app.jar", "s3://java-artifacts/app.jar"),
+        ("/tmp/lang_sdk_combined.py", "s3://dags/lang_sdk_combined.py"),
+    ]
+    if typescript:
+        # The native TypeScript Dag triggers typescript_example, so it has to 
be in the
+        # cluster for its trigger task to have a target. It is the same Python 
Dag
+        # the mixed-language half of `ts-sdk/example` is written against.
+        copies += [
+            (staging / "ts-artifacts" / LANG_SDK_TS_BUNDLE_NAME, 
f"/tmp/{LANG_SDK_TS_BUNDLE_NAME}"),
+            (LANG_SDK_TS_EXAMPLE_PATH / "dags" / "typescript_example.py", 
"/tmp/typescript_example.py"),
+        ]
+        buckets.append("ts-artifacts")
+        uploads += [
+            (f"/tmp/{LANG_SDK_TS_BUNDLE_NAME}", 
f"s3://ts-artifacts/{LANG_SDK_TS_BUNDLE_NAME}"),
+            ("/tmp/typescript_example.py", "s3://dags/typescript_example.py"),
+        ]
+
+    for src, dest in copies:
         _lang_sdk_kubectl(
             ["cp", str(src), f"{HELM_AIRFLOW_NAMESPACE}/{pod}:{dest}"], 
python, kubernetes_version, output
         )
 
-    for bucket in ("go-artifacts", "java-artifacts", "ts-artifacts", "dags"):
+    for bucket in buckets:
         _lang_sdk_kubectl(
             ["exec", "-n", HELM_AIRFLOW_NAMESPACE, pod, "--", "awslocal", 
"s3", "mb", f"s3://{bucket}"],
             python,
@@ -2988,13 +3005,6 @@ def _lang_sdk_upload_artifacts(
             output,
             check=False,
         )
-    uploads = (
-        ("/tmp/go_bundle", "s3://go-artifacts/lang_sdk_combined"),
-        ("/tmp/app.jar", "s3://java-artifacts/app.jar"),
-        (f"/tmp/{LANG_SDK_TS_BUNDLE_NAME}", 
f"s3://ts-artifacts/{LANG_SDK_TS_BUNDLE_NAME}"),
-        ("/tmp/lang_sdk_combined.py", "s3://dags/lang_sdk_combined.py"),
-        ("/tmp/typescript_example.py", "s3://dags/typescript_example.py"),
-    )
     for src, dest in uploads:
         _lang_sdk_kubectl(
             ["exec", "-n", HELM_AIRFLOW_NAMESPACE, pod, "--", "awslocal", 
"s3", "cp", src, dest],
@@ -3179,17 +3189,21 @@ def _setup_lang_sdk_test(
     go_image: str | None = None,
     java_image: str | None = None,
     ts_image: str | None = None,
+    ts_sdk_native_dag_test: bool = False,
     output: Output | None = None,
 ) -> None:
     """Provision the lang-SDK coordinator env on an already-deployed 
KubernetesExecutor cluster.
 
-    Resolves the go-sdk/java-sdk sources, then builds the Go/Java/TypeScript 
artifacts, the Java
-    and TypeScript worker images and deploys localstack in parallel, then 
serially uploads the
-    artifacts, applies the config + secret, and helm-upgrades Airflow with the 
lang-SDK values.
+    Resolves the go-sdk/java-sdk sources, then builds the Go/Java artifacts, 
the Java worker
+    image and deploys localstack in parallel, then serially uploads the 
artifacts, applies the
+    config + secret, and helm-upgrades Airflow with the lang-SDK values.
+
+    ``ts_sdk_native_dag_test`` also builds the TypeScript bundle and worker 
image, which need a
+    Node toolchain, for the native TypeScript Dag test.
     """
     go_image = go_image or 
f"{BuildProdParams(python=python).airflow_image_kubernetes}:latest"
     build_java_image = java_image is None
-    build_ts_image = ts_image is None
+    build_ts_image = ts_sdk_native_dag_test and ts_image is None
     if java_image is None:
         # The worker-image build below produces this fixed tag; resolve it 
up-front so the config
         # rendering (which needs the tag, not the build result) does not 
depend on the parallel run.
@@ -3211,12 +3225,14 @@ def _setup_lang_sdk_test(
                 "Build Java jar",
                 lambda o: _lang_sdk_build_java_jar(staging, java_sdk_source, 
o, native=native),
             ),
-            (
-                "Build TypeScript bundle",
-                lambda o: _lang_sdk_build_ts_bundle(staging, o, native=native),
-            ),
-            ("Deploy localstack", lambda o: 
_lang_sdk_deploy_localstack(python, kubernetes_version, o)),
         ]
+        if ts_sdk_native_dag_test:
+            steps.append(
+                ("Build TypeScript bundle", lambda o: 
_lang_sdk_build_ts_bundle(staging, o, native=native))
+            )
+        steps.append(
+            ("Deploy localstack", lambda o: 
_lang_sdk_deploy_localstack(python, kubernetes_version, o))
+        )
         if build_java_image:
             steps.append(
                 (
@@ -3232,17 +3248,19 @@ def _setup_lang_sdk_test(
                 )
             )
         _run_lang_sdk_parallel(steps, output=output)
-        _lang_sdk_upload_artifacts(staging, python, kubernetes_version, output)
+        _lang_sdk_upload_artifacts(
+            staging, python, kubernetes_version, output, 
typescript=ts_sdk_native_dag_test
+        )
     _lang_sdk_apply_configmaps_and_secret(python, kubernetes_version, 
go_image, java_image, ts_image, output)
     _lang_sdk_deploy_airflow(python, kubernetes_version, output)
 
 
 @kubernetes_group.command(
     name="setup-lang-sdk-test",
-    help="Provision the lang-SDK (Go + Java + TypeScript) coordinator system 
test on an "
-    "already-deployed KubernetesExecutor cluster: build artifacts, build + 
load the Java and "
-    "TypeScript worker images, deploy localstack S3, upload artifacts + stub 
Dag, create config, "
-    "and upgrade the Helm release. "
+    help="Provision the lang-SDK (Go + Java) coordinator system test on an 
already-deployed "
+    "KubernetesExecutor cluster: build artifacts, build + load the Java worker 
image, deploy "
+    "localstack S3, upload artifacts + stub Dag, create config, and upgrade 
the Helm release. "
+    "With --ts-sdk-native-dag-test it also builds the TypeScript bundle and 
worker image. "
     "Run the test afterwards with `RUN_LANG_SDK_K8S_TESTS=true breeze k8s 
tests "
     "--executor KubernetesExecutor -- -k 
test_lang_sdk_combined_dag_succeeds`.",
 )
@@ -3260,7 +3278,17 @@ def _setup_lang_sdk_test(
 @click.option(
     "--ts-image",
     help="Image for the TypeScript (NodeCoordinator) worker pod. Must include 
Node. Defaults to "
-    "building the prod image plus Node (Dockerfile.typescript) and loading it 
into the kind cluster.",
+    "building the prod image plus Node (Dockerfile.typescript) and loading it 
into the kind cluster. "
+    "Used with --ts-sdk-native-dag-test.",
+)
[email protected](
+    "--ts-sdk-native-dag-test/--no-ts-sdk-native-dag-test",
+    help="Also provision the native TypeScript Dag test: pack the TypeScript 
bundle, which needs a "
+    "Node toolchain, and build the TypeScript worker image. Off by default, so 
the Go + Java test "
+    "needs no Node toolchain.",
+    default=False,
+    show_default=True,
+    envvar="RUN_TS_SDK_NATIVE_DAG_K8S_TESTS",
 )
 @option_verbose
 @option_dry_run
@@ -3270,6 +3298,7 @@ def setup_lang_sdk_test(
     go_image: str | None,
     java_image: str | None,
     ts_image: str | None,
+    ts_sdk_native_dag_test: bool,
 ):
     result = sync_virtualenv(force_venv_setup=False)
     if result.returncode != 0:
@@ -3281,6 +3310,7 @@ def setup_lang_sdk_test(
         go_image=go_image,
         java_image=java_image,
         ts_image=ts_image,
+        ts_sdk_native_dag_test=ts_sdk_native_dag_test,
         output=None,
     )
     console_print(
diff --git 
a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
index b72db432868..3f8a7a56558 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -57,6 +57,7 @@ KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--go-image",
                 "--java-image",
                 "--ts-image",
+                "--ts-sdk-native-dag-test",
             ],
         }
     ],
diff --git a/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py 
b/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py
index a94976a44e7..7a8276c2c35 100644
--- a/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py
+++ b/dev/breeze/tests/test_kubernetes_lang_sdk_commands.py
@@ -19,6 +19,7 @@ from __future__ import annotations
 from unittest import mock
 
 import pytest
+from click.testing import CliRunner
 
 from airflow_breeze.commands import kubernetes_commands
 from airflow_breeze.commands.kubernetes_commands import (
@@ -377,6 +378,113 @@ class TestSetupLangSdkTestNativeSelection:
         }
 
 
+class TestSetupLangSdkTestTypeScriptGate:
+    """The TypeScript artifacts need a Node toolchain, so only the native 
TypeScript Dag test builds them."""
+
+    @pytest.fixture
+    def recorded(self, monkeypatch, tmp_path):
+        recorded: dict[str, object] = {}
+
+        def fake_parallel(steps, output):
+            recorded["steps"] = [title for title, _thunk in steps]
+
+        monkeypatch.setattr(kubernetes_commands, "_run_lang_sdk_parallel", 
fake_parallel)
+        monkeypatch.setattr(
+            kubernetes_commands,
+            "_lang_sdk_resolve_sdk_sources",
+            lambda staging, output: (tmp_path / "go_sdk", tmp_path / 
"java_sdk"),
+        )
+        monkeypatch.setattr(
+            kubernetes_commands,
+            "_lang_sdk_upload_artifacts",
+            lambda *args, typescript: recorded.update(typescript=typescript),
+        )
+        for name in ("_lang_sdk_apply_configmaps_and_secret", 
"_lang_sdk_deploy_airflow"):
+            monkeypatch.setattr(kubernetes_commands, name, lambda *a, **k: 
None)
+        monkeypatch.setattr(
+            kubernetes_commands,
+            "BuildProdParams",
+            lambda python: mock.Mock(airflow_image_kubernetes="img"),
+        )
+        return recorded
+
+    @pytest.mark.parametrize(
+        ("kwargs", "expected_steps", "expected_typescript"),
+        [
+            pytest.param(
+                {},
+                ["Build Go bundle", "Build Java jar", "Deploy localstack", 
"Build Java worker image"],
+                False,
+                id="default-go-and-java-only",
+            ),
+            pytest.param(
+                {"ts_sdk_native_dag_test": True},
+                [
+                    "Build Go bundle",
+                    "Build Java jar",
+                    "Build TypeScript bundle",
+                    "Deploy localstack",
+                    "Build Java worker image",
+                    "Build TypeScript worker image",
+                ],
+                True,
+                id="native-ts-dag-test",
+            ),
+            pytest.param(
+                {"ts_sdk_native_dag_test": True, "ts_image": "my-ts-worker:1"},
+                [
+                    "Build Go bundle",
+                    "Build Java jar",
+                    "Build TypeScript bundle",
+                    "Deploy localstack",
+                    "Build Java worker image",
+                ],
+                True,
+                id="native-ts-dag-test-with-given-image",
+            ),
+        ],
+    )
+    def test_typescript_steps_follow_the_flag(self, recorded, kwargs, 
expected_steps, expected_typescript):
+        kubernetes_commands._setup_lang_sdk_test(python="3.10", 
kubernetes_version="v1.35.0", **kwargs)
+
+        assert recorded == {"steps": expected_steps, "typescript": 
expected_typescript}
+
+    @pytest.mark.parametrize("typescript", [False, True])
+    @mock.patch.object(kubernetes_commands, "run_command_with_k8s_env")
+    def test_upload_artifacts_uploads_typescript_only_when_asked(
+        self, mock_run, typescript, dry_run, tmp_path
+    ):
+        mock_run.return_value = mock.Mock(stdout="")
+
+        _lang_sdk_upload_artifacts(tmp_path, "3.10", "v1.35.0", None, 
typescript=typescript)
+
+        commands = [" ".join(map(str, call.args[0])) for call in 
mock_run.call_args_list]
+        assert any("ts-artifacts" in command for command in commands) is 
typescript
+        assert any("typescript_example.py" in command for command in commands) 
is typescript
+
+    @pytest.mark.parametrize(
+        ("args", "env", "expected"),
+        [
+            pytest.param([], {}, False, id="default"),
+            pytest.param(["--ts-sdk-native-dag-test"], {}, True, id="flag"),
+            pytest.param([], {"RUN_TS_SDK_NATIVE_DAG_K8S_TESTS": "true"}, 
True, id="env"),
+        ],
+    )
+    @mock.patch.object(kubernetes_commands, 
"make_sure_kubernetes_tools_are_installed")
+    @mock.patch.object(kubernetes_commands, "sync_virtualenv")
+    @mock.patch.object(kubernetes_commands, "_setup_lang_sdk_test")
+    def test_command_passes_the_flag(
+        self, mock_setup, mock_sync, _mock_tools, args, env, expected, 
monkeypatch
+    ):
+        monkeypatch.delenv("RUN_TS_SDK_NATIVE_DAG_K8S_TESTS", raising=False)
+        mock_sync.return_value = mock.Mock(returncode=0)
+
+        result = CliRunner().invoke(kubernetes_commands.setup_lang_sdk_test, 
args, env=env)
+
+        assert result.exit_code == 0, result.output
+        assert mock_setup.call_args.kwargs["ts_sdk_native_dag_test"] is 
expected
+
+
 class TestLangSdkResolveSdkSources:
     @pytest.fixture
     def repo_root(self, tmp_path, monkeypatch):

Reply via email to