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 <[email protected]>
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());