This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.8.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.8.x by this push:
new 45285d8eab3 [CAMEL-21235] Cannot run k8s app in namespace other than
default (#15723)
45285d8eab3 is described below
commit 45285d8eab3e8b9ab3b68b726d8cd29764c4f7ae
Author: Thomas Diesler <[email protected]>
AuthorDate: Thu Sep 26 16:35:58 2024 +0200
[CAMEL-21235] Cannot run k8s app in namespace other than default (#15723)
---
.../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 +++++++++++++++++++
5 files changed, 65 insertions(+), 12 deletions(-)
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));