You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/12/07 13:51:54 UTC

[camel] 03/08: CAMEL-17261: camel-yaml-dsl - Add support for loading Camel K KameletBinding file. WIP.

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

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

commit a937b49e17307c9c2759ac07820a28ad1fe2af7c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 7 11:00:26 2021 +0100

    CAMEL-17261: camel-yaml-dsl - Add support for loading Camel K KameletBinding file. WIP.
---
 .../java/org/apache/camel/RouteTemplateContext.java    |  8 ++++++++
 .../main/java/org/apache/camel/impl/DefaultModel.java  |  4 ++--
 .../camel/model/DefaultRouteTemplateContext.java       | 18 ++++++++++++++++++
 .../apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java |  2 ++
 .../camel/dsl/yaml/KameletBindingLoaderTest.groovy     | 12 ++++++++++--
 .../test/resources/kamelets/error-handler.kamelet.yaml | 18 +++++++++---------
 6 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java b/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java
index 0b1996b..fa2c77d 100644
--- a/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/RouteTemplateContext.java
@@ -124,6 +124,14 @@ public interface RouteTemplateContext extends HasCamelContext {
     Map<String, Object> getParameters();
 
     /**
+     * Whether the route template has a parameter with the given name
+     *
+     * @param  name the parameter name
+     * @return      true if exists
+     */
+    boolean hasParameter(String name);
+
+    /**
      * Gets the local bean repository for the route template when creating the new route
      */
     BeanRepository getLocalBeanRepository();
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
index 2ff0362..83465a8 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -343,7 +343,7 @@ public class DefaultModel implements Model {
                 if (temp.getDefaultValue() != null) {
                     prop.put(temp.getName(), temp.getDefaultValue());
                 } else {
-                    if (temp.isRequired() && !routeTemplateContext.getParameters().containsKey(temp.getName())) {
+                    if (temp.isRequired() && !routeTemplateContext.hasParameter(temp.getName())) {
                         // this is a required parameter which is missing
                         templatesBuilder.add(temp.getName());
                     }
@@ -364,7 +364,7 @@ public class DefaultModel implements Model {
         // so it has all parameters available
         if (target.getTemplateParameters() != null) {
             for (RouteTemplateParameterDefinition temp : target.getTemplateParameters()) {
-                if (!routeTemplateContext.getParameters().containsKey(temp.getName()) && temp.getDefaultValue() != null) {
+                if (!routeTemplateContext.hasParameter(temp.getName()) && temp.getDefaultValue() != null) {
                     routeTemplateContext.setParameter(temp.getName(), temp.getDefaultValue());
                 }
             }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java b/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
index 4e81852..79a7452 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/DefaultRouteTemplateContext.java
@@ -27,6 +27,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.spi.BeanRepository;
 import org.apache.camel.support.LocalBeanRegistry;
+import org.apache.camel.util.StringHelper;
 
 /**
  * Default {@link RouteTemplateContext}.
@@ -107,6 +108,23 @@ public final class DefaultRouteTemplateContext implements RouteTemplateContext {
     }
 
     @Override
+    public boolean hasParameter(String name) {
+        if (parameters.containsKey(name)) {
+            return true;
+        }
+        // lookup key with both dash and camel style
+        name = StringHelper.dashToCamelCase(name);
+        if (parameters.containsKey(name)) {
+            return true;
+        }
+        name = StringHelper.camelCaseToDash(name);
+        if (parameters.containsKey(name)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     public BeanRepository getLocalBeanRepository() {
         return registry;
     }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 2bd9348..030d971 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -212,6 +212,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
             route.from(from);
 
             // steps in the middle (optional)
+            // TODO: make steps as Kamelet EIP and not TO
             Node steps = nodeAt(root, "/spec/steps");
             if (steps != null) {
                 SequenceNode sn = asSequenceNode(steps);
@@ -244,6 +245,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                     dlcb.setDeadLetterUri(dlq);
 
                     // properties (TODO: via reflection - need builder)
+                    // TODO: route templates store user parameters in cameCase (eg convert dash to camel case) (like camel-main)
                     MappingNode prop = asMappingNode(nodeAt(nt.getValueNode(), "/parameters"));
                     Map<String, Object> params = asMap(prop);
                     if (params != null) {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy
index b2f6c81..7e27750 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy
@@ -16,8 +16,10 @@
  */
 package org.apache.camel.dsl.yaml
 
+import org.apache.camel.builder.DeadLetterChannelBuilder
 import org.apache.camel.dsl.yaml.support.YamlTestSupport
 import org.apache.camel.model.ToDefinition
+import org.apache.camel.processor.errorhandler.DeadLetterChannel
 
 class KameletBindingLoaderTest extends YamlTestSupport {
     @Override
@@ -321,14 +323,20 @@ class KameletBindingLoaderTest extends YamlTestSupport {
                         redeliveryDelay: 2000    
                     ''')
         then:
-        context.routeDefinitions.size() == 2
+        context.routeDefinitions.size() == 4
 
         with (context.routeDefinitions[0]) {
+            errorHandlerFactory != null
+            errorHandlerFactory instanceof DeadLetterChannelBuilder
+            var eh = errorHandlerFactory as DeadLetterChannelBuilder
+            eh.deadLetterUri == 'kamelet:error-handler?kafkaTopic=my-first-test&logMessage=ERROR%21&kafkaServiceAccountId=scott&kafkaBrokers=my-broker&kafkaServiceAccountSecret=tiger'
+            eh.redeliveryPolicy.maximumRedeliveries == 1
+            eh.redeliveryPolicy.redeliveryDelay == 2000
             routeId == 'timer-event-source'
             input.endpointUri == 'kamelet:timer-source?message=Hello+world%21'
             outputs.size() == 1
             with (outputs[0], ToDefinition) {
-                endpointUri == 'kafka:my-topic'
+                endpointUri == 'kamelet:log-sink'
             }
         }
     }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml
index 7fcd6bd..f088fb2 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml
@@ -30,27 +30,27 @@ spec:
       - kafka-service-account-secret
       - log-message
     properties:
-      kafka-brokers:
+      kafkaBrokers:
         title: Kafka Brokers
         description: the bootstrap server
         type: string
         example: "xyz-ins--rplssqfz-yyyyyyy-crojg.bf2.kafka.my-clud-service.com:443"
-      kafka-topic:
+      kafkaTopic:
         title: Kafka Topic
         description: the DLC topic
         type: string
         example: "my-dlc"
-      kafka-service-account-id:
+      kafkaServiceAccountId:
         title: Service Account ID
         description: the SA to use
         type: string
         example: "srvc-acct-xxxxxx-519b-453f-9f68-yyyyyyyyy"
-      kafka-service-account-secret:
+      kafkaServiceAccountSecret:
         title: Service Account Secret
         description: the SA secrete to use
         type: string
         example: "xxxxxxxxx-46c7-4c6c-a753-yyyyyyyyyyyyyyy"
-      log-message:
+      logMessage:
         title: Message
         description: A message warning to log
         type: string
@@ -61,13 +61,13 @@ spec:
       steps:
         # First step: send to the DLC for future processing
         - to:
-            uri: kafka:{{kafka-topic}}
+            uri: kafka:{{kafkaTopic}}
             parameters:
-              brokers: "{{kafka-brokers}}"
+              brokers: "{{kafkaBrokers}}"
               security-protocol: SASL_SSL
               sasl-mechanism: PLAIN
-              sasl-jaas-config: "org.apache.kafka.common.security.plain.PlainLoginModule required username={{kafka-service-account-id}} password={{kafka-service-account-secret}};"
+              sasl-jaas-config: "org.apache.kafka.common.security.plain.PlainLoginModule required username={{kafkaServiceAccountId}} password={{kafkaServiceAccountSecret}};"
         # Log an error message to notify about the failure
         - set-body:
-            constant: "{{log-message}} - worry not, the event is stored in the DLC"
+            constant: "{{logMessage}} - worry not, the event is stored in the DLC"
         - to: "log:error-sink"