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

husseinawala pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 0e157b38a3 Fix K8S executor override config using pod_override_object 
(#35185)
0e157b38a3 is described below

commit 0e157b38a3e44b5a6fc084c581a025434a97a4c0
Author: Hussein Awala <[email protected]>
AuthorDate: Thu Nov 23 22:48:58 2023 +0200

    Fix K8S executor override config using pod_override_object (#35185)
    
    * Fix K8S executor override config using pod_override_object
    
    * Activate multi namespace mode for K8S tests
    
    * Force multi namespace for k8s tests
    
    * Increase timeout to test
    
    * Increase pytest execution-timeout
    
    * Support setuping multiple worker namespaces in the helm chart
    
    * Rollback chart changes
    
    * Revert timeout increase
    
    * Duplicate Airflow resources to test namespace
    
    * Fix the commands used to duplicate the resources
---
 airflow/providers/cncf/kubernetes/pod_generator.py |  4 +-
 .../airflow_breeze/commands/kubernetes_commands.py | 56 ++++++++++++++++++++++
 .../commands/kubernetes_commands_config.py         |  1 +
 .../src/airflow_breeze/utils/kubernetes_utils.py   |  2 +-
 dev/breeze/src/airflow_breeze/utils/run_utils.py   |  6 +--
 images/breeze/output_k8s_deploy-airflow.svg        | 50 ++++++++++---------
 images/breeze/output_k8s_deploy-airflow.txt        |  2 +-
 .../cncf/kubernetes/test_pod_generator.py          | 18 +++++--
 8 files changed, 106 insertions(+), 33 deletions(-)

diff --git a/airflow/providers/cncf/kubernetes/pod_generator.py 
b/airflow/providers/cncf/kubernetes/pod_generator.py
index 581aa61d16..69ca6201c4 100644
--- a/airflow/providers/cncf/kubernetes/pod_generator.py
+++ b/airflow/providers/cncf/kubernetes/pod_generator.py
@@ -434,8 +434,8 @@ class PodGenerator:
         )
 
         # Reconcile the pods starting with the first chronologically,
-        # Pod from the pod_template_File -> Pod from executor_config arg -> 
Pod from the K8s executor
-        pod_list = [base_worker_pod, pod_override_object, dynamic_pod]
+        # Pod from the pod_template_File -> Pod from the K8s executor -> Pod 
from executor_config arg
+        pod_list = [base_worker_pod, dynamic_pod, pod_override_object]
 
         try:
             pod = reduce(PodGenerator.reconcile_pods, pod_list)
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py 
b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index c46d2262ad..d90a856d25 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -167,6 +167,13 @@ option_use_standard_naming = click.option(
     envvar="USE_STANDARD_NAMING",
 )
 
+option_multi_namespace_mode = click.option(
+    "--multi-namespace-mode",
+    help="Use multi namespace mode.",
+    is_flag=True,
+    envvar="MULTI_NAMESPACE_MODE",
+)
+
 option_rebuild_base_image = click.option(
     "--rebuild-base-image",
     help="Rebuilds base Airflow image before building K8S image.",
@@ -954,6 +961,7 @@ def _deploy_helm_chart(
     executor: str,
     use_standard_naming: bool,
     extra_options: tuple[str, ...] | None = None,
+    multi_namespace_mode: bool = False,
 ) -> RunCommandResult:
     cluster_name = get_kubectl_cluster_name(python=python, 
kubernetes_version=kubernetes_version)
     action = "Deploying" if not upgrade else "Upgrading"
@@ -995,6 +1003,8 @@ def _deploy_helm_chart(
             "--set",
             f"executor={executor}",
         ]
+        if multi_namespace_mode:
+            helm_command.extend(["--set", "multiNamespaceMode=true"])
         if upgrade:
             # force upgrade
             helm_command.append("--force")
@@ -1024,6 +1034,7 @@ def _deploy_airflow(
     wait_time_in_seconds: int,
     use_standard_naming: bool,
     extra_options: tuple[str, ...] | None = None,
+    multi_namespace_mode: bool = False,
 ) -> tuple[int, str]:
     action = "Deploying" if not upgrade else "Upgrading"
     cluster_name = get_kind_cluster_name(python=python, 
kubernetes_version=kubernetes_version)
@@ -1036,8 +1047,47 @@ def _deploy_airflow(
         executor=executor,
         use_standard_naming=use_standard_naming,
         extra_options=extra_options,
+        multi_namespace_mode=multi_namespace_mode,
     )
     if result.returncode == 0:
+        if multi_namespace_mode:
+            # duplicate Airflow configmaps, secrets and service accounts to 
test namespace
+            run_command_with_k8s_env(
+                f"kubectl get secret -n {HELM_AIRFLOW_NAMESPACE} "
+                "--field-selector type!=helm.sh/release.v1 -o yaml "
+                f"| sed 's/namespace: {HELM_AIRFLOW_NAMESPACE}/namespace: 
{TEST_NAMESPACE}/' "
+                f"| kubectl apply -n {TEST_NAMESPACE} -f -",
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                check=False,
+                shell=True,
+            )
+
+            run_command_with_k8s_env(
+                f"kubectl get configmap -n {HELM_AIRFLOW_NAMESPACE} "
+                "--field-selector  metadata.name!=kube-root-ca.crt -o yaml "
+                f"| sed 's/namespace: {HELM_AIRFLOW_NAMESPACE}/namespace: 
{TEST_NAMESPACE}/' "
+                f"| kubectl apply -n {TEST_NAMESPACE} -f -",
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                check=False,
+                shell=True,
+            )
+
+            run_command_with_k8s_env(
+                f"kubectl get serviceaccount -n {HELM_AIRFLOW_NAMESPACE} "
+                "--field-selector  metadata.name!=default -o yaml "
+                f"| sed 's/namespace: {HELM_AIRFLOW_NAMESPACE}/namespace: 
{TEST_NAMESPACE}/' "
+                f"| kubectl apply -n {TEST_NAMESPACE} -f -",
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                check=False,
+                shell=True,
+            )
+
         get_console(output=output).print(
             f"\n[success]Airflow for Python {python} and "
             f"K8S version {kubernetes_version} has been successfully deployed."
@@ -1073,6 +1123,7 @@ def _deploy_airflow(
 @option_debug_resources
 @option_include_success_outputs
 @option_use_standard_naming
+@option_multi_namespace_mode
 @option_python_versions
 @option_kubernetes_versions
 @option_verbose
@@ -1093,6 +1144,7 @@ def deploy_airflow(
     python_versions: str,
     kubernetes_versions: str,
     extra_options: tuple[str, ...],
+    multi_namespace_mode: bool = False,
 ):
     if run_in_parallel:
         python_version_array: list[str] = python_versions.split(" ")
@@ -1121,6 +1173,7 @@ def deploy_airflow(
                             "wait_time_in_seconds": wait_time_in_seconds,
                             "extra_options": extra_options,
                             "output": outputs[index],
+                            "multi_namespace_mode": multi_namespace_mode,
                         },
                     )
                     for index, combo in enumerate(combos)
@@ -1142,6 +1195,7 @@ def deploy_airflow(
             use_standard_naming=use_standard_naming,
             wait_time_in_seconds=wait_time_in_seconds,
             extra_options=extra_options,
+            multi_namespace_mode=multi_namespace_mode,
         )
         if return_code == 0:
             get_console().print(
@@ -1486,6 +1540,7 @@ def _run_complete_tests(
             use_standard_naming=use_standard_naming,
             wait_time_in_seconds=wait_time_in_seconds,
             extra_options=extra_options,
+            multi_namespace_mode=True,
         )
         if returncode != 0:
             _logs(python=python, kubernetes_version=kubernetes_version)
@@ -1516,6 +1571,7 @@ def _run_complete_tests(
                 use_standard_naming=use_standard_naming,
                 wait_time_in_seconds=wait_time_in_seconds,
                 extra_options=extra_options,
+                multi_namespace_mode=True,
             )
             if returncode != 0:
                 _logs(python=python, kubernetes_version=kubernetes_version)
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 5049100c59..3e988bd6bd 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -160,6 +160,7 @@ KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--upgrade",
                 "--wait-time-in-seconds",
                 "--use-standard-naming",
+                "--multi-namespace-mode",
             ],
         },
         {
diff --git a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py 
b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
index 7c2e6a7230..b7002add2a 100644
--- a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
@@ -365,7 +365,7 @@ def create_virtualenv(force_venv_setup: bool) -> 
RunCommandResult:
 
 
 def run_command_with_k8s_env(
-    cmd: list[str],
+    cmd: list[str] | str,
     python: str,
     kubernetes_version: str,
     executor: str | None = None,
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py 
b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 8cc1f70809..2116ff83ad 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -55,7 +55,7 @@ OPTION_MATCHER = re.compile(r"^[A-Z_]*=.*$")
 
 
 def run_command(
-    cmd: list[str],
+    cmd: list[str] | str,
     title: str | None = None,
     *,
     check: bool = True,
@@ -120,7 +120,7 @@ def run_command(
     if not title:
         shortened_command = [
             shorten_command(index, argument)
-            for index, argument in enumerate(cmd)
+            for index, argument in enumerate(cmd if isinstance(cmd, list) else 
shlex.split(cmd))
             if not exclude_command(index, argument)
         ]
         # Heuristics to get a (possibly) short but explanatory title showing 
what the command does
@@ -135,7 +135,7 @@ def run_command(
         if "capture_output" not in kwargs or not kwargs["capture_output"]:
             kwargs["stdout"] = output.file
             kwargs["stderr"] = subprocess.STDOUT
-    command_to_print = " ".join(shlex.quote(c) for c in cmd)
+    command_to_print = " ".join(shlex.quote(c) for c in cmd) if 
isinstance(cmd, list) else cmd
     env_to_print = get_environments_to_print(env)
     if not get_verbose(verbose_override) and not get_dry_run(dry_run_override):
         return subprocess.run(cmd, input=input, check=check, env=cmd_env, 
cwd=workdir, **kwargs)
diff --git a/images/breeze/output_k8s_deploy-airflow.svg 
b/images/breeze/output_k8s_deploy-airflow.svg
index c50d3e99ea..7fe972b717 100644
--- a/images/breeze/output_k8s_deploy-airflow.svg
+++ b/images/breeze/output_k8s_deploy-airflow.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 977.1999999999999" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-k8s-deploy-airflow-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="901.8" />
+      <rect x="0" y="0" width="1463.0" height="926.1999999999999" />
     </clipPath>
     <clipPath id="breeze-k8s-deploy-airflow-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -153,9 +153,12 @@
 <clipPath id="breeze-k8s-deploy-airflow-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-k8s-deploy-airflow-line-36">
+    <rect x="0" y="879.9" 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="950.8" rx="8"/><text 
class="breeze-k8s-deploy-airflow-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;k8s&#160;deploy-airflow</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="975.2" rx="8"/><text 
class="breeze-k8s-deploy-airflow-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;k8s&#160;deploy-airflow</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -182,26 +185,27 @@
 </text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-14)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="361.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-14)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="361.6" textLength="97.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-14)">-upgrade</text><text 
class="breeze-k8s-deploy-airflow-r1" x="366" y="361.6"  [...]
 </text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-15)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="386" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-15)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="386" textLength="61" 
clip-path="url(#breeze-k8s-deploy-airflow-line-15)">-wait</text><text 
class="breeze-k8s-deploy-airflow-r4" x="97.6" y="386" textLength=" [...]
 </text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-16)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="410.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-16)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="410.4" textLength="48.8" 
clip-path="url(#breeze-k8s-deploy-airflow-line-16)">-use</text><text 
class="breeze-k8s-deploy-airflow-r4" x="85.4" y="410.4" tex [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="434.8" 
textLength="1464" 
clip-path="url(#breeze-k8s-deploy-airflow-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-deploy-airflow-r1" x="1464" y="434.8" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-17)">
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="459.2" 
textLength="24.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-18)">╭─</text><text 
class="breeze-k8s-deploy-airflow-r5" x="24.4" y="459.2" textLength="219.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-18)">&#160;Parallel&#160;options&#160;</text><text
 class="breeze-k8s-deploy-airflow-r5" x="244" y="459.2" textLength="1195.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-18)">─────────────────────────────────────────
 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-19)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="483.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-19)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="483.6" textLength="48.8" 
clip-path="url(#breeze-k8s-deploy-airflow-line-19)">-run</text><text 
class="breeze-k8s-deploy-airflow-r4" x="85.4" y="483.6" tex [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-20)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="508" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-20)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="508" textLength="146.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-20)">-parallelism</text><text 
class="breeze-k8s-deploy-airflow-r1" x="378.2" y="508" t [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-21)">│</text><text 
class="breeze-k8s-deploy-airflow-r1" x="378.2" y="532.4" textLength="1061.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-21)">operations.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-22)">│</text><text 
class="breeze-k8s-deploy-airflow-r7" x="378.2" y="556.8" textLength="1061.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-22)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-23)">│</text><text 
class="breeze-k8s-deploy-airflow-r5" x="378.2" y="581.2" textLength="1061.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-23)">[default:&#160;2;&#160;1&lt;=x&lt;=4]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-24)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="605.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-24)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="605.6" textLength="85.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-24)">-python</text><text 
class="breeze-k8s-deploy-airflow-r4" x="122" y="605.6" t [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-25)">│</text><text 
class="breeze-k8s-deploy-airflow-r5" x="378.2" y="630" textLength="951.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-25)">[default:&#160;3.8&#160;3.9&#160;3.10&#160;3.11]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-26)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="654.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-26)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="654.4" textLength="134.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-26)">-kubernetes</text><text 
class="breeze-k8s-deploy-airflow-r4" x="170.8" y="6 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-27)">│</text><text 
class="breeze-k8s-deploy-airflow-r5" x="378.2" y="678.8" textLength="756.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-27)">[default:&#160;v1.25.11&#160;v1.26.6&#160;v1.27.3&#160;v1.28.0]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-deploy [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-28)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="703.2" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-28)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="703.2" textLength="61" 
clip-path="url(#breeze-k8s-deploy-airflow-line-28)">-skip</text><text 
class="breeze-k8s-deploy-airflow-r4" x="97.6" y="703.2" text [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-29)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="727.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-29)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="727.6" textLength="73.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-29)">-debug</text><text 
class="breeze-k8s-deploy-airflow-r4" x="109.8" y="727.6"  [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-30)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="752" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-30)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="752" textLength="97.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-30)">-include</text><text 
class="breeze-k8s-deploy-airflow-r4" x="134.2" y="752" textLe [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="776.4" 
textLength="1464" 
clip-path="url(#breeze-k8s-deploy-airflow-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-deploy-airflow-r1" x="1464" y="776.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-31)">
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="800.8" 
textLength="24.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-32)">╭─</text><text 
class="breeze-k8s-deploy-airflow-r5" x="24.4" y="800.8" textLength="195.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-32)">&#160;Common&#160;options&#160;</text><text
 class="breeze-k8s-deploy-airflow-r5" x="219.6" y="800.8" textLength="1220" 
clip-path="url(#breeze-k8s-deploy-airflow-line-32)">───────────────────────────────────────────
 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-33)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="825.2" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-33)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="825.2" textLength="97.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-33)">-verbose</text><text 
class="breeze-k8s-deploy-airflow-r6" x="158.6" y="825.2 [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-34)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="849.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-34)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="849.6" textLength="48.8" 
clip-path="url(#breeze-k8s-deploy-airflow-line-34)">-dry</text><text 
class="breeze-k8s-deploy-airflow-r4" x="85.4" y="849.6" tex [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-35)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="874" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-35)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="874" textLength="61" 
clip-path="url(#breeze-k8s-deploy-airflow-line-35)">-help</text><text 
class="breeze-k8s-deploy-airflow-r6" x="158.6" y="874" textLength= [...]
-</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="898.4" 
textLength="1464" 
clip-path="url(#breeze-k8s-deploy-airflow-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-deploy-airflow-r1" x="1464" y="898.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-36)">
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-17)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="434.8" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-17)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="434.8" textLength="73.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-17)">-multi</text><text 
class="breeze-k8s-deploy-airflow-r4" x="109.8" y="434.8"  [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="459.2" 
textLength="1464" 
clip-path="url(#breeze-k8s-deploy-airflow-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-deploy-airflow-r1" x="1464" y="459.2" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-18)">
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="483.6" 
textLength="24.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-19)">╭─</text><text 
class="breeze-k8s-deploy-airflow-r5" x="24.4" y="483.6" textLength="219.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-19)">&#160;Parallel&#160;options&#160;</text><text
 class="breeze-k8s-deploy-airflow-r5" x="244" y="483.6" textLength="1195.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-19)">─────────────────────────────────────────
 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-20)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="508" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-20)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="508" textLength="48.8" 
clip-path="url(#breeze-k8s-deploy-airflow-line-20)">-run</text><text 
class="breeze-k8s-deploy-airflow-r4" x="85.4" y="508" textLength= [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-21)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="532.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-21)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="532.4" textLength="146.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-21)">-parallelism</text><text 
class="breeze-k8s-deploy-airflow-r1" x="378.2" y=" [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-22)">│</text><text 
class="breeze-k8s-deploy-airflow-r1" x="378.2" y="556.8" textLength="1061.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-22)">operations.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-23)">│</text><text 
class="breeze-k8s-deploy-airflow-r7" x="378.2" y="581.2" textLength="1061.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-23)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-24)">│</text><text 
class="breeze-k8s-deploy-airflow-r5" x="378.2" y="605.6" textLength="1061.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-24)">[default:&#160;2;&#160;1&lt;=x&lt;=4]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-25)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="630" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-25)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="630" textLength="85.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-25)">-python</text><text 
class="breeze-k8s-deploy-airflow-r4" x="122" y="630" textLengt [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-26)">│</text><text 
class="breeze-k8s-deploy-airflow-r5" x="378.2" y="654.4" textLength="951.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-26)">[default:&#160;3.8&#160;3.9&#160;3.10&#160;3.11]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-27)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="678.8" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-27)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="678.8" textLength="134.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-27)">-kubernetes</text><text 
class="breeze-k8s-deploy-airflow-r4" x="170.8" y="6 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-28)">│</text><text 
class="breeze-k8s-deploy-airflow-r5" x="378.2" y="703.2" textLength="756.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-28)">[default:&#160;v1.25.11&#160;v1.26.6&#160;v1.27.3&#160;v1.28.0]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-k8s-deploy [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-29)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="727.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-29)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="727.6" textLength="61" 
clip-path="url(#breeze-k8s-deploy-airflow-line-29)">-skip</text><text 
class="breeze-k8s-deploy-airflow-r4" x="97.6" y="727.6" text [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-30)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="752" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-30)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="752" textLength="73.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-30)">-debug</text><text 
class="breeze-k8s-deploy-airflow-r4" x="109.8" y="752" textLeng [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-31)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="776.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-31)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="776.4" textLength="97.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-31)">-include</text><text 
class="breeze-k8s-deploy-airflow-r4" x="134.2" y="776.4 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="800.8" 
textLength="1464" 
clip-path="url(#breeze-k8s-deploy-airflow-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-deploy-airflow-r1" x="1464" y="800.8" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-32)">
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="825.2" 
textLength="24.4" 
clip-path="url(#breeze-k8s-deploy-airflow-line-33)">╭─</text><text 
class="breeze-k8s-deploy-airflow-r5" x="24.4" y="825.2" textLength="195.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-33)">&#160;Common&#160;options&#160;</text><text
 class="breeze-k8s-deploy-airflow-r5" x="219.6" y="825.2" textLength="1220" 
clip-path="url(#breeze-k8s-deploy-airflow-line-33)">───────────────────────────────────────────
 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-34)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="849.6" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-34)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="849.6" textLength="97.6" 
clip-path="url(#breeze-k8s-deploy-airflow-line-34)">-verbose</text><text 
class="breeze-k8s-deploy-airflow-r6" x="158.6" y="849.6 [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-35)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="874" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-35)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="874" textLength="48.8" 
clip-path="url(#breeze-k8s-deploy-airflow-line-35)">-dry</text><text 
class="breeze-k8s-deploy-airflow-r4" x="85.4" y="874" textLength= [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-36)">│</text><text 
class="breeze-k8s-deploy-airflow-r4" x="24.4" y="898.4" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-36)">-</text><text 
class="breeze-k8s-deploy-airflow-r4" x="36.6" y="898.4" textLength="61" 
clip-path="url(#breeze-k8s-deploy-airflow-line-36)">-help</text><text 
class="breeze-k8s-deploy-airflow-r6" x="158.6" y="898.4" tex [...]
+</text><text class="breeze-k8s-deploy-airflow-r5" x="0" y="922.8" 
textLength="1464" 
clip-path="url(#breeze-k8s-deploy-airflow-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-k8s-deploy-airflow-r1" x="1464" y="922.8" textLength="12.2" 
clip-path="url(#breeze-k8s-deploy-airflow-line-37)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_k8s_deploy-airflow.txt 
b/images/breeze/output_k8s_deploy-airflow.txt
index 17f2b4c07b..b6237009d6 100644
--- a/images/breeze/output_k8s_deploy-airflow.txt
+++ b/images/breeze/output_k8s_deploy-airflow.txt
@@ -1 +1 @@
-f4b05b2101a4a029c9706ecd6fbf3c5c
+e508ceccf1296e7915277e2b8df7263a
diff --git a/tests/providers/cncf/kubernetes/test_pod_generator.py 
b/tests/providers/cncf/kubernetes/test_pod_generator.py
index 2739781858..969bf26bc5 100644
--- a/tests/providers/cncf/kubernetes/test_pod_generator.py
+++ b/tests/providers/cncf/kubernetes/test_pod_generator.py
@@ -401,17 +401,29 @@ class TestPodGenerator:
             pytest.param(None, "busybox", id="no_image_in_cfg"),
         ],
     )
-    def test_construct_pod(self, config_image, expected_image):
+    @pytest.mark.parametrize(
+        "pod_override_object_namespace, expected_namespace",
+        [
+            ("new_namespace", "new_namespace"),  # pod_override_object 
namespace should be used
+            (None, "test_namespace"),  # if it is not provided, we use default 
one
+        ],
+    )
+    def test_construct_pod(
+        self, config_image, expected_image, pod_override_object_namespace, 
expected_namespace
+    ):
         template_file = sys.path[0] + 
"/tests/providers/cncf/kubernetes/pod_generator_base_with_secrets.yaml"
         worker_config = PodGenerator.deserialize_model_file(template_file)
         executor_config = k8s.V1Pod(
+            metadata=k8s.V1ObjectMeta(
+                namespace=pod_override_object_namespace,
+            ),
             spec=k8s.V1PodSpec(
                 containers=[
                     k8s.V1Container(
                         name="", 
resources=k8s.V1ResourceRequirements(limits={"cpu": "1m", "memory": "1G"})
                     )
                 ]
-            )
+            ),
         )
 
         result = PodGenerator.construct_pod(
@@ -432,7 +444,7 @@ class TestPodGenerator:
         expected.metadata.labels["app"] = "myapp"
         expected.metadata.annotations = self.annotations
         expected.metadata.name = "pod_id"
-        expected.metadata.namespace = "test_namespace"
+        expected.metadata.namespace = expected_namespace
         expected.spec.containers[0].args = ["command"]
         expected.spec.containers[0].image = expected_image
         expected.spec.containers[0].resources = {"limits": {"cpu": "1m", 
"memory": "1G"}}


Reply via email to