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

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


The following commit(s) were added to refs/heads/main by this push:
     new d8b569a6e9d CAMEL-21013: Add cluster-type and image-builder export 
command option
d8b569a6e9d is described below

commit d8b569a6e9d08f91ef49d5e87c1a26232f98d061
Author: Christoph Deppisch <cdeppi...@redhat.com>
AuthorDate: Thu Jul 25 19:26:22 2024 +0200

    CAMEL-21013: Add cluster-type and image-builder export command option
    
    - Cluster type specifies the target cluster Kind, Minikube, OpenShift and 
enables cluster specific configuration options on the export
    - Image builder option allows to choose the container image builder 
technology: jib, docker, podman, s2i
---
 .../modules/ROOT/pages/camel-jbang-kubernetes.adoc |  8 +-
 .../core/commands/kubernetes/KubernetesExport.java | 85 ++++++++++++++++------
 .../core/commands/kubernetes/KubernetesRun.java    | 13 +++-
 .../commands/kubernetes/KubernetesCommandTest.java |  2 +-
 .../commands/kubernetes/KubernetesRunTest.java     |  2 +-
 5 files changed, 82 insertions(+), 28 deletions(-)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
index d1c9f05b197..cdcef3e3568 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
@@ -140,10 +140,16 @@ The Camel JBang Kubernetes export command provides 
several options to customize
 |An image built externally (for instance via CI/CD). Enabling it will skip the 
integration build phase.
 
 |--image-registry
-|The image registry to hold the app container image. Default is `quay.io`
+|The image registry to hold the app container image.
 
 |--image-group
 |The image registry group used to push images to.
+
+|--image-builder
+|The image builder used to build the container image (e.g. docker, jib, 
podman, s2i).
+
+|--cluster-type
+|The target cluster type. Special configurations may be applied to different 
cluster types such as Kind or Minikube.
 |=======================================================================
 
 == Kubernetes manifest options
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 320ffa67bf3..10fac52011b 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
@@ -109,6 +109,14 @@ public class KubernetesExport extends Export {
                         description = "The image registry group used to push 
images to.")
     protected String imageGroup;
 
+    @CommandLine.Option(names = { "--image-builder" },
+                        description = "The image builder used to build the 
container image (e.g. docker, jib, podman, s2i).")
+    protected String imageBuilder;
+
+    @CommandLine.Option(names = { "--cluster-type" },
+                        description = "The target cluster type. Special 
configurations may be applied to different cluster types such as Kind or 
Minikube.")
+    protected String clusterType;
+
     private static final String SRC_MAIN_RESOURCES = "/src/main/resources/";
 
     public KubernetesExport(CamelJBangMain main) {
@@ -158,23 +166,12 @@ public class KubernetesExport extends Export {
         }
 
         // Resolve image group and registry
-        String resolvedImageGroup = null;
-        if (image != null) {
-            resolvedImageGroup = extractImageGroup(image);
-        } else if (imageGroup != null) {
-            resolvedImageGroup = imageGroup;
-        } else if (gav != null) {
-            var groupId = parseMavenGav(gav).getGroupId();
-            var dotToks = groupId.split("\\.");
-            resolvedImageGroup = dotToks[dotToks.length - 1];
-        }
-
-        String resolvedImageRegistry = resolveImageRegistry();
-
+        String resolvedImageGroup = resolveImageGroup();
         if (resolvedImageGroup != null) {
             
buildProperties.add("%s.container-image.group=%s".formatted(propPrefix, 
resolvedImageGroup));
         }
 
+        String resolvedImageRegistry = resolveImageRegistry();
         if (resolvedImageRegistry != null) {
             var allowInsecure = resolvedImageRegistry.startsWith("localhost");
             
buildProperties.add("%s.container-image.registry=%s".formatted(propPrefix, 
resolvedImageRegistry));
@@ -258,19 +255,33 @@ public class KubernetesExport extends Export {
         if (runtime == RuntimeType.quarkus) {
 
             // Quarkus specific dependencies
-            addDependencies("io.quarkus:quarkus-kubernetes", 
"camel:cli-connector");
+            if (clusterType != null && clusterType.equals("openshift")) {
+                addDependencies("io.quarkus:quarkus-openshift");
+                if (imageBuilder == null) {
+                    // use s2i image builder as a default on OpenShift
+                    imageBuilder = "s2i";
+                }
+            } else {
+                addDependencies("io.quarkus:quarkus-kubernetes");
+            }
 
             // TODO: remove when fixed kubernetes-client version is part of 
the Quarkus platform
             // pin kubernetes-client to this version because of 
https://github.com/fabric8io/kubernetes-client/issues/6059
             addDependencies("io.fabric8:kubernetes-client:6.13.1");
 
-            // Mutually exclusive image build plugins - use Jib by default
-            if 
(!dependencies.contains("io.quarkus:quarkus-container-image-docker")) {
+            // Configure image builder - use Jib by default
+            if (imageBuilder == null) {
                 addDependencies("io.quarkus:quarkus-container-image-jib");
+            } else if (imageBuilder.equals("s2i")) {
+                
addDependencies("io.quarkus:quarkus-container-image-openshift");
+            } else {
+                
addDependencies("io.quarkus:quarkus-container-image-%s".formatted(imageBuilder));
             }
 
             // Quarkus specific properties
             buildProperties.add("quarkus.container-image.build=true");
+            buildProperties
+                    
.add("quarkus.container-image.builder=%s".formatted(Optional.ofNullable(imageBuilder).orElse("jib")));
         }
 
         // SpringBoot Runtime specific
@@ -370,20 +381,48 @@ public class KubernetesExport extends Export {
         labels = labelList.toArray(new String[0]);
     }
 
+    private String resolveImageGroup() {
+        if (image != null) {
+            return extractImageGroup(image);
+        }
+
+        if (imageGroup != null) {
+            return imageGroup;
+        }
+
+        if (gav != null) {
+            var groupId = parseMavenGav(gav).getGroupId();
+            var dotToks = groupId.split("\\.");
+            return dotToks[dotToks.length - 1];
+        }
+
+        return null;
+    }
+
     private String resolveImageRegistry() {
-        String resolvedImageRegistry = null;
         if (image != null) {
-            resolvedImageRegistry = extractImageRegistry(image);
-        } else if (imageRegistry != null) {
+            return extractImageRegistry(image);
+        }
+
+        if (imageRegistry != null) {
             if (imageRegistry.equals("kind") || 
imageRegistry.equals("kind-registry")) {
-                resolvedImageRegistry = "localhost:5001";
+                return "localhost:5001";
             } else if (imageRegistry.equals("minikube") || 
imageRegistry.equals("minikube-registry")) {
-                resolvedImageRegistry = "localhost:5000";
+                return "localhost:5000";
             } else {
-                resolvedImageRegistry = imageRegistry;
+                return imageRegistry;
             }
         }
-        return resolvedImageRegistry;
+
+        if (clusterType != null) {
+            if (clusterType.equals("kind")) {
+                return "localhost:5001";
+            } else if (clusterType.equals("minikube")) {
+                return "localhost:5000";
+            }
+        }
+
+        return null;
     }
 
     private String extractImageGroup(String image) {
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 eb10202c9e8..853c658f710 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
@@ -120,14 +120,21 @@ public class KubernetesRun extends KubernetesBaseCommand {
     String image;
 
     @CommandLine.Option(names = { "--image-registry" },
-                        defaultValue = "quay.io",
                         description = "The image registry to hold the app 
container image.")
-    String imageRegistry = "quay.io";
+    String imageRegistry;
 
     @CommandLine.Option(names = { "--image-group" },
                         description = "The image registry group used to push 
images to.")
     String imageGroup;
 
+    @CommandLine.Option(names = { "--image-builder" },
+                        description = "The image builder used to build the 
container image (e.g. docker, jib, podman, s2i).")
+    String imageBuilder;
+
+    @CommandLine.Option(names = { "--cluster-type" },
+                        description = "The target cluster type. Special 
configurations may be applied to different cluster types such as Kind or 
Minikube.")
+    String clusterType;
+
     @CommandLine.Option(names = { "--image-build" },
                         defaultValue = "true",
                         description = "Weather to build container image as 
part of the run.")
@@ -184,6 +191,8 @@ public class KubernetesRun extends KubernetesBaseCommand {
         export.image = image;
         export.imageRegistry = imageRegistry;
         export.imageGroup = imageGroup;
+        export.imageBuilder = imageBuilder;
+        export.clusterType = clusterType;
         export.traitProfile = traitProfile;
         export.serviceAccount = serviceAccount;
         export.properties = properties;
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesCommandTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesCommandTest.java
index fc12a0a1460..ce6dc58ca84 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesCommandTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesCommandTest.java
@@ -59,7 +59,7 @@ class KubernetesCommandTest extends KubernetesBaseTest {
         Assertions.assertEquals("route", 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getName());
         Assertions.assertEquals(3, 
deployment.getSpec().getSelector().getMatchLabels().size());
         Assertions.assertEquals("route", 
deployment.getSpec().getSelector().getMatchLabels().get(BaseTrait.INTEGRATION_LABEL));
-        Assertions.assertEquals("quay.io/camel-test/route:1.0-SNAPSHOT",
+        Assertions.assertEquals("docker.io/camel-test/route:1.0-SNAPSHOT",
                 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage());
         Assertions.assertEquals("Always",
                 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImagePullPolicy());
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
index 904456be913..b2d7f934765 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
@@ -72,7 +72,7 @@ class KubernetesRunTest extends KubernetesBaseTest {
         Assertions.assertEquals("route", 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getName());
         Assertions.assertEquals(3, 
deployment.getSpec().getSelector().getMatchLabels().size());
         Assertions.assertEquals("route", 
deployment.getSpec().getSelector().getMatchLabels().get(BaseTrait.INTEGRATION_LABEL));
-        Assertions.assertEquals("quay.io/camel-test/route:1.0-SNAPSHOT",
+        Assertions.assertEquals("docker.io/camel-test/route:1.0-SNAPSHOT",
                 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage());
         Assertions.assertEquals("Always",
                 
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImagePullPolicy());

Reply via email to