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

davsclaus pushed a commit to branch camel-4.8.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-4.8.x by this push:
     new 17288d73634 CAMEL-21369: camel-jbang kubernetes - add quarkus 
extensions configuration for Route trait (#16140)
17288d73634 is described below

commit 17288d73634c7174562a9557c5ff404d0b75fa03
Author: Gaƫlle Fournier <gaelle.fournier.w...@gmail.com>
AuthorDate: Sat Nov 2 08:11:58 2024 +0100

    CAMEL-21369: camel-jbang kubernetes - add quarkus extensions configuration 
for Route trait (#16140)
---
 .../dsl/jbang/core/commands/k/IntegrationRun.java  |  3 +-
 .../core/commands/kubernetes/KubernetesExport.java |  2 +-
 .../core/commands/kubernetes/traits/BaseTrait.java |  7 +++
 .../commands/kubernetes/traits/RouteTrait.java     | 54 ++++++++++++++++++++++
 .../core/commands/kubernetes/traits/Trait.java     | 34 ++++++++++++++
 .../commands/kubernetes/traits/TraitCatalog.java   |  6 ++-
 .../commands/kubernetes/traits/TraitContext.java   |  4 ++
 .../commands/kubernetes/KubernetesExportTest.java  | 14 ++++++
 8 files changed, 121 insertions(+), 3 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationRun.java
 
b/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationRun.java
index 1bae50309a7..64979ee556e 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationRun.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationRun.java
@@ -39,6 +39,7 @@ import 
org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.TraitHelper;
 import org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.TraitProfile;
 import org.apache.camel.dsl.jbang.core.common.JSonHelper;
 import org.apache.camel.dsl.jbang.core.common.Printer;
+import org.apache.camel.dsl.jbang.core.common.RuntimeType;
 import org.apache.camel.dsl.jbang.core.common.Source;
 import org.apache.camel.dsl.jbang.core.common.SourceHelper;
 import org.apache.camel.dsl.jbang.core.common.SourceScheme;
@@ -317,7 +318,7 @@ public class IntegrationRun extends KubernetesBaseCommand {
                     TraitHelper.configureContainerImage(traitsSpec, image, 
"quay.io", null, integration.getMetadata().getName(),
                             "1.0-SNAPSHOT");
 
-                    new TraitCatalog().apply(traitsSpec, context, 
traitProfile);
+                    new TraitCatalog().apply(traitsSpec, context, 
traitProfile, RuntimeType.quarkus);
 
                     printer().println(
                             
context.buildItems().stream().map(KubernetesHelper::dumpYaml).collect(Collectors.joining("---")));
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 ef7b0b91962..6f5829e924e 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
@@ -356,7 +356,7 @@ public class KubernetesExport extends Export {
             printer().println("Building Kubernetes manifest ...");
         }
 
-        new TraitCatalog().apply(traitsSpec, context, traitProfile);
+        new TraitCatalog().apply(traitsSpec, context, traitProfile, runtime);
 
         var kubeFragments = 
context.buildItems().stream().map(KubernetesHelper::toJsonMap).toList();
 
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/BaseTrait.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/BaseTrait.java
index 3e1aadf09de..91d6e524ae3 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/BaseTrait.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/BaseTrait.java
@@ -17,6 +17,9 @@
 
 package org.apache.camel.dsl.jbang.core.commands.kubernetes.traits;
 
+import org.apache.camel.dsl.jbang.core.common.RuntimeType;
+import org.apache.camel.v1.integrationspec.Traits;
+
 public abstract class BaseTrait implements Trait {
 
     public static final String KUBERNETES_NAME_LABEL = 
"app.kubernetes.io/name";
@@ -46,4 +49,8 @@ public abstract class BaseTrait implements Trait {
     public boolean accept(TraitProfile profile) {
         return true;
     }
+
+    @Override
+    public void applyRuntimeSpecificProperties(Traits traitConfig, 
TraitContext context, RuntimeType runtimeType) {
+    }
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/RouteTrait.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/RouteTrait.java
index 1ceac8eb60e..6f0d171030d 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/RouteTrait.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/RouteTrait.java
@@ -20,12 +20,16 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import io.fabric8.kubernetes.api.model.IntOrString;
 import io.fabric8.kubernetes.api.model.IntOrStringBuilder;
 import io.fabric8.openshift.api.model.RouteBuilder;
 import io.fabric8.openshift.api.model.TLSConfigBuilder;
+import org.apache.camel.dsl.jbang.core.common.RuntimeType;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.v1.integrationspec.Traits;
@@ -114,6 +118,56 @@ public class RouteTrait extends BaseTrait {
 
     }
 
+    @Override
+    public void applyRuntimeSpecificProperties(Traits traitConfig, 
TraitContext context, RuntimeType runtimeType) {
+        List<String> routeProperties = new ArrayList<>();
+        if (runtimeType == RuntimeType.quarkus) {
+            Route routeTrait = 
Optional.ofNullable(traitConfig.getRoute()).orElseGet(Route::new);
+            Container containerTrait = 
Optional.ofNullable(traitConfig.getContainer()).orElseGet(Container::new);
+
+            routeProperties.add("quarkus.openshift.route.expose=true");
+            if (routeTrait.getAnnotations() != null) {
+                routeTrait.getAnnotations().forEach((name, value) -> 
routeProperties
+                        
.add("quarkus.openshift.route.annotations.\"%s\"=%s".formatted(name, value)));
+            }
+
+            if (routeTrait.getHost() != null) {
+                
routeProperties.add("quarkus.openshift.route.host=%s".formatted(routeTrait.getHost()));
+            }
+            routeProperties.add("quarkus.openshift.route.target-port=%s"
+                    
.formatted(Optional.ofNullable(containerTrait.getServicePortName()).orElse(DEFAULT_CONTAINER_PORT_NAME)));
+
+            if (routeTrait.getTlsTermination() != null) {
+                routeProperties
+                        
.add("quarkus.openshift.route.tls.termination=%s".formatted(routeTrait.getTlsTermination().getValue()));
+            }
+            if (routeTrait.getTlsCertificate() != null) {
+                routeProperties.add(
+                        "quarkus.openshift.route.tls.certificate=%s"
+                                
.formatted(getContent(routeTrait.getTlsCertificate()).replaceAll("\n", 
"\\\\n")));
+            }
+            if (routeTrait.getTlsKey() != null) {
+                routeProperties.add("quarkus.openshift.route.tls.key=%s"
+                        
.formatted(getContent(routeTrait.getTlsKey()).replaceAll("\n", "\\\\n")));
+            }
+            if (routeTrait.getTlsCACertificate() != null) {
+                routeProperties
+                        .add("quarkus.openshift.route.tls.ca-certificate=%s"
+                                
.formatted(getContent(routeTrait.getTlsCACertificate()).replaceAll("\n", 
"\\\\n")));
+            }
+            if (routeTrait.getTlsDestinationCACertificate() != null) {
+                
routeProperties.add("quarkus.openshift.route.tls.destination-ca-certificate=%s"
+                        
.formatted(getContent(routeTrait.getTlsDestinationCACertificate()).replaceAll("\n",
 "\\\\n")));
+            }
+            if (routeTrait.getTlsInsecureEdgeTerminationPolicy() != null) {
+                
routeProperties.add("quarkus.openshift.route.tls.insecure-edge-termination-policy=%s"
+                        
.formatted(routeTrait.getTlsInsecureEdgeTerminationPolicy()));
+            }
+        }
+        context.addOrAppendConfigurationResource("application.properties",
+                
routeProperties.stream().collect(Collectors.joining(System.lineSeparator())));
+    }
+
     @Override
     public boolean accept(TraitProfile profile) {
         return TraitProfile.OPENSHIFT == profile;
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/Trait.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/Trait.java
index 25f86a14262..d99ce74ed31 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/Trait.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/Trait.java
@@ -17,18 +17,52 @@
 
 package org.apache.camel.dsl.jbang.core.commands.kubernetes.traits;
 
+import org.apache.camel.dsl.jbang.core.common.RuntimeType;
 import org.apache.camel.v1.integrationspec.Traits;
 
 public interface Trait extends Comparable<Trait> {
 
+    /**
+     * Evaluate if Trait configuration is ready to be applyed
+     *
+     * @param  traitConfig trait configuration
+     * @param  context     command traits context
+     * @return             true if the trait configuration can be applied to 
context
+     */
     boolean configure(Traits traitConfig, TraitContext context);
 
+    /**
+     * Apply trait configuration to context
+     *
+     * @param traitConfig trait configuration
+     * @param context     command traits context
+     */
     void apply(Traits traitConfig, TraitContext context);
 
+    /**
+     * Priority order for trait application.
+     *
+     * @return order
+     */
     int order();
 
+    /**
+     * Evaluate if trait can be applied to trait profile
+     *
+     * @param  profile trait profile
+     * @return         true if applicable
+     */
     boolean accept(TraitProfile profile);
 
+    /**
+     * Add runtime properties to command trait context to be added to 
generated project properties
+     *
+     * @param traitConfig trait configuration
+     * @param context     command traits context
+     * @param runtimeType
+     */
+    void applyRuntimeSpecificProperties(Traits traitConfig, TraitContext 
context, RuntimeType runtimeType);
+
     @Override
     default int compareTo(Trait o) {
         return Integer.compare(order(), o.order());
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitCatalog.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitCatalog.java
index 97037f066a3..c882f9a0a8b 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitCatalog.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/TraitCatalog.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 
 import 
org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.knative.KnativeServiceTrait;
 import 
org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.knative.KnativeTrait;
+import org.apache.camel.dsl.jbang.core.common.RuntimeType;
 import org.apache.camel.v1.integrationspec.Traits;
 
 /**
@@ -69,18 +70,21 @@ public class TraitCatalog {
      * @param traitsSpec   the trait configuration spec.
      * @param context      the trait context.
      * @param traitProfile the optional trait profile to select traits.
+     * @param runtimeType  the runtime.
      */
-    public void apply(Traits traitsSpec, TraitContext context, String 
traitProfile) {
+    public void apply(Traits traitsSpec, TraitContext context, String 
traitProfile, RuntimeType runtimeType) {
         if (traitProfile != null) {
             new 
TraitCatalog().traitsForProfile(TraitProfile.valueOf(traitProfile.toUpperCase(Locale.US))).forEach(t
 -> {
                 if (t.configure(traitsSpec, context)) {
                     t.apply(traitsSpec, context);
+                    t.applyRuntimeSpecificProperties(traitsSpec, context, 
runtimeType);
                 }
             });
         } else {
             new TraitCatalog().allTraits().forEach(t -> {
                 if (t.configure(traitsSpec, context)) {
                     t.apply(traitsSpec, context);
+                    t.applyRuntimeSpecificProperties(traitsSpec, context, 
runtimeType);
                 }
             });
         }
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 e77ceaf784d..dbb5c50a1fb 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
@@ -275,6 +275,10 @@ public class TraitContext {
         this.configurationResources.put(name, content);
     }
 
+    public void addOrAppendConfigurationResource(String name, String content) {
+        this.configurationResources.merge(name, content, (content1, content2) 
-> content1 + System.lineSeparator() + content2);
+    }
+
     public void doWithConfigurationResources(BiConsumer<String, String> 
consumer) {
         configurationResources.forEach(consumer);
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
index 41465a27e01..43fcf690144 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java
@@ -290,6 +290,20 @@ class KubernetesExportTest extends KubernetesBaseTest {
         Assertions.assertEquals("route-service", 
route.getSpec().getTo().getName());
         
Assertions.assertTrue(certificate.startsWith(route.getSpec().getTls().getCertificate()));
         
Assertions.assertTrue(key.startsWith(route.getSpec().getTls().getKey()));
+
+        if (RuntimeType.quarkus.equals(rt)) {
+            Properties applicationProperties = 
getApplicationProperties(workingDir);
+            Assertions.assertEquals("true", 
applicationProperties.get("quarkus.openshift.route.expose"));
+            Assertions.assertEquals("example.com",
+                    applicationProperties.get("quarkus.openshift.route.host"));
+            Assertions.assertEquals("http",
+                    
applicationProperties.get("quarkus.openshift.route.target-port"));
+            Assertions.assertEquals("edge",
+                    
applicationProperties.get("quarkus.openshift.route.tls.termination"));
+            Assertions.assertTrue(certificate.startsWith(
+                    
applicationProperties.get("quarkus.openshift.route.tls.certificate").toString()));
+            
Assertions.assertTrue(key.startsWith(applicationProperties.get("quarkus.openshift.route.tls.key").toString()));
+        }
     }
 
     @ParameterizedTest

Reply via email to