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 <tdies...@redhat.com> 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; }