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:59 UTC

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

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 ccb89aa0a1a413ffc3dacaed3af1a0c0ab089c3b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 7 14:48:55 2021 +0100

    CAMEL-17261: camel-yaml-dsl - Add support for loading Camel K KameletBinding file.
---
 .../DeadLetterChannelBuilderConfigurer.java        | 145 +++++++++++++++++++++
 .../DefaultErrorHandlerBuilderConfigurer.java      | 145 +++++++++++++++++++++
 ...g.apache.camel.builder.DeadLetterChannelBuilder |   2 +
 ...apache.camel.builder.DefaultErrorHandlerBuilder |   2 +
 .../camel/builder/DeadLetterChannelBuilder.java    |   2 +
 .../camel/builder/DefaultErrorHandlerBuilder.java  |   2 +
 .../modules/ROOT/pages/camel-jbang.adoc            |  36 +++++
 .../camel-yaml-dsl/src/main/docs/yaml-dsl.adoc     |  51 ++++++++
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    |  41 ++++--
 .../camel/dsl/yaml/KameletBindingLoaderTest.groovy |  94 +++++++++++++
 .../dsl/yaml/KameletIntegrationLoaderTest.groovy   |  61 +++++++++
 .../camel/dsl/yaml/support/YamlTestSupport.groovy  |  10 ++
 12 files changed, 580 insertions(+), 11 deletions(-)

diff --git a/core/camel-core-model/src/generated/java/org/apache/camel/builder/DeadLetterChannelBuilderConfigurer.java b/core/camel-core-model/src/generated/java/org/apache/camel/builder/DeadLetterChannelBuilderConfigurer.java
new file mode 100644
index 0000000..8c62d65
--- /dev/null
+++ b/core/camel-core-model/src/generated/java/org/apache/camel/builder/DeadLetterChannelBuilderConfigurer.java
@@ -0,0 +1,145 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.builder;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.builder.DeadLetterChannelBuilder;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class DeadLetterChannelBuilderConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.builder.DeadLetterChannelBuilder target = (org.apache.camel.builder.DeadLetterChannelBuilder) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "asyncdelayedredelivery":
+        case "AsyncDelayedRedelivery": target.setAsyncDelayedRedelivery(property(camelContext, boolean.class, value)); return true;
+        case "deadletterhandlenewexception":
+        case "DeadLetterHandleNewException": target.setDeadLetterHandleNewException(property(camelContext, boolean.class, value)); return true;
+        case "deadletteruri":
+        case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true;
+        case "executorservice":
+        case "ExecutorService": target.setExecutorService(property(camelContext, java.util.concurrent.ScheduledExecutorService.class, value)); return true;
+        case "executorserviceref":
+        case "ExecutorServiceRef": target.setExecutorServiceRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "logger":
+        case "Logger": target.setLogger(property(camelContext, org.apache.camel.spi.CamelLogger.class, value)); return true;
+        case "onexceptionoccurred":
+        case "OnExceptionOccurred": target.setOnExceptionOccurred(property(camelContext, org.apache.camel.Processor.class, value)); return true;
+        case "onexceptionoccurredref":
+        case "OnExceptionOccurredRef": target.setOnExceptionOccurredRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "onpreparefailure":
+        case "OnPrepareFailure": target.setOnPrepareFailure(property(camelContext, org.apache.camel.Processor.class, value)); return true;
+        case "onpreparefailureref":
+        case "OnPrepareFailureRef": target.setOnPrepareFailureRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "onredelivery":
+        case "OnRedelivery": target.setOnRedelivery(property(camelContext, org.apache.camel.Processor.class, value)); return true;
+        case "onredeliveryref":
+        case "OnRedeliveryRef": target.setOnRedeliveryRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "redeliverypolicy":
+        case "RedeliveryPolicy": target.setRedeliveryPolicy(property(camelContext, org.apache.camel.processor.errorhandler.RedeliveryPolicy.class, value)); return true;
+        case "retrywhile":
+        case "RetryWhile": target.setRetryWhile(property(camelContext, org.apache.camel.Predicate.class, value)); return true;
+        case "retrywhileref":
+        case "RetryWhileRef": target.setRetryWhileRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "useoriginalbody":
+        case "UseOriginalBody": target.setUseOriginalBody(property(camelContext, boolean.class, value)); return true;
+        case "useoriginalmessage":
+        case "UseOriginalMessage": target.setUseOriginalMessage(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "asyncdelayedredelivery":
+        case "AsyncDelayedRedelivery": return boolean.class;
+        case "deadletterhandlenewexception":
+        case "DeadLetterHandleNewException": return boolean.class;
+        case "deadletteruri":
+        case "DeadLetterUri": return java.lang.String.class;
+        case "executorservice":
+        case "ExecutorService": return java.util.concurrent.ScheduledExecutorService.class;
+        case "executorserviceref":
+        case "ExecutorServiceRef": return java.lang.String.class;
+        case "logger":
+        case "Logger": return org.apache.camel.spi.CamelLogger.class;
+        case "onexceptionoccurred":
+        case "OnExceptionOccurred": return org.apache.camel.Processor.class;
+        case "onexceptionoccurredref":
+        case "OnExceptionOccurredRef": return java.lang.String.class;
+        case "onpreparefailure":
+        case "OnPrepareFailure": return org.apache.camel.Processor.class;
+        case "onpreparefailureref":
+        case "OnPrepareFailureRef": return java.lang.String.class;
+        case "onredelivery":
+        case "OnRedelivery": return org.apache.camel.Processor.class;
+        case "onredeliveryref":
+        case "OnRedeliveryRef": return java.lang.String.class;
+        case "redeliverypolicy":
+        case "RedeliveryPolicy": return org.apache.camel.processor.errorhandler.RedeliveryPolicy.class;
+        case "retrywhile":
+        case "RetryWhile": return org.apache.camel.Predicate.class;
+        case "retrywhileref":
+        case "RetryWhileRef": return java.lang.String.class;
+        case "useoriginalbody":
+        case "UseOriginalBody": return boolean.class;
+        case "useoriginalmessage":
+        case "UseOriginalMessage": return boolean.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.builder.DeadLetterChannelBuilder target = (org.apache.camel.builder.DeadLetterChannelBuilder) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "asyncdelayedredelivery":
+        case "AsyncDelayedRedelivery": return target.isAsyncDelayedRedelivery();
+        case "deadletterhandlenewexception":
+        case "DeadLetterHandleNewException": return target.isDeadLetterHandleNewException();
+        case "deadletteruri":
+        case "DeadLetterUri": return target.getDeadLetterUri();
+        case "executorservice":
+        case "ExecutorService": return target.getExecutorService();
+        case "executorserviceref":
+        case "ExecutorServiceRef": return target.getExecutorServiceRef();
+        case "logger":
+        case "Logger": return target.getLogger();
+        case "onexceptionoccurred":
+        case "OnExceptionOccurred": return target.getOnExceptionOccurred();
+        case "onexceptionoccurredref":
+        case "OnExceptionOccurredRef": return target.getOnExceptionOccurredRef();
+        case "onpreparefailure":
+        case "OnPrepareFailure": return target.getOnPrepareFailure();
+        case "onpreparefailureref":
+        case "OnPrepareFailureRef": return target.getOnPrepareFailureRef();
+        case "onredelivery":
+        case "OnRedelivery": return target.getOnRedelivery();
+        case "onredeliveryref":
+        case "OnRedeliveryRef": return target.getOnRedeliveryRef();
+        case "redeliverypolicy":
+        case "RedeliveryPolicy": return target.getRedeliveryPolicy();
+        case "retrywhile":
+        case "RetryWhile": return target.getRetryWhile();
+        case "retrywhileref":
+        case "RetryWhileRef": return target.getRetryWhileRef();
+        case "useoriginalbody":
+        case "UseOriginalBody": return target.isUseOriginalBody();
+        case "useoriginalmessage":
+        case "UseOriginalMessage": return target.isUseOriginalMessage();
+        default: return null;
+        }
+    }
+}
+
diff --git a/core/camel-core-model/src/generated/java/org/apache/camel/builder/DefaultErrorHandlerBuilderConfigurer.java b/core/camel-core-model/src/generated/java/org/apache/camel/builder/DefaultErrorHandlerBuilderConfigurer.java
new file mode 100644
index 0000000..cf45d98
--- /dev/null
+++ b/core/camel-core-model/src/generated/java/org/apache/camel/builder/DefaultErrorHandlerBuilderConfigurer.java
@@ -0,0 +1,145 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.builder;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.builder.DefaultErrorHandlerBuilder;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class DefaultErrorHandlerBuilderConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.builder.DefaultErrorHandlerBuilder target = (org.apache.camel.builder.DefaultErrorHandlerBuilder) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "asyncdelayedredelivery":
+        case "AsyncDelayedRedelivery": target.setAsyncDelayedRedelivery(property(camelContext, boolean.class, value)); return true;
+        case "deadletterhandlenewexception":
+        case "DeadLetterHandleNewException": target.setDeadLetterHandleNewException(property(camelContext, boolean.class, value)); return true;
+        case "deadletteruri":
+        case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true;
+        case "executorservice":
+        case "ExecutorService": target.setExecutorService(property(camelContext, java.util.concurrent.ScheduledExecutorService.class, value)); return true;
+        case "executorserviceref":
+        case "ExecutorServiceRef": target.setExecutorServiceRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "logger":
+        case "Logger": target.setLogger(property(camelContext, org.apache.camel.spi.CamelLogger.class, value)); return true;
+        case "onexceptionoccurred":
+        case "OnExceptionOccurred": target.setOnExceptionOccurred(property(camelContext, org.apache.camel.Processor.class, value)); return true;
+        case "onexceptionoccurredref":
+        case "OnExceptionOccurredRef": target.setOnExceptionOccurredRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "onpreparefailure":
+        case "OnPrepareFailure": target.setOnPrepareFailure(property(camelContext, org.apache.camel.Processor.class, value)); return true;
+        case "onpreparefailureref":
+        case "OnPrepareFailureRef": target.setOnPrepareFailureRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "onredelivery":
+        case "OnRedelivery": target.setOnRedelivery(property(camelContext, org.apache.camel.Processor.class, value)); return true;
+        case "onredeliveryref":
+        case "OnRedeliveryRef": target.setOnRedeliveryRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "redeliverypolicy":
+        case "RedeliveryPolicy": target.setRedeliveryPolicy(property(camelContext, org.apache.camel.processor.errorhandler.RedeliveryPolicy.class, value)); return true;
+        case "retrywhile":
+        case "RetryWhile": target.setRetryWhile(property(camelContext, org.apache.camel.Predicate.class, value)); return true;
+        case "retrywhileref":
+        case "RetryWhileRef": target.setRetryWhileRef(property(camelContext, java.lang.String.class, value)); return true;
+        case "useoriginalbody":
+        case "UseOriginalBody": target.setUseOriginalBody(property(camelContext, boolean.class, value)); return true;
+        case "useoriginalmessage":
+        case "UseOriginalMessage": target.setUseOriginalMessage(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "asyncdelayedredelivery":
+        case "AsyncDelayedRedelivery": return boolean.class;
+        case "deadletterhandlenewexception":
+        case "DeadLetterHandleNewException": return boolean.class;
+        case "deadletteruri":
+        case "DeadLetterUri": return java.lang.String.class;
+        case "executorservice":
+        case "ExecutorService": return java.util.concurrent.ScheduledExecutorService.class;
+        case "executorserviceref":
+        case "ExecutorServiceRef": return java.lang.String.class;
+        case "logger":
+        case "Logger": return org.apache.camel.spi.CamelLogger.class;
+        case "onexceptionoccurred":
+        case "OnExceptionOccurred": return org.apache.camel.Processor.class;
+        case "onexceptionoccurredref":
+        case "OnExceptionOccurredRef": return java.lang.String.class;
+        case "onpreparefailure":
+        case "OnPrepareFailure": return org.apache.camel.Processor.class;
+        case "onpreparefailureref":
+        case "OnPrepareFailureRef": return java.lang.String.class;
+        case "onredelivery":
+        case "OnRedelivery": return org.apache.camel.Processor.class;
+        case "onredeliveryref":
+        case "OnRedeliveryRef": return java.lang.String.class;
+        case "redeliverypolicy":
+        case "RedeliveryPolicy": return org.apache.camel.processor.errorhandler.RedeliveryPolicy.class;
+        case "retrywhile":
+        case "RetryWhile": return org.apache.camel.Predicate.class;
+        case "retrywhileref":
+        case "RetryWhileRef": return java.lang.String.class;
+        case "useoriginalbody":
+        case "UseOriginalBody": return boolean.class;
+        case "useoriginalmessage":
+        case "UseOriginalMessage": return boolean.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.builder.DefaultErrorHandlerBuilder target = (org.apache.camel.builder.DefaultErrorHandlerBuilder) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "asyncdelayedredelivery":
+        case "AsyncDelayedRedelivery": return target.isAsyncDelayedRedelivery();
+        case "deadletterhandlenewexception":
+        case "DeadLetterHandleNewException": return target.isDeadLetterHandleNewException();
+        case "deadletteruri":
+        case "DeadLetterUri": return target.getDeadLetterUri();
+        case "executorservice":
+        case "ExecutorService": return target.getExecutorService();
+        case "executorserviceref":
+        case "ExecutorServiceRef": return target.getExecutorServiceRef();
+        case "logger":
+        case "Logger": return target.getLogger();
+        case "onexceptionoccurred":
+        case "OnExceptionOccurred": return target.getOnExceptionOccurred();
+        case "onexceptionoccurredref":
+        case "OnExceptionOccurredRef": return target.getOnExceptionOccurredRef();
+        case "onpreparefailure":
+        case "OnPrepareFailure": return target.getOnPrepareFailure();
+        case "onpreparefailureref":
+        case "OnPrepareFailureRef": return target.getOnPrepareFailureRef();
+        case "onredelivery":
+        case "OnRedelivery": return target.getOnRedelivery();
+        case "onredeliveryref":
+        case "OnRedeliveryRef": return target.getOnRedeliveryRef();
+        case "redeliverypolicy":
+        case "RedeliveryPolicy": return target.getRedeliveryPolicy();
+        case "retrywhile":
+        case "RetryWhile": return target.getRetryWhile();
+        case "retrywhileref":
+        case "RetryWhileRef": return target.getRetryWhileRef();
+        case "useoriginalbody":
+        case "UseOriginalBody": return target.isUseOriginalBody();
+        case "useoriginalmessage":
+        case "UseOriginalMessage": return target.isUseOriginalMessage();
+        default: return null;
+        }
+    }
+}
+
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DeadLetterChannelBuilder b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DeadLetterChannelBuilder
new file mode 100644
index 0000000..358dea6
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DeadLetterChannelBuilder
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.builder.DeadLetterChannelBuilderConfigurer
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DefaultErrorHandlerBuilder b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DefaultErrorHandlerBuilder
new file mode 100644
index 0000000..4365a67
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DefaultErrorHandlerBuilder
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.builder.DefaultErrorHandlerBuilderConfigurer
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
index e7c10f9..67e49b3 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
@@ -23,11 +23,13 @@ import org.apache.camel.model.errorhandler.DeadLetterChannelProperties;
 import org.apache.camel.model.errorhandler.DefaultErrorHandlerConfiguration;
 import org.apache.camel.processor.errorhandler.DeadLetterChannel;
 import org.apache.camel.spi.CamelLogger;
+import org.apache.camel.spi.Configurer;
 import org.slf4j.LoggerFactory;
 
 /**
  * A builder of a <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel</a>
  */
+@Configurer
 public class DeadLetterChannelBuilder extends DefaultErrorHandlerBuilder implements DeadLetterChannelProperties {
 
     public DeadLetterChannelBuilder() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
index 45dcbfc..400a536 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
@@ -28,6 +28,7 @@ import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
 import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
+import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.Language;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
 import org.slf4j.LoggerFactory;
@@ -35,6 +36,7 @@ import org.slf4j.LoggerFactory;
 /**
  * The default error handler builder.
  */
+@Configurer
 public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport implements DefaultErrorHandlerProperties {
 
     private final DefaultErrorHandlerConfiguration configuration;
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 0108fee..d7e3115 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -144,6 +144,42 @@ You can also use Camel JBang to try local Kamelets, without the need to publish
 jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run --local-kamelet-dir=/path/to/local/kamelets earthquake.yaml
 ----
 
+=== Running Camel K integrations or bindings
+
+Camel also supports running Camel K integrations and binding files, which are in CRD format (Kubernetes Custom Resource Definitions).
+
+For example a kamelet binding file named `joke.yaml`:
+
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: joke
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1
+      name: chuck-norris-source
+    properties:
+      period: 2000
+  sink:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1
+      name: log-sink
+    properties:
+      show-headers: false
+----
+
+Can be run with CamelJBang:
+
+[source,bash]
+----
+jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run joke.yaml
+----
+
 === Search
 
 You can use the CLI to search for kamelets, components, languages and miscellaneous components (others). Running the following command will present a list of items that can be searched:
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc
index fb2c28e..2567b0f 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc
@@ -271,3 +271,54 @@ which demonstrate creating Camel Routes with YAML.
 
 Another way to find examples of YAML DSL is to look in https://github.com/apache/camel-kamelets[Camel Kamelets]
 where each Kamelet is defined using YAML.
+
+== Camel K support
+
+The `camel-yaml-dsl` is supported by Camel K.
+
+=== Loading Camel K integrations
+
+A Camel K integration (in CRD format (Custom Resource Definition in Kubernetes))
+can be loaded by `camel-yaml-dsl` and run as routes:
+
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: hello.yaml
+spec:
+  flows:
+    - from:
+        uri: "timer:tick?period=5000"
+    steps:
+      - to: "log:tick"
+----
+
+=== Loading Camel K bindings
+
+A Camel K binding (in CRD format (Custom Resource Definition in Kubernetes))
+can be loaded by `camel-yaml-dsl` and run as routes:
+
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: joke
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1
+      name: chuck-norris-source
+    properties:
+      period: 2000
+  sink:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1
+      name: log-sink
+    properties:
+      show-headers: false
+----
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 2d44291..dd370a6 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
@@ -22,7 +22,9 @@ import java.util.Objects;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
+import org.apache.camel.builder.DefaultErrorHandlerBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilder;
+import org.apache.camel.builder.NoErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.builder.RouteConfigurationBuilder;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
@@ -31,10 +33,10 @@ import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RouteConfigurationDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.VerbDefinition;
-import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelContextCustomizer;
 import org.apache.camel.spi.annotations.RoutesLoader;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -231,30 +233,47 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
             route.to(to);
 
             // is there any error handler?
-            // TODO: set it globally via configuration so its inherited
             MappingNode errorHandler = asMappingNode(nodeAt(root, "/spec/errorHandler"));
             if (errorHandler != null) {
                 // there are 5 different error handlers, which one is it
                 NodeTuple nt = errorHandler.getValue().get(0);
                 String ehName = asText(nt.getKeyNode());
-                if ("dead-letter-channel".equals(ehName)) {
-                    DeadLetterChannelBuilder dlcb = new DeadLetterChannelBuilder();
 
+                DefaultErrorHandlerProperties ehb = null;
+                if ("dead-letter-channel".equals(ehName)) {
+                    DeadLetterChannelBuilder dlch = new DeadLetterChannelBuilder();
                     // endpoint
                     MappingNode endpoint = asMappingNode(nodeAt(nt.getValueNode(), "/endpoint"));
                     String dlq = extractCamelEndpointUri(endpoint);
-                    dlcb.setDeadLetterUri(dlq);
+                    dlch.setDeadLetterUri(dlq);
+                    ehb = dlch;
+                } else if ("log".equals(ehName)) {
+                    // log is the default error handler
+                    ehb = new DefaultErrorHandlerBuilder();
+                } else if ("none".equals(ehName)) {
+                    route.errorHandler(new NoErrorHandlerBuilder());
+                } else if ("bean".equals(ehName)) {
+                    throw new IllegalArgumentException("Bean error handler is not supported");
+                } else if ("ref".equals(ehName)) {
+                    throw new IllegalArgumentException("Ref error handler is not supported");
+                }
 
-                    // properties
+                // some error handlers support additional parameters
+                if (ehb != null) {
+                    // properties that are general for all kind of error handlers
                     MappingNode prop = asMappingNode(nodeAt(nt.getValueNode(), "/parameters"));
                     Map<String, Object> params = asMap(prop);
                     if (params != null) {
-                        // the parameters are for redelivery policy
-                        RedeliveryPolicy rp = new RedeliveryPolicy();
-                        dlcb.setRedeliveryPolicy(rp);
-                        PropertyBindingSupport.build().withIgnoreCase(true).bind(getCamelContext(), rp, params);
+                        PropertyBindingSupport.build()
+                                .withIgnoreCase(true)
+                                .withFluentBuilder(true)
+                                .withRemoveParameters(true)
+                                .withCamelContext(getCamelContext())
+                                .withTarget(ehb)
+                                .withProperties(params)
+                                .bind();
                     }
-                    route.errorHandler(dlcb);
+                    route.errorHandler(ehb);
                 }
             }
 
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 166bdc5..724f867 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
@@ -19,6 +19,8 @@ package org.apache.camel.dsl.yaml
 import org.apache.camel.Exchange
 import org.apache.camel.Processor
 import org.apache.camel.builder.DeadLetterChannelBuilder
+import org.apache.camel.builder.DefaultErrorHandlerBuilder
+import org.apache.camel.builder.NoErrorHandlerBuilder
 import org.apache.camel.component.mock.MockEndpoint
 import org.apache.camel.dsl.yaml.support.YamlTestSupport
 import org.apache.camel.model.ToDefinition
@@ -399,4 +401,96 @@ class KameletBindingLoaderTest extends YamlTestSupport {
         }
     }
 
+    def "kamelet binding with log error handler"() {
+        when:
+
+        // stub kafka for testing as it requires to setup connection to a real kafka broker
+        context.addComponent("kafka", context.getComponent("stub"))
+
+        loadBindings('''
+                apiVersion: camel.apache.org/v1alpha1
+                kind: KameletBinding
+                metadata:
+                  name: timer-event-source                  
+                spec:
+                  source:
+                    ref:
+                      kind: Kamelet
+                      apiVersion: camel.apache.org/v1
+                      name: timer-source
+                    properties:
+                      message: "Hello world!"
+                  sink:
+                    ref:
+                      kind: Kamelet
+                      apiVersion: camel.apache.org/v1alpha1
+                      name: log-sink
+                  errorHandler:
+                    log:
+                      parameters:
+                        use-original-message: true
+                        maximumRedeliveries: 1
+                        redeliveryDelay: 2000    
+                    ''')
+        then:
+        context.routeDefinitions.size() == 3
+
+        with (context.routeDefinitions[0]) {
+            errorHandlerFactory != null
+            errorHandlerFactory instanceof DefaultErrorHandlerBuilder
+            var eh = errorHandlerFactory as DefaultErrorHandlerBuilder
+            eh.redeliveryPolicy.maximumRedeliveries == 1
+            eh.redeliveryPolicy.redeliveryDelay == 2000
+            eh.isUseOriginalMessage() == true
+            routeId == 'timer-event-source'
+            input.endpointUri == 'kamelet:timer-source?message=Hello+world%21'
+            outputs.size() == 1
+            with (outputs[0], ToDefinition) {
+                endpointUri == 'kamelet:log-sink'
+            }
+        }
+    }
+
+    def "kamelet binding with none error handler"() {
+        when:
+
+        // stub kafka for testing as it requires to setup connection to a real kafka broker
+        context.addComponent("kafka", context.getComponent("stub"))
+
+        loadBindings('''
+                apiVersion: camel.apache.org/v1alpha1
+                kind: KameletBinding
+                metadata:
+                  name: timer-event-source                  
+                spec:
+                  source:
+                    ref:
+                      kind: Kamelet
+                      apiVersion: camel.apache.org/v1
+                      name: timer-source
+                    properties:
+                      message: "Hello world!"
+                  sink:
+                    ref:
+                      kind: Kamelet
+                      apiVersion: camel.apache.org/v1alpha1
+                      name: log-sink
+                  errorHandler:
+                    none:
+                    ''')
+        then:
+        context.routeDefinitions.size() == 3
+
+        with (context.routeDefinitions[0]) {
+            errorHandlerFactory != null
+            errorHandlerFactory instanceof NoErrorHandlerBuilder
+            routeId == 'timer-event-source'
+            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/KameletIntegrationLoaderTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletIntegrationLoaderTest.groovy
new file mode 100644
index 0000000..289b9f4
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletIntegrationLoaderTest.groovy
@@ -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.
+ */
+package org.apache.camel.dsl.yaml
+
+import org.apache.camel.dsl.yaml.support.YamlTestSupport
+import org.apache.camel.model.KameletDefinition
+
+class KameletIntegrationLoaderTest extends YamlTestSupport {
+    @Override
+    def doSetup() {
+        context.start()
+    }
+
+    def "kamelet integration"() {
+        when:
+            loadIntegrations('''
+                apiVersion: camel.apache.org/v1
+                kind: Integration
+                metadata:
+                  name: foobar
+                spec:
+                  flows:
+                    - from:
+                        uri: 'kamelet:timer-source'
+                        steps:
+                          - kamelet:
+                              name: log-sink
+                              parameters:
+                                showStreams: false
+                                showHeaders: false
+                        parameters:
+                          message: Hello Camel K
+                          period: 1234
+                      ''')
+        then:
+            context.routeDefinitions.size() == 3
+
+            with (context.routeDefinitions[0]) {
+                input.endpointUri == 'kamelet:timer-source?message=Hello Camel K&period=1234'
+                outputs.size() == 1
+                with (outputs[0], KameletDefinition) {
+                    name == 'log-sink?showStreams=false&showHeaders=false'
+                }
+            }
+    }
+
+}
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 e9da693..78c81da 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
@@ -106,6 +106,16 @@ class YamlTestSupport extends Specification implements HasCamelContext {
         )
     }
 
+    def loadIntegrations(String... resources) {
+        int index = 0
+
+        context.routesLoader.loadRoutes(
+            resources.collect {
+                it -> ResourceHelper.fromString("integration-${index++}.yaml", it.stripIndent())
+            }
+        )
+    }
+
     def loadBindings(String... resources) {
         int index = 0