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 b6798a62d11 CAMEL-21510: camel-jbang - Kubernetes plugin support for
parameter name (#16580)
b6798a62d11 is described below
commit b6798a62d11b46b76f6c3638e4625418f663105a
Author: Thomas Diesler <[email protected]>
AuthorDate: Mon Dec 16 17:15:38 2024 +0100
CAMEL-21510: camel-jbang - Kubernetes plugin support for parameter name
(#16580)
---
.../camel/dsl/jbang/core/commands/Export.java | 8 ++-
.../dsl/jbang/core/commands/ExportBaseCommand.java | 4 ++
.../apache/camel/dsl/jbang/core/commands/Run.java | 12 ++++-
.../dsl/jbang/core/commands/k/IntegrationLogs.java | 21 ++------
.../commands/kubernetes/KubernetesBaseCommand.java | 44 +++++++++++++++
.../core/commands/kubernetes/KubernetesDelete.java | 62 +++++++++++++---------
.../core/commands/kubernetes/KubernetesExport.java | 8 ++-
.../core/commands/kubernetes/KubernetesHelper.java | 14 ++---
.../core/commands/kubernetes/KubernetesPlugin.java | 2 +-
.../{PodLogs.java => KubernetesPodLogs.java} | 23 ++------
.../core/commands/kubernetes/KubernetesRun.java | 41 +++++---------
.../commands/kubernetes/KubernetesDeleteTest.java | 2 +-
.../commands/kubernetes/KubernetesExportTest.java | 14 +++++
...PodLogsTest.java => KubernetesPodLogsTest.java} | 8 +--
14 files changed, 160 insertions(+), 103 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index 271eba0f1ae..0e2f0115164 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -116,6 +116,7 @@ public class Export extends ExportBaseCommand {
cmd.repositories = this.repositories;
cmd.dependencies = this.dependencies;
cmd.runtime = this.runtime;
+ cmd.name = this.name;
cmd.gav = this.gav;
cmd.mavenSettings = this.mavenSettings;
cmd.mavenSettingsSecurity = this.mavenSettingsSecurity;
@@ -151,6 +152,11 @@ public class Export extends ExportBaseCommand {
}
protected String getProjectName() {
+
+ if (name != null) {
+ return name;
+ }
+
if (gav != null) {
String[] ids = gav.split(":");
if (ids.length > 1) {
@@ -163,7 +169,7 @@ public class Export extends ExportBaseCommand {
}
throw new RuntimeCamelException(
- "Failed to resolve project name - please provide --gav option
or at least one source file");
+ "Failed to resolve project name - please provide --name, --gav
or source file");
}
protected String getVersion() {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 7518eca3cfc..7a177914afc 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -105,6 +105,10 @@ public abstract class ExportBaseCommand extends
CamelCommand {
description = "Runtime (${COMPLETION-CANDIDATES})")
protected RuntimeType runtime;
+ @CommandLine.Option(names = { "--name" },
+ description = "The integration name. Use this when the
name should not get derived otherwise.")
+ protected String name;
+
@CommandLine.Option(names = { "--gav" }, description = "The Maven
group:artifact:version")
protected String gav;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 2e0116ef464..1bb879b05da 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -894,9 +894,13 @@ public class Run extends CamelCommand {
eq.excludes = this.excludes;
eq.filePaths = this.filePaths;
eq.files = this.files;
+ eq.name = this.name;
eq.gav = this.gav;
if (eq.gav == null) {
- eq.gav = "org.example.project:jbang-run-dummy:1.0-SNAPSHOT";
+ if (eq.name == null) {
+ eq.name = "jbang-run-dummy";
+ }
+ eq.gav = "org.example.project:" + eq.name + ":1.0-SNAPSHOT";
}
eq.dependencies = this.dependencies;
if (!this.exportRun) {
@@ -965,9 +969,13 @@ public class Run extends CamelCommand {
eq.excludes = this.excludes;
eq.filePaths = this.filePaths;
eq.files = this.files;
+ eq.name = this.name;
eq.gav = this.gav;
if (eq.gav == null) {
- eq.gav = "org.example.project:jbang-run-dummy:1.0-SNAPSHOT";
+ if (eq.name == null) {
+ eq.name = "jbang-run-dummy";
+ }
+ eq.gav = "org.example.project:" + eq.name + ":1.0-SNAPSHOT";
}
eq.dependencies.addAll(dependencies);
if (!this.exportRun) {
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationLogs.java
b/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationLogs.java
index fe8a1f60fde..9a84381f7a8 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationLogs.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationLogs.java
@@ -17,34 +17,23 @@
package org.apache.camel.dsl.jbang.core.commands.k;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
-import org.apache.camel.dsl.jbang.core.commands.kubernetes.KubernetesHelper;
-import org.apache.camel.dsl.jbang.core.commands.kubernetes.PodLogs;
-import org.apache.camel.dsl.jbang.core.common.SourceScheme;
-import org.apache.camel.util.FileUtil;
+import org.apache.camel.dsl.jbang.core.commands.kubernetes.KubernetesPodLogs;
import org.apache.camel.v1.Integration;
import picocli.CommandLine.Command;
@Command(name = "logs", description = "Print the logs of an integration",
sortOptions = false)
-public class IntegrationLogs extends PodLogs {
+public class IntegrationLogs extends KubernetesPodLogs {
public IntegrationLogs(CamelJBangMain main) {
super(main);
+ projectNameSuppliers.add(() -> projectNameFromFilePath(() ->
filePath));
}
public Integer doCall() throws Exception {
- if (name == null && label == null && filePath == null) {
- printer().println("Name or label selector must be set");
- return 1;
- }
- if (label == null) {
- String integrationName;
- if (name != null) {
- integrationName = KubernetesHelper.sanitize(name);
- } else {
- integrationName =
KubernetesHelper.sanitize(FileUtil.onlyName(SourceScheme.onlyName(filePath)));
- }
+ String integrationName = getProjectName();
+ if (label == null) {
Integration integration =
client(Integration.class).withName(integrationName).get();
if (integration == null) {
printer().printf("Integration %s not found%n",
integrationName);
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 fdb0aec1a7a..8e711365a5a 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
@@ -17,6 +17,11 @@
package org.apache.camel.dsl.jbang.core.commands.kubernetes;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Supplier;
+
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
import io.fabric8.kubernetes.api.model.Pod;
@@ -25,9 +30,13 @@ import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
import io.fabric8.kubernetes.client.dsl.PodResource;
import io.fabric8.kubernetes.client.dsl.Resource;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
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;
/**
@@ -45,10 +54,45 @@ public abstract class KubernetesBaseCommand extends
CamelCommand {
@CommandLine.Option(names = { "--namespace", "-n" }, description =
"Namespace to use for all operations")
String namespace;
+ @CommandLine.Option(names = { "--name" },
+ description = "The integration name. Use this when the
name should not get derived otherwise.")
+ protected String name;
+
+ protected List<Supplier<String>> projectNameSuppliers = new ArrayList<>();
+
private KubernetesClient kubernetesClient;
public KubernetesBaseCommand(CamelJBangMain main) {
super(main);
+ projectNameSuppliers.add(() -> name);
+ }
+
+ protected String getProjectName() {
+ return
projectNameSuppliers.stream().map(Supplier::get).filter(Objects::nonNull).findFirst()
+ .orElseThrow(() -> new RuntimeCamelException("Failed to
resolve project name"));
+ }
+
+ protected String projectNameFromImage(Supplier<String> imageSupplier) {
+ return
KubernetesHelper.sanitize(StringHelper.beforeLast(imageSupplier.get(), ":"));
+ }
+
+ protected String projectNameFromGav(Supplier<String> gavSupplier) {
+ var gav = gavSupplier.get();
+ if (gav != null) {
+ String[] ids = gav.split(":");
+ if (ids.length > 1) {
+ return KubernetesHelper.sanitize(ids[1]); // artifactId
+ }
+ }
+ return null;
+ }
+
+ protected String projectNameFromFilePath(Supplier<String> pathSupplier) {
+ var filePath = pathSupplier.get();
+ if (filePath != null) {
+ return
KubernetesHelper.sanitize(FileUtil.onlyName(SourceScheme.onlyName(filePath)));
+ }
+ return null;
}
/**
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 226f050adb1..341643740bc 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
@@ -23,8 +23,6 @@ import java.util.List;
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;
@@ -36,10 +34,6 @@ public class KubernetesDelete extends KubernetesBaseCommand {
arity = "0..1", paramLabel = "<file>")
String filePath;
- @CommandLine.Option(names = { "--name" },
- description = "The integration name. Use this when the
name should not get derived from the source file name.")
- String name;
-
@CommandLine.Option(names = { "--working-dir" },
description = "The working directory where to find
exported project sources.")
String workingDir;
@@ -50,41 +44,61 @@ public class KubernetesDelete extends KubernetesBaseCommand
{
public KubernetesDelete(CamelJBangMain main) {
super(main);
+ projectNameSuppliers.add(() -> projectNameFromFilePath(() ->
filePath));
}
public Integer doCall() throws Exception {
- File resolvedWorkingDir;
+
+ // First, try the explicit workingDir
+ File resolvedManifestDir = null;
if (workingDir != null) {
- resolvedWorkingDir = new File(workingDir);
- } else {
- String projectName;
- if (name != null) {
- projectName = KubernetesHelper.sanitize(name);
- } else if (filePath != null) {
- projectName =
KubernetesHelper.sanitize(FileUtil.onlyName(SourceScheme.onlyName(filePath)));
- } else {
- printer().println("Name or source file must be set");
- return 1;
+ File resolvedWorkingDir = new File(workingDir);
+ File candidateDir = new File(resolvedWorkingDir,
"target/kubernetes");
+ if (candidateDir.isDirectory()) {
+ resolvedManifestDir = candidateDir;
}
+ }
+
+ String projectName = getProjectName();
- resolvedWorkingDir = new File(RUN_PLATFORM_DIR + "/" +
projectName);
+ // Next, try the project name in the run dir
+ if (resolvedManifestDir == null) {
+ File resolvedWorkingDir = new File(RUN_PLATFORM_DIR + "/" +
projectName);
+ File candidateDir = new File(resolvedWorkingDir,
"target/kubernetes");
+ if (candidateDir.isDirectory()) {
+ resolvedManifestDir = candidateDir;
+ }
}
- if (!resolvedWorkingDir.exists()) {
- printer().printf("Failed to resolve exported project from path
'%s'%n", resolvedWorkingDir);
+ // Next, try the project name in the current dir
+ if (resolvedManifestDir == null) {
+ File candidateDir = new File("./target/kubernetes");
+ if (candidateDir.isDirectory()) {
+ resolvedManifestDir = candidateDir;
+ }
+ }
+
+ if (resolvedManifestDir == null) {
+ printer().printf("Failed to resolve exported project: %s%n",
projectName);
return 1;
}
- File resolvedManifestDir = new File(resolvedWorkingDir,
"target/kubernetes");
File manifest =
KubernetesHelper.resolveKubernetesManifest(clusterType, resolvedManifestDir);
+ printer().printf("Deleting resources from manifest: %s%n", manifest);
+
try (FileInputStream fis = new FileInputStream(manifest)) {
List<StatusDetails> status;
+ var loadedResources = client().load(fis);
if (!ObjectHelper.isEmpty(namespace)) {
- status = client().load(fis).inNamespace(namespace).delete();
+ status = loadedResources.inNamespace(namespace).delete();
} else {
- status = client().load(fis).delete();
+ // First, let the client choose the default namespace
+ status = loadedResources.delete();
+ // Next, explicitly name the default namespace
+ if (status.isEmpty()) {
+ status = loadedResources.inNamespace("default").delete();
+ }
}
-
status.forEach(s -> printer().printf("Deleted: %s '%s'%n",
StringHelper.capitalize(s.getKind()), s.getName()));
}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
index 1c8d3fd68b8..0b39b7ad778 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
@@ -134,6 +134,7 @@ public class KubernetesExport extends Export {
quarkusVersion = configurer.quarkusVersion;
files = configurer.files;
+ name = configurer.name;
gav = configurer.gav;
repositories = configurer.repositories;
dependencies = configurer.dependencies;
@@ -472,10 +473,12 @@ public class KubernetesExport extends Export {
}
protected String getProjectName() {
+ if (name != null) {
+ return KubernetesHelper.sanitize(name);
+ }
if (image != null) {
- return
KubernetesHelper.sanitize(KubernetesHelper.sanitize(StringHelper.beforeLast(image,
":")));
+ return KubernetesHelper.sanitize(StringHelper.beforeLast(image,
":"));
}
-
return KubernetesHelper.sanitize(super.getProjectName());
}
@@ -493,6 +496,7 @@ public class KubernetesExport extends Export {
public record ExportConfigurer(RuntimeType runtime,
String quarkusVersion,
List<String> files,
+ String name,
String gav,
String repositories,
List<String> dependencies,
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
index 976de6a4ae3..9ea8b63fe47 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
@@ -132,12 +132,14 @@ public final class KubernetesHelper {
* @return sanitized name ready to be used as a Kubernetes resource
name.
*/
public static String sanitize(String name) {
- name = FileUtil.onlyName(name);
- name = StringHelper.sanitize(name);
- name = StringHelper.camelCaseToDash(name);
- name = name.toLowerCase(Locale.US);
- name = name.replaceAll("[^a-z0-9-]", "");
- name = name.trim();
+ if (name != null) {
+ name = FileUtil.onlyName(name);
+ name = StringHelper.sanitize(name);
+ name = StringHelper.camelCaseToDash(name);
+ name = name.toLowerCase(Locale.US);
+ name = name.replaceAll("[^a-z0-9-]", "");
+ name = name.trim();
+ }
return name;
}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPlugin.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPlugin.java
index 6ca5bc2e3b7..53fb07b93f0 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPlugin.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPlugin.java
@@ -30,7 +30,7 @@ public class KubernetesPlugin implements Plugin {
.addSubcommand("run", new CommandLine(new KubernetesRun(main)))
.addSubcommand("export", new CommandLine(new
KubernetesExport(main)))
.addSubcommand("delete", new CommandLine(new
KubernetesDelete(main)))
- .addSubcommand("logs", new CommandLine(new PodLogs(main)));
+ .addSubcommand("logs", new CommandLine(new
KubernetesPodLogs(main)));
commandLine.addSubcommand("kubernetes", cmd, "k8s");
}
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/KubernetesPodLogs.java
similarity index 86%
rename from
dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogs.java
rename to
dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPodLogs.java
index a726816221d..ebb1d5a95d1 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/KubernetesPodLogs.java
@@ -25,8 +25,6 @@ import io.fabric8.kubernetes.client.dsl.LogWatch;
import io.fabric8.kubernetes.client.dsl.PodResource;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.BaseTrait;
-import org.apache.camel.dsl.jbang.core.common.SourceScheme;
-import org.apache.camel.util.FileUtil;
import org.apache.camel.util.ObjectHelper;
import picocli.CommandLine;
import picocli.CommandLine.Command;
@@ -34,16 +32,12 @@ import picocli.CommandLine.Command;
import static
org.apache.camel.dsl.jbang.core.commands.kubernetes.KubernetesHelper.getPodPhase;
@Command(name = "logs", description = "Print the logs of a Kubernetes pod",
sortOptions = false)
-public class PodLogs extends KubernetesBaseCommand {
+public class KubernetesPodLogs extends KubernetesBaseCommand {
@CommandLine.Parameters(description = "The Camel file to get logs from.
Integration name is derived from the file name.",
arity = "0..1", paramLabel = "<file>")
protected String filePath;
- @CommandLine.Option(names = { "--name" },
- description = "The integration name. Use this when the
name should not get derived from the source file name.")
- protected String name;
-
@CommandLine.Option(names = { "--label" },
description = "Label name and value used as a pod
selector.")
protected String label;
@@ -66,24 +60,15 @@ public class PodLogs extends KubernetesBaseCommand {
long maxMessageCount = -1;
long messageCount = 0;
- public PodLogs(CamelJBangMain main) {
+ public KubernetesPodLogs(CamelJBangMain main) {
super(main);
+ projectNameSuppliers.add(() -> projectNameFromFilePath(() ->
filePath));
}
public Integer doCall() throws Exception {
- if (name == null && label == null && filePath == null) {
- printer().println("Name or label selector must be set");
- return 1;
- }
-
if (label == null) {
- String projectName;
- if (name != null) {
- projectName = KubernetesHelper.sanitize(name);
- } else {
- projectName =
KubernetesHelper.sanitize(FileUtil.onlyName(SourceScheme.onlyName(filePath)));
- }
+ String projectName = getProjectName();
label = "%s=%s".formatted(BaseTrait.KUBERNETES_LABEL_NAME,
projectName);
}
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 ab396f6d823..a0c877541ed 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
@@ -28,7 +28,6 @@ import java.util.concurrent.TimeUnit;
import io.fabric8.kubernetes.api.model.Pod;
import org.apache.camel.CamelContext;
-import org.apache.camel.RuntimeCamelException;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.commands.CommandHelper;
import org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.BaseTrait;
@@ -41,7 +40,6 @@ 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;
@@ -247,15 +245,22 @@ public class KubernetesRun extends KubernetesBaseCommand {
private Thread devModeShutdownTask;
private int devModeReloadCount;
- private PodLogs reusablePodLogs;
+ private KubernetesPodLogs reusablePodLogs;
public KubernetesRun(CamelJBangMain main) {
- super(main);
+ this(main, null);
}
public KubernetesRun(CamelJBangMain main, String[] files) {
super(main);
filePaths = files;
+ projectNameSuppliers.add(() -> projectNameFromImage(() -> image));
+ projectNameSuppliers.add(() -> projectNameFromGav(() -> gav));
+ projectNameSuppliers.add(() -> projectNameFromFilePath(() ->
firstFilePath()));
+ }
+
+ private String firstFilePath() {
+ return filePaths != null && filePaths.length > 0 ? filePaths[0] : null;
}
public Integer doCall() throws Exception {
@@ -331,6 +336,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
runtime,
quarkusVersion,
List.of(filePaths),
+ name,
gav,
repositories,
dependencies,
@@ -386,11 +392,12 @@ public class KubernetesRun extends KubernetesBaseCommand {
}
private void setupDevMode(String projectName, String workingDir) throws
Exception {
+ String firstPath = firstFilePath();
String watchDir = ".";
FileFilter filter = null;
- if (filePaths != null && filePaths.length > 0) {
- String filePath =
FileUtil.onlyPath(SourceScheme.onlyName(filePaths[0]));
+ if (firstPath != null) {
+ String filePath =
FileUtil.onlyPath(SourceScheme.onlyName(firstPath));
if (filePath != null) {
watchDir = filePath;
}
@@ -469,7 +476,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
private void startPodLogging(String projectName) throws Exception {
try {
- reusablePodLogs = new PodLogs(getMain());
+ reusablePodLogs = new KubernetesPodLogs(getMain());
if (!ObjectHelper.isEmpty(namespace)) {
reusablePodLogs.namespace = namespace;
}
@@ -609,24 +616,4 @@ public class KubernetesRun extends KubernetesBaseCommand {
return 0;
}
-
- private String getProjectName() {
- if (image != null) {
- return KubernetesHelper.sanitize(StringHelper.beforeLast(image,
":"));
- }
-
- if (gav != null) {
- String[] ids = gav.split(":");
- if (ids.length > 1) {
- return KubernetesHelper.sanitize(ids[1]); // artifactId
- }
- }
-
- if (filePaths != null && filePaths.length > 0) {
- return
KubernetesHelper.sanitize(FileUtil.onlyName(SourceScheme.onlyName(filePaths[0])));
- }
-
- throw new RuntimeCamelException(
- "Failed to resolve project name - please provide --gav,
--image option or at least one source file");
- }
}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDeleteTest.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDeleteTest.java
index 644092fcc2d..d8ed4d6e6f8 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDeleteTest.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesDeleteTest.java
@@ -95,7 +95,7 @@ class KubernetesDeleteTest extends KubernetesBaseTest {
int exit = command.doCall();
Assertions.assertEquals(1, exit);
- Assertions.assertEquals("Failed to resolve exported project from path
'.camel-jbang-run/does-not-exist'",
+ Assertions.assertEquals("Failed to resolve exported project:
does-not-exist",
printer.getOutput());
}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
index cb411fbb10e..b4a0b730381 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
@@ -63,6 +63,20 @@ class KubernetesExportTest extends KubernetesExportBaseTest {
Assertions.assertEquals("1.0.0", model.getVersion());
}
+ @ParameterizedTest
+ @MethodSource("runtimeProvider")
+ public void shouldGenerateNamedProject(RuntimeType rt) throws Exception {
+ KubernetesExport command = createCommand(new String[] {
"classpath:route.yaml" },
+ "--name=projName", "--runtime=" + rt.runtime());
+ int exit = command.doCall();
+ Assertions.assertEquals(0, exit);
+
+ Model model = readMavenModel();
+ Assertions.assertEquals("org.example.project", model.getGroupId());
+ Assertions.assertEquals("proj-name", model.getArtifactId());
+ Assertions.assertEquals("1.0-SNAPSHOT", model.getVersion());
+ }
+
@ParameterizedTest
@MethodSource("runtimeProvider")
public void shouldGenerateKubernetesManifest(RuntimeType rt) throws
Exception {
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogsTest.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPodLogsTest.java
similarity index 90%
rename from
dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogsTest.java
rename to
dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPodLogsTest.java
index 4b7dcdb4be5..1575b93bc0e 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/PodLogsTest.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesPodLogsTest.java
@@ -29,11 +29,11 @@ import
org.junit.jupiter.api.condition.DisabledIfSystemProperty;
@DisabledIfSystemProperty(named = "ci.env.name", matches = ".*",
disabledReason = "Requires too much network
resources")
-class PodLogsTest extends KubernetesBaseTest {
+class KubernetesPodLogsTest extends KubernetesBaseTest {
@Test
public void shouldHandlePodNotFound() throws Exception {
- PodLogs command = createCommand();
+ KubernetesPodLogs command = createCommand();
command.name = "mickey-mouse";
command.maxRetryAttempts = 2; // total timeout of 4 seconds
int exit = command.doCall();
@@ -64,8 +64,8 @@ class PodLogsTest extends KubernetesBaseTest {
Assertions.assertEquals(0, exit);
}
- private PodLogs createCommand() {
- PodLogs command = new PodLogs(new
CamelJBangMain().withPrinter(printer));
+ private KubernetesPodLogs createCommand() {
+ KubernetesPodLogs command = new KubernetesPodLogs(new
CamelJBangMain().withPrinter(printer));
command.withClient(kubernetesClient);
return command;
}