You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2021/12/14 06:57:15 UTC

[camel-kamelets] branch main updated: #397: Add Pulsar sink Kamelet

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 283de1a  #397: Add Pulsar sink Kamelet
283de1a is described below

commit 283de1a6397a0d83ada8015201b1911928264e2d
Author: Luigi De Masi <ld...@redhat.com>
AuthorDate: Fri Dec 10 18:29:02 2021 +0100

    #397: Add Pulsar sink Kamelet
---
 .../ROOT/assets/images/kamelets/pulsar-sink.svg    | 100 ++++++++++++
 docs/modules/ROOT/nav.adoc                         |   1 +
 docs/modules/ROOT/pages/pulsar-sink.adoc           | 173 +++++++++++++++++++++
 kamelets/pulsar-sink.kamelet.yaml                  | 171 ++++++++++++++++++++
 .../bindings/camel-k/pulsar-sink-binding.yaml      |  22 +++
 templates/bindings/core/pulsar-sink-binding.yaml   |  16 ++
 6 files changed, 483 insertions(+)

diff --git a/docs/modules/ROOT/assets/images/kamelets/pulsar-sink.svg b/docs/modules/ROOT/assets/images/kamelets/pulsar-sink.svg
new file mode 100644
index 0000000..3fc97fc
--- /dev/null
+++ b/docs/modules/ROOT/assets/images/kamelets/pulsar-sink.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   viewBox="0 0 60.973999 43.09"
+   version="1.1"
+   id="svg24"
+   sodipodi:docname="pulsar-logo.svg"
+   width="60.973999"
+   height="43.09"
+   inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <sodipodi:namedview
+     id="namedview26"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     showgrid="false"
+     units="px"
+     inkscape:zoom="3.0043662"
+     inkscape:cx="31.454221"
+     inkscape:cy="43.436782"
+     inkscape:window-width="1920"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg24" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">.cls-1{fill:#188fff;}.cls-2{fill:#464e56;}</style>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath316">
+      <rect
+         id="rect318"
+         width="60.973946"
+         height="43.513111"
+         x="4.0966033e-10"
+         y="-0.42311111" />
+    </clipPath>
+  </defs>
+  <title
+     id="title6">Asset 2</title>
+  <g
+     id="Layer_2"
+     data-name="Layer 2"
+     transform="translate(0.2971442,0.06848085)"
+     clip-path="url(#clipPath316)">
+    <g
+       id="Layer_1-2"
+       data-name="Layer 1">
+      <path
+         class="cls-1"
+         d="M 61,13.73 H 46.09 C 42.06,6 37.8,0 32,0 24.45,0 20.9,6.59 17.47,13 l -0.3,0.56 H 0 v 3.81 h 10 c 3.53,0 4.25,1.19 4.25,1.19 -2.77,4.3 -6.1,8.55 -11.65,8.55 H 0 v 4 h 2.62 c 10.76,0 15.46,-8.73 19.23,-15.74 C 25.31,8.91 27.72,5 32,5 c 4.44,0 9.11,9.66 13.22,18.19 0.6,1.24 1.21,2.51 1.83,3.77 -15.76,0.5 -23.27,4.19 -29.38,7.2 -4.47,2.2 -8,4.93 -13.81,4.93 H 0 v 4 h 3.83 c 7,0 11.36,-2.16 16,-4.45 6.43,-3.16 13.72,-6.74 30.9,-6.74 h 9.93 v -4 h -5.61 a 3,3 0 0 1 -2.47,-1 C 51.6 [...]
+         id="path8" />
+      <path
+         class="cls-2"
+         d="M 79.83,13.7 H 69.44 v 3.74 H 79.6 c 4.2,0 6.61,1.91 6.61,5.33 0,3.24 -2.66,5.33 -6.77,5.33 h -10 v 13 h 4 v -9.3 h 5.93 c 5.42,0 10.88,-2.83 10.88,-9.22 -0.03,-5.4 -4.11,-8.88 -10.42,-8.88 z"
+         id="path10" />
+      <path
+         class="cls-2"
+         d="m 113.31,29.57 c 0,5.31 -2.66,8.24 -7.48,8.24 -4.82,0 -7.6,-3.07 -7.6,-8.43 V 13.7 h -4 v 15.87 c 0,7.39 4.4,12 11.49,12 7.09,0 11.56,-4.57 11.56,-12.23 V 13.7 h -4 z"
+         id="path12" />
+      <polygon
+         class="cls-2"
+         points="142.22,41.14 142.22,37.39 127.33,37.39 127.33,13.7 123.36,13.7 123.36,41.14 "
+         id="polygon14" />
+      <path
+         class="cls-2"
+         d="M 156.69,25.5 C 150.95,24.27 149.9,22.97 149.9,20.76 149.9,18.55 152,17 155,17 a 11.12,11.12 0 0 1 7.32,2.76 l 0.4,0.32 2.36,-3.08 -0.37,-0.3 a 14.22,14.22 0 0 0 -9.61,-3.36 c -5.32,0 -9.18,3.24 -9.18,7.79 0,5.06 3.71,6.91 9.27,8.12 5.56,1.21 6.49,2.44 6.49,4.62 0,2.36 -2.22,4 -5.41,4 -3.37,0 -5.9,-1 -8.74,-3.62 l -0.38,-0.34 -2.49,2.95 0.36,0.32 a 15.91,15.91 0 0 0 11.14,4.36 c 5.61,0 9.52,-3.28 9.52,-8 0.01,-4.28 -2.68,-6.67 -8.99,-8.04 z"
+         id="path16" />
+      <path
+         class="cls-2"
+         d="m 180.19,13.51 -12.5,27.63 h 4.14 l 3.14,-7 h 13.76 l 3.1,7 h 4.29 l -12.5,-27.63 z m -3.61,17 5.29,-11.8 5.26,11.8 z"
+         id="path18" />
+      <path
+         class="cls-2"
+         d="m 215.18,30.15 c 4.29,-1 6.82,-4 6.82,-8.11 a 7.77,7.77 0 0 0 -2.18,-5.56 11,11 0 0 0 -7.87,-2.79 h -11.87 v 27.45 h 4 V 30.85 h 6.82 l 7.67,10.28 h 4.9 z m -11.14,-3 v -9.71 h 7.67 c 4,0 6.28,1.72 6.28,4.8 0,3.08 -2.48,5 -6.31,5 z"
+         id="path20" />
+    </g>
+  </g>
+  <metadata
+     id="metadata819">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:title>Asset 2</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+</svg>
diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index 019ac58..b8c4dab 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -116,6 +116,7 @@
 * xref:ROOT:predicate-filter-action.adoc[image:kamelets/predicate-filter-action.svg[] Predicate Filter Action]
 * xref:ROOT:protobuf-deserialize-action.adoc[image:kamelets/protobuf-deserialize-action.svg[] Protobuf Deserialize Action]
 * xref:ROOT:protobuf-serialize-action.adoc[image:kamelets/protobuf-serialize-action.svg[] Protobuf Serialize Action]
+* xref:ROOT:pulsar-sink.adoc[image:kamelets/pulsar-sink.svg[] Pulsar Sink]
 * xref:ROOT:pulsar-source.adoc[image:kamelets/pulsar-source.svg[] Pulsar Source]
 * xref:ROOT:rabbitmq-source.adoc[image:kamelets/rabbitmq-source.svg[] RabbitMQ Source]
 * xref:ROOT:redis-sink.adoc[image:kamelets/redis-sink.svg[] Redis Sink]
diff --git a/docs/modules/ROOT/pages/pulsar-sink.adoc b/docs/modules/ROOT/pages/pulsar-sink.adoc
new file mode 100644
index 0000000..605a662
--- /dev/null
+++ b/docs/modules/ROOT/pages/pulsar-sink.adoc
@@ -0,0 +1,173 @@
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
+
+= image:kamelets/pulsar-sink.svg[] Pulsar Sink
+
+*Provided by: "Apache Software Foundation"*
+
+*Support Level for this Kamelet is: "Preview"*
+
+Send documents to Pulsar.
+
+== Configuration Options
+
+The following table summarizes the configuration options available for the `pulsar-sink` Kamelet:
+[width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
+|===
+| Property| Name| Description| Type| Default| Example
+| *namespaceName {empty}* *| Pulsar Namespace Name| The Pulsar Namespace Name| string| | 
+| *serviceUrl {empty}* *| Service URL| The Pulsar Service URL to point while creating the client from URI.| string| | 
+| *tenant {empty}* *| Tenant Name| The Tenant Name| string| | 
+| *topic {empty}* *| Topic Name| The topic name or regexp| string| | 
+| *topicType {empty}* *| Topic Type| The topic type. Possible values are: persistent or non-persistent| string| | 
+| authenticationClass| Authentication Class| The Authentication FQCN to be used while creating the client from URI.| string| | 
+| authenticationParams| Authentication Params| The Authentication Parameters to be used while creating the client from URI.| string| | 
+| batchingEnabled| Enable Batching| Control whether automatic batching of messages is enabled for the producer.| boolean| `true`| 
+| batchingMaxMessages| Batching Maximum Messages| The maximum size to batch messages.| int| `1000`| 
+| batchingMaxPublishDelayMicros| Batching Maximum Publish Delay in Microsecond| The maximum time period within which the messages sent will be batched if batchingEnabled is true.| long| `1000`| 
+| blockIfQueueFull| Block If Queue Full| Whether to block the producing thread if pending messages queue is full or to throw a ProducerQueueIsFullError.| boolean| `false`| 
+| compressionType| Compression Type| Compression type to use. Possible values are: NONE, LZ4, ZLIB, ZSTD, SNAPPY| string| `"NONE"`| 
+| initialSequenceId| Initial SequenceId| The first message published will have a sequence Id of initialSequenceId 1.| long| `-1`| 
+| lazyStartProducer| Number Of Consumer Threads| Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed the [...]
+| maxPendingMessages| Maximum Pending Messages| Size of the pending massages queue. When the queue is full, by default, any further sends will fail unless blockIfQueueFull=true.| int| `1000`| 
+| maxPendingMessagesAcrossPartitions| Maximum Pending Messages Across Partitions| The maximum number of pending messages for partitioned topics. The maxPendingMessages value will be reduced if (number of partitions maxPendingMessages) exceeds this value. Partitioned topics have a pending message queue for each partition.| int| `50000`| 
+| messageRoutingMode| Message Routing Mode| Message Routing Mode to use. Possible values are SinglePartition, RoundRobinPartition, CustomPartition| string| `"RoundRobinPartition"`| 
+| producerName| Producer Name| Name of the producer. If unset, lets Pulsar select a unique identifier.| string| | 
+| sendTimeoutMs| Send Timeout in Milliseconds| Send timeout in milliseconds.| int| `30000`| 
+|===
+
+NOTE: Fields marked with an asterisk ({empty}*) are mandatory.
+
+
+== Dependencies
+
+At runtime, the `pulsar-sink` Kamelet relies upon the presence of the following dependencies:
+
+- camel:pulsar
+- camel:kamelet
+- camel:core 
+
+== Usage
+
+This section describes how you can use the `pulsar-sink`.
+
+=== Knative Sink
+
+You can use the `pulsar-sink` Kamelet as a Knative sink by binding it to a Knative object.
+
+.pulsar-sink-binding.yaml
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: pulsar-sink-binding
+spec:
+  source:
+    ref:
+      kind: Channel
+      apiVersion: messaging.knative.dev/v1
+      name: mychannel
+  sink:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: pulsar-sink
+    properties:
+      namespaceName: "The Pulsar Namespace Name"
+      serviceUrl: "The Service URL"
+      tenant: "The Tenant Name"
+      topic: "The Topic Name"
+      topicType: "The Topic Type"
+  
+----
+
+==== *Prerequisite*
+
+You have xref:{camel-k-version}@camel-k::installation/installation.adoc[Camel K installed] on the cluster.
+
+==== *Procedure for using the cluster CLI*
+
+. Save the `pulsar-sink-binding.yaml` file to your local drive, and then edit it as needed for your configuration.
+
+. Run the sink by using the following command:
++
+[source,shell]
+----
+kubectl apply -f pulsar-sink-binding.yaml
+----
+
+==== *Procedure for using the Kamel CLI*
+
+Configure and run the sink by using the following command:
+
+[source,shell]
+----
+kamel bind channel:mychannel pulsar-sink -p "sink.namespaceName=The Pulsar Namespace Name" -p "sink.serviceUrl=The Service URL" -p "sink.tenant=The Tenant Name" -p "sink.topic=The Topic Name" -p "sink.topicType=The Topic Type"
+----
+
+This command creates the KameletBinding in the current namespace on the cluster.
+
+=== Kafka Sink
+
+You can use the `pulsar-sink` Kamelet as a Kafka sink by binding it to a Kafka topic.
+
+.pulsar-sink-binding.yaml
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: pulsar-sink-binding
+spec:
+  source:
+    ref:
+      kind: KafkaTopic
+      apiVersion: kafka.strimzi.io/v1beta1
+      name: my-topic
+  sink:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: pulsar-sink
+    properties:
+      namespaceName: "The Pulsar Namespace Name"
+      serviceUrl: "The Service URL"
+      tenant: "The Tenant Name"
+      topic: "The Topic Name"
+      topicType: "The Topic Type"
+  
+----
+
+==== *Prerequisites*
+
+* You've installed https://strimzi.io/[Strimzi].
+* You've created a topic named `my-topic` in the current namespace.
+* You have xref:{camel-k-version}@camel-k::installation/installation.adoc[Camel K installed] on the cluster.
+
+==== *Procedure for using the cluster CLI*
+
+. Save the `pulsar-sink-binding.yaml` file to your local drive, and then edit it as needed for your configuration.
+
+. Run the sink by using the following command:
++
+[source,shell]
+----
+kubectl apply -f pulsar-sink-binding.yaml
+----
+
+==== *Procedure for using the Kamel CLI*
+
+Configure and run the sink by using the following command:
+
+[source,shell]
+----
+kamel bind kafka.strimzi.io/v1beta1:KafkaTopic:my-topic pulsar-sink -p "sink.namespaceName=The Pulsar Namespace Name" -p "sink.serviceUrl=The Service URL" -p "sink.tenant=The Tenant Name" -p "sink.topic=The Topic Name" -p "sink.topicType=The Topic Type"
+----
+
+This command creates the KameletBinding in the current namespace on the cluster.
+
+== Kamelet source file
+
+https://github.com/apache/camel-kamelets/blob/main/kamelets/pulsar-sink.kamelet.yaml
+
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
diff --git a/kamelets/pulsar-sink.kamelet.yaml b/kamelets/pulsar-sink.kamelet.yaml
new file mode 100755
index 0000000..77016c7
--- /dev/null
+++ b/kamelets/pulsar-sink.kamelet.yaml
@@ -0,0 +1,171 @@
+# ---------------------------------------------------------------------------
+# 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: pulsar-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,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgdmlld0JveD0iMCAwIDYwLjk3Mzk5OSA0My4wOSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMjQiCiAgIHNvZGlwb2RpOmRvY25hbWU9InB1bHNhci1sb2dvLnN2ZyIKICAgd2lkdGg9IjYwLjk3Mzk5OSIKICAgaGVpZ2h0PSI0My4wOSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4xLjEgKDNiZjVhZTBkMjUsIDIwMjEtMDktMjApIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+    camel.apache.org/kamelet.group: "Pulsar"
+  labels:
+    camel.apache.org/kamelet.type: "sink"
+spec:
+  dependencies:
+    - "camel:pulsar"
+    - "camel:kamelet"
+    - "camel:core"
+  definition:
+    title: "Pulsar Sink"
+    description: "Send documents to Pulsar."
+    required:
+      - topicType
+      - topic
+      - namespaceName
+      - tenant
+      - serviceUrl
+    properties:
+      topic:
+        title: Topic Name
+        description: The topic name or regexp
+        type: string
+      tenant:
+        title: Tenant Name
+        description: The Tenant Name
+        type: string
+      topicType:
+        title: Topic Type
+        description: "The topic type. Possible values are: persistent or non-persistent"
+        type: string  
+      namespaceName:
+        title: Pulsar Namespace Name
+        description: The Pulsar Namespace Name
+        type: string
+      serviceUrl:
+        title: Service URL
+        description: The Pulsar Service URL to point while creating the client from URI.
+        type: string        
+      authenticationClass:
+        title: Authentication Class
+        description: The Authentication FQCN to be used while creating the client from URI.
+        type: string
+      authenticationParams:
+        title: Authentication Params
+        description: The Authentication Parameters to be used while creating the client from URI.
+        type: string
+        x-descriptors:
+          - 'urn:alm:descriptor:com.tectonic.ui:text'
+      batchingEnabled:
+        title: Enable Batching
+        description: Control whether automatic batching of messages is enabled for the producer.
+        type: boolean
+        default: true
+        x-descriptors:
+          - 'urn:alm:descriptor:com.tectonic.ui:checkbox'
+      batchingMaxMessages:
+        title: Batching Maximum Messages
+        description: "The maximum size to batch messages."
+        type: int
+        default: 1000
+      batchingMaxPublishDelayMicros:
+        title: Batching Maximum Publish Delay in Microsecond
+        description: "The maximum time period within which the messages sent will be batched if batchingEnabled is true."
+        type: long
+        default: 1000
+      blockIfQueueFull:
+        title: Block If Queue Full
+        description: "Whether to block the producing thread if pending messages queue is full or to throw a ProducerQueueIsFullError."
+        type: boolean
+        default: false
+        x-descriptors:
+          - 'urn:alm:descriptor:com.tectonic.ui:checkbox'
+      compressionType:
+        title: Compression Type
+        description: "Compression type to use. Possible values are: NONE, LZ4, ZLIB, ZSTD, SNAPPY"
+        type: string
+        default: "NONE"
+        x-descriptors:
+          - 'urn:alm:descriptor:com.tectonic.ui:select:NONE'
+          - 'urn:alm:descriptor:com.tectonic.ui:select:LZ4'
+          - 'urn:alm:descriptor:com.tectonic.ui:select:ZLIB'
+          - 'urn:alm:descriptor:com.tectonic.ui:select:ZSTD'
+          - 'urn:alm:descriptor:com.tectonic.ui:select:SNAPPY'
+      initialSequenceId:
+        title: Initial SequenceId
+        description: "The first message published will have a sequence Id of initialSequenceId 1."
+        type: long
+        default: -1
+      lazyStartProducer:
+        title: Number Of Consumer Threads
+        description: "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed then creating and starting the [...]
+        type: boolean
+        default: false
+        x-descriptors:
+          - 'urn:alm:descriptor:com.tectonic.ui:checkbox'
+      maxPendingMessages:
+        title: Maximum Pending Messages
+        description: "Size of the pending massages queue. When the queue is full, by default, any further sends will fail unless blockIfQueueFull=true."
+        type: int
+        default: 1000
+      maxPendingMessagesAcrossPartitions:
+        title: Maximum Pending Messages Across Partitions
+        description: "The maximum number of pending messages for partitioned topics. The maxPendingMessages value will be reduced if (number of partitions maxPendingMessages) exceeds this value. Partitioned topics have a pending message queue for each partition."
+        type: int
+        default: 50000
+      messageRoutingMode:
+        title: Message Routing Mode
+        description: "Message Routing Mode to use. Possible values are SinglePartition, RoundRobinPartition, CustomPartition"
+        type: string
+        default: "RoundRobinPartition"
+        x-descriptors:
+          - 'urn:alm:descriptor:com.tectonic.ui:select:SinglePartition'
+          - 'urn:alm:descriptor:com.tectonic.ui:select:RoundRobinPartition'
+          - 'urn:alm:descriptor:com.tectonic.ui:select:CustomPartition'
+      producerName:
+        title: Producer Name
+        description: "Name of the producer. If unset, lets Pulsar select a unique identifier."
+        type: string
+      sendTimeoutMs:
+        title: Send Timeout in Milliseconds
+        description: "Send timeout in milliseconds."
+        type: int
+        default: 30000
+    type: object
+  flow:
+    from:
+      uri: kamelet:source
+      steps:
+        - to:
+            uri: pulsar:{{topicType}}/{{tenant}}/{{namespaceName}}/{{topic}}
+            parameters:
+              serviceUrl: "{{serviceUrl}}"
+              authenticationClass: "{{?authenticationClass}}"
+              authenticationParams: "{{?authenticationParams}}"
+              batchingEnabled: "{{?batchingEnabled}}"
+              batchingMaxMessages: "{{?batchingMaxMessages}}"
+              batchingMaxPublishDelayMicros: "{{?batchingMaxPublishDelayMicros}}"
+              blockIfQueueFull: "{{?blockIfQueueFull}}"
+              compressionType: "{{?compressionType}}"
+              initialSequenceId: "{{?initialSequenceId}}"
+              lazyStartProducer: "{{?lazyStartProducer}}"
+              maxPendingMessages: "{{?maxPendingMessages}}"
+              maxPendingMessagesAcrossPartitions: "{{?maxPendingMessagesAcrossPartitions}}"
+              messageRoutingMode: "{{?messageRoutingMode}}"
+              producerName: "{{?producerName}}"
+              sendTimeoutMs: "{{?sendTimeoutMs}}"
diff --git a/templates/bindings/camel-k/pulsar-sink-binding.yaml b/templates/bindings/camel-k/pulsar-sink-binding.yaml
new file mode 100644
index 0000000..ba540fb
--- /dev/null
+++ b/templates/bindings/camel-k/pulsar-sink-binding.yaml
@@ -0,0 +1,22 @@
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: pulsar-sink-binding
+spec:
+  source:
+    ref:
+      kind: KafkaTopic
+      apiVersion: kafka.strimzi.io/v1beta1
+      name: my-topic
+  sink:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: pulsar-sink
+    properties:
+      namespaceName: "The Pulsar Namespace Name"
+      serviceUrl: "The Service URL"
+      tenant: "The Tenant Name"
+      topic: "The Topic Name"
+      topicType: "The Topic Type"
+  
\ No newline at end of file
diff --git a/templates/bindings/core/pulsar-sink-binding.yaml b/templates/bindings/core/pulsar-sink-binding.yaml
new file mode 100644
index 0000000..b9ca6fa
--- /dev/null
+++ b/templates/bindings/core/pulsar-sink-binding.yaml
@@ -0,0 +1,16 @@
+- route:
+    from:
+      uri: "kamelet:timer-source"
+      parameters:
+        period: 1000
+        message: "Hello Camel JBang"
+    steps:
+      - to:
+          uri: "kamelet:pulsar-sink"
+          parameters:
+            namespaceName: "The Pulsar Namespace Name"
+            serviceUrl: "The Service URL"
+            tenant: "The Tenant Name"
+            topic: "The Topic Name"
+            topicType: "The Topic Type"
+    
\ No newline at end of file