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: 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.", +) [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):
