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"