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

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


The following commit(s) were added to refs/heads/main by this push:
     new 652d7b0b4bd [CAMEL-21235] Cannot run k8s app in namespace other than 
default (#15721)
652d7b0b4bd is described below

commit 652d7b0b4bdf47737c186d1aba4d95e43a30fa8d
Author: Thomas Diesler <[email protected]>
AuthorDate: Thu Sep 26 16:36:12 2024 +0200

    [CAMEL-21235] Cannot run k8s app in namespace other than default (#15721)
---
 dsl/camel-jbang/README.md                          |  2 +-
 .../commands/kubernetes/KubernetesBaseCommand.java |  5 +--
 .../core/commands/kubernetes/KubernetesDelete.java |  3 +-
 .../core/commands/kubernetes/KubernetesRun.java    | 36 +++++++++++++++++-----
 .../jbang/core/commands/kubernetes/PodLogs.java    |  2 +-
 .../commands/kubernetes/KubernetesRunTest.java     | 31 +++++++++++++++++++
 6 files changed, 66 insertions(+), 13 deletions(-)

diff --git a/dsl/camel-jbang/README.md b/dsl/camel-jbang/README.md
index 3525ce08efd..e39ba13cc7d 100644
--- a/dsl/camel-jbang/README.md
+++ b/dsl/camel-jbang/README.md
@@ -9,7 +9,7 @@ jbang app install camel@apache/camel
 If you however like to install camel-jbang from this project build you create 
an alias to the local entry point.
 
 ```shell
-jbang alias add -Dcamel.jbang.version=4.9.0-SNAPSHOT --name camel 
./dsl/camel-jbang/camel-jbang-main/dist/CamelJBang.java
+jbang alias add --name camel -Dcamel.jbang.version=4.9.0-SNAPSHOT 
./dsl/camel-jbang/camel-jbang-main/dist/CamelJBang.java
 
 jbang camel version  
 Camel JBang version: 4.9.0-SNAPSHOT
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
index 2a3d8ebbe07..2b853c25328 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
@@ -27,6 +27,7 @@ import io.fabric8.kubernetes.client.dsl.PodResource;
 import io.fabric8.kubernetes.client.dsl.Resource;
 import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.util.ObjectHelper;
 import picocli.CommandLine;
 
 /**
@@ -59,7 +60,7 @@ public abstract class KubernetesBaseCommand extends 
CamelCommand {
      */
     protected <T extends HasMetadata> NonNamespaceOperation<T, 
KubernetesResourceList<T>, Resource<T>> client(
             Class<T> resourceType) {
-        if (namespace != null) {
+        if (!ObjectHelper.isEmpty(namespace)) {
             return client().resources(resourceType).inNamespace(namespace);
         }
 
@@ -73,7 +74,7 @@ public abstract class KubernetesBaseCommand extends 
CamelCommand {
      * @return namespaced client if applicable.
      */
     protected NonNamespaceOperation<Pod, PodList, PodResource> pods() {
-        if (namespace != null) {
+        if (!ObjectHelper.isEmpty(namespace)) {
             return client().pods().inNamespace(namespace);
         }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDelete.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDelete.java
index dd0b1a08184..a5c44169177 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDelete.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDelete.java
@@ -25,6 +25,7 @@ import io.fabric8.kubernetes.api.model.StatusDetails;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.common.SourceScheme;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
 import picocli.CommandLine;
 
@@ -73,7 +74,7 @@ public class KubernetesDelete extends KubernetesBaseCommand {
         File manifest = KubernetesHelper.resolveKubernetesManifest(new 
File(resolvedWorkingDir, "target/kubernetes"));
         try (FileInputStream fis = new FileInputStream(manifest)) {
             List<StatusDetails> status;
-            if (namespace != null) {
+            if (!ObjectHelper.isEmpty(namespace)) {
                 status = client().load(fis).inNamespace(namespace).delete();
             } else {
                 status = client().load(fis).delete();
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
index 71ba2e203c1..b56c957a44e 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
@@ -39,6 +39,7 @@ import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.support.FileWatcherResourceReloadStrategy;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.concurrent.ThreadHelper;
 import picocli.CommandLine;
@@ -431,10 +432,13 @@ public class KubernetesRun extends KubernetesBaseCommand {
 
     private void startPodLogging(String projectName) throws Exception {
         try {
-            PodLogs logsCommand = new PodLogs(getMain());
-            logsCommand.withClient(client());
-            logsCommand.label = "%s=%s".formatted(BaseTrait.INTEGRATION_LABEL, 
projectName);
-            logsCommand.doCall();
+            var podLogs = new PodLogs(getMain());
+            podLogs.withClient(client());
+            podLogs.label = "%s=%s".formatted(BaseTrait.INTEGRATION_LABEL, 
projectName);
+            if (!ObjectHelper.isEmpty(namespace)) {
+                podLogs.namespace = namespace;
+            }
+            podLogs.doCall();
         } catch (Exception e) {
             printer().println("Failed to read pod logs - " + e);
             throw e;
@@ -444,10 +448,10 @@ public class KubernetesRun extends KubernetesBaseCommand {
     private void waitForRunningPod(String projectName) {
         if (!quiet) {
             String kubectlCmd = "kubectl get pod";
-            if (namespace != null) {
+            kubectlCmd += " -l %s=%s".formatted(BaseTrait.INTEGRATION_LABEL, 
projectName);
+            if (!ObjectHelper.isEmpty(namespace)) {
                 kubectlCmd += " -n %s".formatted(namespace);
             }
-            kubectlCmd += " -l %s=%s".formatted(BaseTrait.INTEGRATION_LABEL, 
projectName);
             printer().println("Run: " + kubectlCmd);
         }
         client(Pod.class).withLabel(BaseTrait.INTEGRATION_LABEL, projectName)
@@ -487,6 +491,22 @@ public class KubernetesRun extends KubernetesBaseCommand {
         }
         args.add("--file");
         args.add(workingDir);
+
+        if (runtime == RuntimeType.quarkus) {
+
+            if (ClusterType.KUBERNETES.isEqualTo(clusterType)) {
+                if (!ObjectHelper.isEmpty(namespace)) {
+                    args.add("-Dquarkus.kubernetes.namespace=" + namespace);
+                }
+            }
+
+        } else {
+
+            if (!ObjectHelper.isEmpty(namespace)) {
+                args.add("-Djkube.namespace=%s".formatted(namespace));
+            }
+        }
+
         args.add("package");
 
         if (!quiet) {
@@ -539,7 +559,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
                 args.add("-Dquarkus.openshift.deploy=true");
             } else {
                 args.add("-Dquarkus.kubernetes.deploy=true");
-                if (namespace != null) {
+                if (!ObjectHelper.isEmpty(namespace)) {
                     args.add("-Dquarkus.kubernetes.namespace=" + namespace);
                 }
             }
@@ -556,7 +576,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
                 args.add("-Djkube.%s.push=true".formatted(imageBuilder));
             }
 
-            if (namespace != null) {
+            if (!ObjectHelper.isEmpty(namespace)) {
                 args.add("-Djkube.namespace=%s".formatted(namespace));
             }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogs.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogs.java
index 3bcd3c7611b..c2b7bd0f0b9 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogs.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogs.java
@@ -92,8 +92,8 @@ public class PodLogs extends KubernetesBaseCommand {
         AtomicInteger resumeCount = new AtomicInteger();
         while (shouldResume) {
             shouldResume = watchLogs(parts[0], parts[1], container, 
resumeCount);
-            resumeCount.incrementAndGet();
             printer().printf("PodLogs: [resume=%b, count=%d]%n", shouldResume, 
resumeCount.get());
+            resumeCount.incrementAndGet();
             sleepWell();
         }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
index 739bb7fa836..51a860cee2a 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
@@ -111,6 +111,37 @@ class KubernetesRunTest extends KubernetesBaseTest {
         Assertions.assertTrue(printer.getOutput().endsWith("Unsupported output 
format 'wrong' (supported: yaml, json)"));
     }
 
+    @ParameterizedTest
+    @MethodSource("runtimeProvider")
+    public void shouldGenerateKubernetesNamespace(RuntimeType rt) throws 
Exception {
+        KubernetesRun command = createCommand(new String[] { 
"classpath:route.yaml" },
+                "--image-registry=quay.io", "--image-group=camel-test", 
"--output=yaml",
+                "--namespace", "custom",
+                "--runtime=" + rt.runtime());
+        int exit = command.doCall();
+
+        Assertions.assertEquals(0, exit);
+
+        var manifest = getKubernetesManifestAsStream(printer.getOutput(), 
command.output);
+        List<HasMetadata> resources = kubernetesClient.load(manifest).items();
+        Assertions.assertEquals(2, resources.size());
+
+        Deployment deployment = resources.stream()
+                .filter(it -> Deployment.class.isAssignableFrom(it.getClass()))
+                .map(Deployment.class::cast)
+                .findFirst()
+                .orElseThrow(() -> new RuntimeCamelException("Missing 
deployment in Kubernetes manifest"));
+
+        Assertions.assertEquals("route", deployment.getMetadata().getName());
+        Assertions.assertEquals("custom", 
deployment.getMetadata().getNamespace());
+        Assertions.assertEquals(1, 
deployment.getSpec().getTemplate().getSpec().getContainers().size());
+        Container container = 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0);
+        Assertions.assertEquals("route", container.getName());
+        Assertions.assertEquals("route", 
deployment.getMetadata().getLabels().get(BaseTrait.INTEGRATION_LABEL));
+        Assertions.assertEquals("route", 
deployment.getSpec().getSelector().getMatchLabels().get(BaseTrait.INTEGRATION_LABEL));
+        Assertions.assertEquals("quay.io/camel-test/route:1.0-SNAPSHOT", 
container.getImage());
+    }
+
     private KubernetesRun createCommand(String[] files, String... args) {
         var argsArr = Optional.ofNullable(args).orElse(new String[0]);
         var argsLst = new ArrayList<>(Arrays.asList(argsArr));

Reply via email to