You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ja...@apache.org on 2026/09/29 13:18:24 UTC
(airflow) 08/08: Build the k8s TypeScript artifacts only for the native Dag test
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 <zh...@gmail.com>
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: 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: 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, and run the optional per-overlay pytest module.                              &# [...]
</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 </text><text class="breeze-k8s-r1" x="280.6" y="752" textLength="1159" clip-path="url(#breeze-k8s-line-30)">Run complete k8s tests consisting of: creating cluster, building and uploading image, 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, running tests and deleting clusters (optionally for all clusters in parallel).        </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 the lang-SDK (Go + Java + TypeScript) coordinator system test on an 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 cluster: build artifacts, build + load the Java and TypeScript worker       </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, deploy localstack S3, upload artifacts + stub Dag, create config, and upgrade the Helm </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. Run the test afterwards with `RUN_LANG_SDK_K8S_TESTS=true breeze k8s tests </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 -- </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)"> 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              </text><text class="breeze-k8s-r1" x="280.6" y="922.8" textLength="1159" clip-path="url(#breeze-k8s-line-37)">Run shell environment for the current KinD [...]
-</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                </text><text class="breeze-k8s-r1" x="280.6" y="947.2" textLength="1159" clip-path="url(#breeze-k8s-line-38)">Run k9s tool. You can pass any  [...]
-</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 the lang-SDK (Go + Java) coordinator system test on an already-deployed  [...]
+</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 cluster: build artifacts, build + load the Java worker image, deploy        </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 S3, upload artifacts + stub Dag, create config, and upgrade the Helm release. With  </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)"> it also builds the TypeScript bundle and worker image. Run the test    [...]
+</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 with `RUN_LANG_SDK_K8S_TESTS=true breeze k8s tests </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)"> test_lang_sdk_combined_dag_succeeds`.                     [...]
+</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              </text><text class="breeze-k8s-r1" x="280.6" y="947.2" textLength="1159" clip-path="url(#breeze-k8s-line-38)">Run shell environment for the current KinD [...]
+</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                </text><text class="breeze-k8s-r1" x="280.6" y="971.6" textLength="1159" clip-path="url(#breeze-k8s-line-39)">Run k9s tool. You can pass any  [...]
+</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: k8s 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: k8s 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 k8s 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 the lang-SDK (Go + Java + TypeScript) coordinator system test on an already-deployed KubernetesExecutor </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: build artifacts, build + load the Java and TypeScript worker images, deploy localstack S3, upload artifacts +</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 Dag, create config, and upgrade the Helm release. Run the test afterwards with `RUN_LANG_SDK_K8S_TESTS=true </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 k8s tests </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)"> [...]
-</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)"> K8S lang-SDK test flags </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            </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 | 3.12 | 3.13 | 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 version  [...]
-</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 | v1.32.8 | v1.33.4 | v1.34.0 | 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          </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        </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 prod image plus a headless JRE (Dockerfile.java) and loading it into the kind 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          </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 the prod image plus Node (Dockerfile.typescript) and loading it into the kind    </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. </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)"> Common options </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   </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 the lang-SDK (Go + Java) coordinator system test on an already-deployed KubernetesExecutor cluster: build </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, build + load the Java worker image, deploy localstack S3, upload artifacts + stub Dag, create config, and </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 the Helm release. With </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 afterwards with `RUN_LANG_SDK_K8S_TESTS=true breeze k8s tests </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)"> K8S lang-SDK test flags </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                                 [...]
+</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. </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: 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                             & [...]
+</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: 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)">(>v1.30.13< |& [...]
+</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 | v1.34.0 | 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                                [...]
+</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 to the k8s image. </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                               [...]
+</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 a JRE. Defaults to building the prod image plus a </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 JRE (Dockerfile.java) and loading it into the    </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 cluster. </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                                [...]
+</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 include Node. Defaults to building the prod image    </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 Node (Dockerfile.typescript) and loading it into the </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 cluster. Used with </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 bundle, which needs a Node toolchain, and 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 TypeScript worker image. Off by default, so the Go +  </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 test needs no Node toolchain. </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)"> Common options </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   </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.",
+)
+@click.option(
+ "--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):