From e7e04140ba96115f0b8d880235a678460bf24f7b Mon Sep 17 00:00:00 2001 From: Thomas Diesler Date: Tue, 29 Oct 2024 07:03:32 +0100 Subject: [PATCH] [CAMEL-21392] Add support for --cluster-type=k3s --- .../ROOT/pages/camel-jbang-kubernetes.adoc | 8 +++++ .../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 + .../commands/kubernetes/KubernetesExport.java | 24 +++++++++++---- .../kubernetes/traits/DeploymentTrait.java | 12 ++++++++ .../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 8a9cddb0c8c18..e7c31814e827c 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 9939cd069e863..ec7af0012c41b 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 @@ ${camel.main.jkube.version} ${camel.main.kubernetes.image-pull-policy} - docker + ${jkube.build.strategy} ${camel.main.kubernetes.image-name} eclipse-temurin:{{ .JavaVersion }} + linux/amd64 linux/arm64 @@ -158,6 +159,7 @@ build resource + push package 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 cc7e3572ae768..902133f8d1000 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 @@ ${camel.springboot.jkube.version} ${camel.springboot.kubernetes.image-pull-policy} - docker + ${jkube.build.strategy} ${camel.springboot.kubernetes.image-name} eclipse-temurin:{{ .JavaVersion }} + linux/amd64 linux/arm64 @@ -109,6 +110,7 @@ build resource + push package diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml index c65471c737bf0..95072a9fe9e93 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 @@ camel-jbang-core + + + org.bouncycastle + bcprov-jdk18on + ${bouncycastle-version} + + + org.bouncycastle + bcpkix-jdk18on + ${bouncycastle-version} + + io.fabric8 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 adc4ed98baca1..c30ece52e348f 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 d2c9b2bc0e539..1cf5d9fa24164 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 Integer export() throws Exception { 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 Integer export() throws Exception { } 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 Integer export() throws Exception { 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 Integer export() throws Exception { } // Runtime specific for Quarkus - if (runtime == RuntimeType.quarkus) { + if (useQuarkusPlugin) { // Quarkus specific dependencies if (ClusterType.OPENSHIFT.isEqualTo(clusterType)) { @@ -325,8 +339,8 @@ public Integer export() throws Exception { 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 f705ed7596021..78d62f0181a13 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 void apply(Traits traitConfig, TraitContext context) { .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 6f54691f026a0..90569eb5bd6bc 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 TraitContext(String name, String version, Printer printer, CamelCatalog c /** * 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 String getServiceAccount() { /** * 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 SourceMetadata inspectMetaData(Source source) throws Exception { /** * Inspect all sources in this context and retrieve the source metadata. Uses internal cache for sources that have * already been inspected. - * - * @return */ public List getSourceMetadata() { List 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 d0b72f78e4444..ffd92bf2b47f8 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 @@ @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 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 void setImagePullPolicy(ImagePullPolicy imagePullPolicy) { this.imagePullPolicy = imagePullPolicy; } + public List getImagePullSecrets() { + return imagePullSecrets; + } + + public void setImagePullSecrets(List imagePullSecret) { + this.imagePullSecrets = imagePullSecret; + } + + public boolean getImagePush() { + return imagePush; + } + + public void setImagePush(boolean imagePush) { + this.imagePush = imagePush; + } + public String getLimitCPU() { return this.limitCPU; }