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

Reply via email to