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());