You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gf...@apache.org on 2024/11/07 15:11:10 UTC

(camel) branch main updated: [CAMEL-21392] Add support for --cluster-type=k3s

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

gfournier 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 2485f8e193d [CAMEL-21392] Add support for --cluster-type=k3s
2485f8e193d is described below

commit 2485f8e193dccfd136f99754f0ed622b7235665a
Author: Thomas Diesler <td...@redhat.com>
AuthorDate: Tue Oct 29 07:03:32 2024 +0100

    [CAMEL-21392] Add support for --cluster-type=k3s
---
 .../modules/ROOT/pages/camel-jbang-kubernetes.adoc |  8 ++++++
 .../resources/templates/main-kubernetes-pom.tmpl   |  4 ++-
 .../templates/spring-boot-kubernetes-pom.tmpl      |  4 ++-
 .../camel-jbang-plugin-kubernetes/pom.xml          | 12 +++++++++
 .../core/commands/kubernetes/ClusterType.java      |  1 +
 .../core/commands/kubernetes/KubernetesExport.java | 24 ++++++++++++++----
 .../kubernetes/traits/DeploymentTrait.java         | 12 +++++++++
 .../commands/kubernetes/traits/TraitContext.java   |  9 ++-----
 .../kubernetes/traits/model/Container.java         | 29 +++++++++++++++++++++-
 9 files changed, 88 insertions(+), 15 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 8a9cddb0c8c..e7c31814e82 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
@@ -225,6 +225,14 @@ The container trait is able to customize the container specification with follow
 | PullPolicy
 | The pull policy: Always\|Never\|IfNotPresent
 
+| container.image-pull-secrets
+| string[]
+| The pull secrets for private registries
+
+| container.image-push
+| boolean
+| Enable image push to the registry
+
 | container.request-cpu
 | string
 | The minimum amount of CPU required.
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.tmpl
index 9939cd069e8..ec7af0012c4 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.tmpl
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.tmpl
@@ -129,12 +129,13 @@
                 <version>${camel.main.jkube.version}</version>
                 <configuration>
                     <imagePullPolicy>${camel.main.kubernetes.image-pull-policy}</imagePullPolicy>
-                    <buildStrategy>docker</buildStrategy>
+                    <buildStrategy>${jkube.build.strategy}</buildStrategy>
                     <images>
                         <image>
                             <name>${camel.main.kubernetes.image-name}</name>
                             <build>
                                 <from>eclipse-temurin:{{ .JavaVersion }}</from>
+                                <!-- Supported only when using the jib build strategy -->
                                 <createImageOptions>
                                     <platform>linux/amd64</platform>
                                     <platform>linux/arm64</platform>
@@ -158,6 +159,7 @@
                         <goals>
                             <goal>build</goal>
                             <goal>resource</goal>
+                            <goal>push</goal>
                         </goals>
                         <phase>package</phase>
                     </execution>
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.tmpl
index cc7e3572ae7..902133f8d10 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.tmpl
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.tmpl
@@ -80,12 +80,13 @@
                 <version>${camel.springboot.jkube.version}</version>
                 <configuration>
                     <imagePullPolicy>${camel.springboot.kubernetes.image-pull-policy}</imagePullPolicy>
-                    <buildStrategy>docker</buildStrategy>
+                    <buildStrategy>${jkube.build.strategy}</buildStrategy>
                     <images>
                         <image>
                             <name>${camel.springboot.kubernetes.image-name}</name>
                             <build>
                                 <from>eclipse-temurin:{{ .JavaVersion }}</from>
+                                <!-- Supported only when using the jib build strategy -->
                                 <createImageOptions>
                                     <platform>linux/amd64</platform>
                                     <platform>linux/arm64</platform>
@@ -109,6 +110,7 @@
                         <goals>
                             <goal>build</goal>
                             <goal>resource</goal>
+                            <goal>push</goal>
                         </goals>
                         <phase>package</phase>
                     </execution>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
index c65471c737b..95072a9fe9e 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
@@ -47,6 +47,18 @@
           <artifactId>camel-jbang-core</artifactId>
         </dependency>
 
+        <!-- Needed for TLS access to private registries -->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk18on</artifactId>
+            <version>${bouncycastle-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk18on</artifactId>
+            <version>${bouncycastle-version}</version>
+        </dependency>
+
         <!-- Kubernetes -->
         <dependency>
             <groupId>io.fabric8</groupId>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/ClusterType.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/ClusterType.java
index adc4ed98bac..c30ece52e34 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/ClusterType.java
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/ClusterType.java
@@ -26,6 +26,7 @@ public enum ClusterType {
     KUBERNETES,
     OPENSHIFT,
     KIND,
+    K3S,
     MINIKUBE;
 
     public static ClusterType fromName(String name) {
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 d2c9b2bc0e5..1cf5d9fa241 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
@@ -105,7 +105,7 @@ public class KubernetesExport extends Export {
                         description = "The image registry group used to push images to.")
     protected String imageGroup;
 
-    @CommandLine.Option(names = { "--image-builder" },
+    @CommandLine.Option(names = { "--image-builder" }, defaultValue = "jib",
                         description = "The image builder used to build the container image (e.g. docker, jib, podman, s2i).")
     protected String imageBuilder;
 
@@ -187,6 +187,9 @@ public class KubernetesExport extends Export {
             propPrefix = runtime.runtime();
         }
 
+        boolean useQuarkusPlugin = runtime == RuntimeType.quarkus;
+        boolean useJKubePlugin = !useQuarkusPlugin;
+
         // Resolve image group and registry
         String resolvedImageGroup = resolveImageGroup();
         if (resolvedImageGroup != null) {
@@ -194,7 +197,7 @@ public class KubernetesExport extends Export {
         }
 
         String resolvedImageRegistry = resolveImageRegistry();
-        if (resolvedImageRegistry != null) {
+        if (useQuarkusPlugin && resolvedImageRegistry != null) {
             var allowInsecure = resolvedImageRegistry.startsWith("localhost");
             buildProperties.add("%s.container-image.registry=%s".formatted(propPrefix, resolvedImageRegistry));
             buildProperties.add("%s.container-image.insecure=%b".formatted(propPrefix, allowInsecure));
@@ -289,6 +292,17 @@ public class KubernetesExport extends Export {
             buildProperties.add("%s.kubernetes.image-pull-policy=%s".formatted(propPrefix, imagePullPolicy));
         }
 
+        if (useJKubePlugin) {
+            if ("docker".equals(imageBuilder) || "jib".equals(imageBuilder)) {
+                buildProperties.add("jkube.build.strategy=%s".formatted(imageBuilder));
+            }
+            if (resolvedImageRegistry != null) {
+                buildProperties.add("jkube.docker.push.registry=%s".formatted(resolvedImageRegistry));
+            }
+            var skipPush = !container.getImagePush();
+            buildProperties.add("jkube.skip.push=%b".formatted(skipPush));
+        }
+
         // Runtime specific for Main
         if (runtime == RuntimeType.main) {
             addDependencies("org.apache.camel:camel-health",
@@ -296,7 +310,7 @@ public class KubernetesExport extends Export {
         }
 
         // Runtime specific for Quarkus
-        if (runtime == RuntimeType.quarkus) {
+        if (useQuarkusPlugin) {
 
             // Quarkus specific dependencies
             if (ClusterType.OPENSHIFT.isEqualTo(clusterType)) {
@@ -325,8 +339,8 @@ public class KubernetesExport extends Export {
             buildProperties.add("quarkus.container-image.build=true");
         }
 
-        // SpringBoot Runtime specific
-        if (runtime == RuntimeType.springBoot || runtime == RuntimeType.main) {
+        // SpringBoot/Main Runtime specific
+        if (useJKubePlugin) {
             if (ClusterType.OPENSHIFT.isEqualTo(clusterType)) {
                 buildProperties.add("%s.jkube.maven.plugin=%s".formatted(propPrefix, "openshift-maven-plugin"));
             } else {
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/DeploymentTrait.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/DeploymentTrait.java
index f705ed75960..78d62f0181a 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/DeploymentTrait.java
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/DeploymentTrait.java
@@ -17,10 +17,13 @@
 
 package org.apache.camel.dsl.jbang.core.commands.kubernetes.traits;
 
+import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import io.fabric8.kubernetes.api.model.LabelSelectorBuilder;
 import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
+import org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.model.Container;
 import org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.model.Traits;
 
 public class DeploymentTrait extends BaseTrait {
@@ -46,6 +49,15 @@ public class DeploymentTrait extends BaseTrait {
                         .build())
                 .endSpec();
 
+        Container containerTrait = Optional.ofNullable(traitConfig.getContainer()).orElseGet(Container::new);
+        Optional.ofNullable(containerTrait.getImagePullSecrets()).orElseGet(List::of).forEach(sec -> deployment.editSpec()
+                .editOrNewTemplate()
+                .editOrNewSpec()
+                .addNewImagePullSecret(sec)
+                .endSpec()
+                .endTemplate()
+                .endSpec());
+
         if (context.getServiceAccount() != null) {
             deployment.editSpec()
                     .editOrNewTemplate()
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitContext.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitContext.java
index 6f54691f026..90569eb5bd6 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitContext.java
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitContext.java
@@ -92,8 +92,6 @@ public class TraitContext {
 
     /**
      * Adds a resource that should be created as part of the Camel app.
-     *
-     * @param resource
      */
     public void add(VisitableBuilder<?, ?> resource) {
         resourceRegistry.add(resource);
@@ -235,9 +233,8 @@ public class TraitContext {
     /**
      * Performs source metadata inspection and uses local cache to not inspect the same source over and over again.
      *
-     * @param  source    the source to inspect and create the metadata from.
-     * @return           the metadata holding information such as components, endpoints, languages used with the source.
-     * @throws Exception
+     * @param  source the source to inspect and create the metadata from.
+     * @return        the metadata holding information such as components, endpoints, languages used with the source.
      */
     public SourceMetadata inspectMetaData(Source source) throws Exception {
         if (sourceMetadata.containsKey(source.name())) {
@@ -252,8 +249,6 @@ public class TraitContext {
     /**
      * Inspect all sources in this context and retrieve the source metadata. Uses internal cache for sources that have
      * already been inspected.
-     *
-     * @return
      */
     public List<SourceMetadata> getSourceMetadata() {
         List<SourceMetadata> answer = new ArrayList<>();
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/model/Container.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/model/Container.java
index d0b72f78e44..ffd92bf2b47 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/model/Container.java
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/model/Container.java
@@ -30,7 +30,8 @@ import com.fasterxml.jackson.annotation.Nulls;
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
         "allowPrivilegeEscalation", "auto", "capabilitiesAdd", "capabilitiesDrop", "enabled", "expose",
-        "image", "imagePullPolicy", "limitCPU", "limitMemory", "name", "port", "portName", "requestCPU", "requestMemory",
+        "image", "imagePullPolicy", "imagePullSecrets", "limitCPU", "limitMemory", "name", "port", "portName", "requestCPU",
+        "requestMemory",
         "runAsNonRoot", "runAsUser", "seccompProfileType", "servicePort", "servicePortName" })
 public class Container {
     @JsonProperty("allowPrivilegeEscalation")
@@ -73,6 +74,16 @@ public class Container {
     @JsonSetter(
                 nulls = Nulls.SKIP)
     private ImagePullPolicy imagePullPolicy;
+    @JsonProperty("imagePullSecrets")
+    @JsonPropertyDescription("The pull secrets for private registries")
+    @JsonSetter(
+                nulls = Nulls.SKIP)
+    private List<String> imagePullSecrets;
+    @JsonProperty("imagePush")
+    @JsonPropertyDescription("Enable image push to the registry")
+    @JsonSetter(
+                nulls = Nulls.SKIP)
+    private boolean imagePush;
     @JsonProperty("limitCPU")
     @JsonPropertyDescription("The maximum amount of CPU to be provided (default 500 millicores).")
     @JsonSetter(
@@ -201,6 +212,22 @@ public class Container {
         this.imagePullPolicy = imagePullPolicy;
     }
 
+    public List<String> getImagePullSecrets() {
+        return imagePullSecrets;
+    }
+
+    public void setImagePullSecrets(List<String> imagePullSecret) {
+        this.imagePullSecrets = imagePullSecret;
+    }
+
+    public boolean getImagePush() {
+        return imagePush;
+    }
+
+    public void setImagePush(boolean imagePush) {
+        this.imagePush = imagePush;
+    }
+
     public String getLimitCPU() {
         return this.limitCPU;
     }