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;
     }

Reply via email to