This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch bind
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/bind by this push:
new f379a97 CAMEL-17261: camel-yaml-dsl - Add support for loading Camel K
KameletBinding file. WIP.
f379a97 is described below
commit f379a9716884d53c1aab827a08ae001281ac950b
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Dec 4 23:03:55 2021 +0100
CAMEL-17261: camel-yaml-dsl - Add support for loading Camel K
KameletBinding file. WIP.
---
.../dsl/yaml/deserializers/ModelDeserializers.java | 37 +++++
.../deserializers/ModelDeserializersResolver.java | 3 +
dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml | 5 +
.../src/generated/resources/camel-yaml-dsl.json | 9 ++
.../camel/dsl/yaml/YamlRoutesBuilderLoader.java | 160 +++++++++++++--------
.../camel/dsl/yaml/KameletBindingLoaderTest.groovy | 16 +--
.../camel/dsl/yaml/support/YamlTestSupport.groovy | 12 ++
.../test/resources/kamelets/log-sink.kamelet.yaml | 61 ++++++++
.../resources/kamelets/timer-source.kamelet.yaml | 69 +++++++++
9 files changed, 300 insertions(+), 72 deletions(-)
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 095eb74..d40cbeee 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -69,6 +69,7 @@ import
org.apache.camel.model.Resilience4jConfigurationDefinition;
import org.apache.camel.model.RestContextRefDefinition;
import org.apache.camel.model.RollbackDefinition;
import org.apache.camel.model.RouteBuilderDefinition;
+import org.apache.camel.model.RouteConfigurationContextRefDefinition;
import org.apache.camel.model.RouteContextRefDefinition;
import org.apache.camel.model.RouteDefinition;
import org.apache.camel.model.RouteTemplateParameterDefinition;
@@ -12918,6 +12919,42 @@ public final class ModelDeserializers extends
YamlDeserializerSupport {
}
@YamlType(
+ types =
org.apache.camel.model.RouteConfigurationContextRefDefinition.class,
+ order =
org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
+ nodes = {
+ "route-configuration-context-ref",
+ "routeConfigurationContextRef"
+ },
+ properties = @YamlProperty(name = "ref", type = "string", required
= true)
+ )
+ public static class RouteConfigurationContextRefDefinitionDeserializer
extends YamlDeserializerBase<RouteConfigurationContextRefDefinition> {
+ public RouteConfigurationContextRefDefinitionDeserializer() {
+ super(RouteConfigurationContextRefDefinition.class);
+ }
+
+ @Override
+ protected RouteConfigurationContextRefDefinition newInstance() {
+ return new RouteConfigurationContextRefDefinition();
+ }
+
+ @Override
+ protected boolean setProperty(RouteConfigurationContextRefDefinition
target,
+ String propertyKey, String propertyName, Node node) {
+ switch(propertyKey) {
+ case "ref": {
+ String val = asText(node);
+ target.setRef(val);
+ break;
+ }
+ default: {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+
+ @YamlType(
types = org.apache.camel.model.RouteContextRefDefinition.class,
order =
org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
nodes = {
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
index f5837a5..f0629b1 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
@@ -363,6 +363,9 @@ public final class ModelDeserializersResolver implements
YamlDeserializerResolve
case "route-builder": return new
ModelDeserializers.RouteBuilderDefinitionDeserializer();
case "routeBuilder": return new
ModelDeserializers.RouteBuilderDefinitionDeserializer();
case "org.apache.camel.model.RouteBuilderDefinition": return new
ModelDeserializers.RouteBuilderDefinitionDeserializer();
+ case "route-configuration-context-ref": return new
ModelDeserializers.RouteConfigurationContextRefDefinitionDeserializer();
+ case "routeConfigurationContextRef": return new
ModelDeserializers.RouteConfigurationContextRefDefinitionDeserializer();
+ case
"org.apache.camel.model.RouteConfigurationContextRefDefinition": return new
ModelDeserializers.RouteConfigurationContextRefDefinitionDeserializer();
case "route-context-ref": return new
ModelDeserializers.RouteContextRefDefinitionDeserializer();
case "routeContextRef": return new
ModelDeserializers.RouteContextRefDefinitionDeserializer();
case "org.apache.camel.model.RouteContextRefDefinition": return
new ModelDeserializers.RouteContextRefDefinitionDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
index 787cfb2..045ff78 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
@@ -116,6 +116,11 @@
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
+ <artifactId>camel-timer</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
<artifactId>camel-log</artifactId>
<scope>test</scope>
</dependency>
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index b6b98fc..8614fed 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -2131,6 +2131,15 @@
} ],
"required" : [ "ref" ]
},
+ "org.apache.camel.model.RouteConfigurationContextRefDefinition" : {
+ "type" : "object",
+ "properties" : {
+ "ref" : {
+ "type" : "string"
+ }
+ },
+ "required" : [ "ref" ]
+ },
"org.apache.camel.model.RouteConfigurationDefinition" : {
"oneOf" : [ {
"type" : "string"
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 9e8b359..e186fb4 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
@@ -17,6 +17,7 @@
package org.apache.camel.dsl.yaml;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import org.apache.camel.CamelContextAware;
@@ -24,10 +25,8 @@ import org.apache.camel.api.management.ManagedResource;
import org.apache.camel.builder.ErrorHandlerBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.builder.RouteConfigurationBuilder;
-import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
import org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition;
-import org.apache.camel.model.FromDefinition;
import org.apache.camel.model.OnExceptionDefinition;
import org.apache.camel.model.RouteConfigurationDefinition;
import org.apache.camel.model.RouteDefinition;
@@ -37,14 +36,14 @@ import org.apache.camel.model.rest.RestDefinition;
import org.apache.camel.model.rest.VerbDefinition;
import org.apache.camel.spi.CamelContextCustomizer;
import org.apache.camel.spi.annotations.RoutesLoader;
-import org.snakeyaml.engine.v2.api.ConstructNode;
+import org.apache.camel.util.URISupport;
import org.snakeyaml.engine.v2.nodes.MappingNode;
import org.snakeyaml.engine.v2.nodes.Node;
import org.snakeyaml.engine.v2.nodes.NodeTuple;
import org.snakeyaml.engine.v2.nodes.NodeType;
import org.snakeyaml.engine.v2.nodes.SequenceNode;
-import org.snakeyaml.engine.v2.nodes.Tag;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asMap;
import static
org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asMappingNode;
import static
org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asSequenceNode;
import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asText;
@@ -63,71 +62,94 @@ public class YamlRoutesBuilderLoader extends
YamlRoutesBuilderLoaderSupport {
return new RouteConfigurationBuilder() {
@Override
public void configure() throws Exception {
- Node target = preConfigureNode(root);
-
- for (Node node : asSequenceNode(target).getValue()) {
- Object item =
getDeserializationContext().mandatoryResolve(node).construct(node);
-
- if (item instanceof OutputAwareFromDefinition) {
- RouteDefinition route = new RouteDefinition();
- route.setInput(((OutputAwareFromDefinition)
item).getDelegate());
- route.setOutputs(((OutputAwareFromDefinition)
item).getOutputs());
-
-
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
- getRouteCollection().route(route);
- } else if (item instanceof RouteDefinition) {
-
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
- getRouteCollection().route((RouteDefinition) item);
- } else if (item instanceof CamelContextCustomizer) {
- ((CamelContextCustomizer)
item).configure(getCamelContext());
- } else if (item instanceof OnExceptionDefinition) {
- if (!getRouteCollection().getRoutes().isEmpty()) {
- throw new IllegalArgumentException(
- "onException must be defined before any
routes in the RouteBuilder");
- }
-
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
-
getRouteCollection().getOnExceptions().add((OnExceptionDefinition) item);
- } else if (item instanceof ErrorHandlerBuilder) {
- if (!getRouteCollection().getRoutes().isEmpty()) {
- throw new IllegalArgumentException(
- "errorHandler must be defined before any
routes in the RouteBuilder");
- }
- errorHandler((ErrorHandlerBuilder) item);
- } else if (item instanceof RouteTemplateDefinition) {
-
CamelContextAware.trySetCamelContext(getRouteTemplateCollection(),
getCamelContext());
-
getRouteTemplateCollection().routeTemplate((RouteTemplateDefinition) item);
- } else if (item instanceof RestDefinition) {
- RestDefinition definition = (RestDefinition) item;
- for (VerbDefinition verb : definition.getVerbs()) {
- verb.setRest(definition);
- }
-
CamelContextAware.trySetCamelContext(getRestCollection(), getCamelContext());
- getRestCollection().rest(definition);
- } else if (item instanceof RestConfigurationDefinition) {
- ((RestConfigurationDefinition)
item).asRestConfiguration(
- getCamelContext(),
- getCamelContext().getRestConfiguration());
+ Object target = preConfigureNode(root);
+ if (target == null) {
+ return;
+ }
+
+ if (target instanceof Node) {
+ SequenceNode seq = asSequenceNode((Node) target);
+ for (Node node : seq.getValue()) {
+ Object item =
getDeserializationContext().mandatoryResolve(node).construct(node);
+ doConfigure(item);
}
+ } else {
+ doConfigure(target);
+ }
+ }
+
+ private void doConfigure(Object item) throws Exception {
+ if (item instanceof OutputAwareFromDefinition) {
+ RouteDefinition route = new RouteDefinition();
+ route.setInput(((OutputAwareFromDefinition)
item).getDelegate());
+ route.setOutputs(((OutputAwareFromDefinition)
item).getOutputs());
+
+ CamelContextAware.trySetCamelContext(getRouteCollection(),
getCamelContext());
+ getRouteCollection().route(route);
+ } else if (item instanceof RouteDefinition) {
+ CamelContextAware.trySetCamelContext(getRouteCollection(),
getCamelContext());
+ getRouteCollection().route((RouteDefinition) item);
+ } else if (item instanceof CamelContextCustomizer) {
+ ((CamelContextCustomizer)
item).configure(getCamelContext());
+ } else if (item instanceof OnExceptionDefinition) {
+ if (!getRouteCollection().getRoutes().isEmpty()) {
+ throw new IllegalArgumentException(
+ "onException must be defined before any routes
in the RouteBuilder");
+ }
+ CamelContextAware.trySetCamelContext(getRouteCollection(),
getCamelContext());
+
getRouteCollection().getOnExceptions().add((OnExceptionDefinition) item);
+ } else if (item instanceof ErrorHandlerBuilder) {
+ if (!getRouteCollection().getRoutes().isEmpty()) {
+ throw new IllegalArgumentException(
+ "errorHandler must be defined before any
routes in the RouteBuilder");
+ }
+ errorHandler((ErrorHandlerBuilder) item);
+ } else if (item instanceof RouteTemplateDefinition) {
+
CamelContextAware.trySetCamelContext(getRouteTemplateCollection(),
getCamelContext());
+
getRouteTemplateCollection().routeTemplate((RouteTemplateDefinition) item);
+ } else if (item instanceof RestDefinition) {
+ RestDefinition definition = (RestDefinition) item;
+ for (VerbDefinition verb : definition.getVerbs()) {
+ verb.setRest(definition);
+ }
+ CamelContextAware.trySetCamelContext(getRestCollection(),
getCamelContext());
+ getRestCollection().rest(definition);
+ } else if (item instanceof RestConfigurationDefinition) {
+ ((RestConfigurationDefinition) item).asRestConfiguration(
+ getCamelContext(),
+ getCamelContext().getRestConfiguration());
}
}
@Override
public void configuration() throws Exception {
- Node target = preConfigureNode(root);
+ Object target = preConfigureNode(root);
+ if (target == null) {
+ return;
+ }
- for (Node node : asSequenceNode(target).getValue()) {
- Object item =
getDeserializationContext().mandatoryResolve(node).construct(node);
- if (item instanceof RouteConfigurationDefinition) {
-
CamelContextAware.trySetCamelContext(getRouteConfigurationCollection(),
getCamelContext());
-
getRouteConfigurationCollection().routeConfiguration((RouteConfigurationDefinition)
item);
+ if (target instanceof Node) {
+ SequenceNode seq = asSequenceNode((Node) target);
+ for (Node node : seq.getValue()) {
+ Object item =
getDeserializationContext().mandatoryResolve(node).construct(node);
+ doConfiguration(item);
}
+ } else {
+ doConfiguration(target);
+ }
+ }
+
+ private void doConfiguration(Object item) {
+ if (item instanceof RouteConfigurationDefinition) {
+
CamelContextAware.trySetCamelContext(getRouteConfigurationCollection(),
getCamelContext());
+
getRouteConfigurationCollection().routeConfiguration((RouteConfigurationDefinition)
item);
}
}
};
}
- private static Node preConfigureNode(Node root) {
- Node target = root;
+ private static Object preConfigureNode(Node root) throws Exception {
+ Object target = root;
// check if the yaml is a camel-k yaml with embedded routes (called
flow(s))
if (Objects.equals(root.getNodeType(), NodeType.MAPPING)) {
@@ -159,13 +181,27 @@ public class YamlRoutesBuilderLoader extends
YamlRoutesBuilderLoaderSupport {
if (sinkKamelet) {
to = "kamelet:" + to;
}
- // add directly
- System.out.println(from + " -> " + to);
- YamlDeserializationContext ydc =
YamlDeserializerSupport.getDeserializationContext(source);
- Object route =
ydc.resolve(RouteDefinition.class).construct(target);
- System.out.println(route);
- }
+ // source properties
+ MappingNode sp = asMappingNode(nodeAt(root,
"/spec/source/properties"));
+ Map<String, Object> params = asMap(sp);
+ if (params != null && !params.isEmpty()) {
+ String query = URISupport.createQueryString(params);
+ from = from + "?" + query;
+ }
+ // sink properties
+ sp = asMappingNode(nodeAt(root, "/spec/sink/properties"));
+ params = asMap(sp);
+ if (params != null && !params.isEmpty()) {
+ String query = URISupport.createQueryString(params);
+ to = to + "?" + query;
+ }
+
+ // build kamelet binding as a route
+ RouteDefinition route = new RouteDefinition();
+ route.from(from).to(to);
+ target = route;
+ }
}
}
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 d474de8..f1fdb83 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
@@ -47,17 +47,13 @@ class KameletBindingLoaderTest extends YamlTestSupport {
name: log-sink
''')
then:
- context.routeTemplateDefinitions.size() == 1
+ context.routeDefinitions.size() == 3
- with (context.routeTemplateDefinitions[0]) {
- id == 'timer-event-source'
-
- with(route) {
- input.endpointUri == 'kamelet:timer-source'
- outputs.size() == 1
- with (outputs[0], ToDefinition) {
- endpointUri == 'kamelet:log-sink'
- }
+ with (context.routeDefinitions[0]) {
+ input.endpointUri ==
'kamelet:timer-source?message=Hello+world%21'
+ outputs.size() == 1
+ with (outputs[0], ToDefinition) {
+ endpointUri == 'kamelet:log-sink'
}
}
}
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
index 4746be8..e9da693 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
@@ -25,6 +25,7 @@ import org.apache.camel.CamelContext
import org.apache.camel.FluentProducerTemplate
import org.apache.camel.builder.RouteBuilder
import org.apache.camel.component.mock.MockEndpoint
+import org.apache.camel.dsl.yaml.KameletRoutesBuilderLoader
import org.apache.camel.dsl.yaml.YamlRoutesBuilderLoader
import org.apache.camel.dsl.yaml.common.YamlDeserializationMode
import org.apache.camel.impl.DefaultCamelContext
@@ -84,6 +85,17 @@ class YamlTestSupport extends Specification implements
HasCamelContext {
)
}
+ def loadKamelets(Resource... resources) {
+ loadKamelets(resources.toList())
+ }
+
+ def loadKamelets(Collection<Resource> resources) {
+ KameletRoutesBuilderLoader kl = new KameletRoutesBuilderLoader()
+ kl.setCamelContext(context)
+ kl.start()
+ resources.forEach(r -> kl.loadRoutesBuilder(r))
+ }
+
def loadKamelets(String... resources) {
int index = 0
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/log-sink.kamelet.yaml
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/log-sink.kamelet.yaml
new file mode 100644
index 0000000..54b37d52
--- /dev/null
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/log-sink.kamelet.yaml
@@ -0,0 +1,61 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+ name: log-sink
+ annotations:
+ camel.apache.org/kamelet.support.level: "Preview"
+ camel.apache.org/catalog.version: "main-SNAPSHOT"
+ camel.apache.org/kamelet.icon:
"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodH
[...]
+ camel.apache.org/provider: "Apache Software Foundation"
+ camel.apache.org/kamelet.group: "Logging"
+ labels:
+ camel.apache.org/kamelet.type: "sink"
+spec:
+ definition:
+ title: "Log Sink"
+ description: |-
+ A sink that logs all data that it receives, useful for debugging
purposes.
+ type: object
+ properties:
+ showHeaders:
+ title: Show Headers
+ description: Show the headers received
+ type: boolean
+ default: false
+ x-descriptors:
+ - 'urn:alm:descriptor:com.tectonic.ui:checkbox'
+ showStreams:
+ title: Show Streams
+ description: Show the stream bodies (they may not be available in
following steps)
+ type: boolean
+ default: false
+ x-descriptors:
+ - 'urn:alm:descriptor:com.tectonic.ui:checkbox'
+ dependencies:
+ - "camel:kamelet"
+ - "camel:log"
+ flow:
+ from:
+ uri: "kamelet:source"
+ steps:
+ - to:
+ uri: "log:info"
+ parameters:
+ showHeaders: "{{?showHeaders}}"
+ showStreams: "{{?showStreams}}"
\ No newline at end of file
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/timer-source.kamelet.yaml
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/timer-source.kamelet.yaml
new file mode 100644
index 0000000..96195c1
--- /dev/null
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/timer-source.kamelet.yaml
@@ -0,0 +1,69 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+ name: timer-source
+ annotations:
+ camel.apache.org/kamelet.support.level: "Preview"
+ camel.apache.org/catalog.version: "main-SNAPSHOT"
+ camel.apache.org/kamelet.icon:
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gU3ZnIFZlY3RvciBJY29ucyA6IGh0dHA6Ly93d3cub25saW5ld2ViZm9udHMuY29tL2ljb24gLS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm9
[...]
+ camel.apache.org/provider: "Apache Software Foundation"
+ camel.apache.org/kamelet.group: "Timer"
+ labels:
+ camel.apache.org/kamelet.type: source
+ camel.apache.org/kamelet.verified: "true"
+spec:
+ definition:
+ title: Timer Source
+ description: Produces periodic events with a custom payload.
+ required:
+ - message
+ type: object
+ properties:
+ period:
+ title: Period
+ description: The interval between two events in milliseconds
+ type: integer
+ default: 1000
+ message:
+ title: Message
+ description: The message to generate
+ type: string
+ example: hello world
+ contentType:
+ title: Content Type
+ description: The content type of the message being generated
+ type: string
+ default: text/plain
+ dependencies:
+ - "camel:core"
+ - "camel:timer"
+ - "camel:kamelet"
+ flow:
+ from:
+ uri: timer:tick
+ parameters:
+ period: "{{period}}"
+ steps:
+ - set-body:
+ constant: "{{message}}"
+ - set-header:
+ name: "Content-Type"
+ constant: "{{contentType}}"
+ - to: kamelet:sink
\ No newline at end of file