You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2021/03/12 13:38:00 UTC

[camel-kamelets] branch master updated (3784162 -> c30d45d)

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

nferraro pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git.


    from 3784162  Rename google-*-stream kamelets to google-* since for source we'll use stream by default - google-sheets
     new eaaa703  Add kamelets from developer guide
     new c30d45d  Add test for earthquake source

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/test.yaml                        |  2 +-
 .../assets/images/kamelets/earthquake-source.svg   |  1 +
 .../{telegram-source.svg => telegram-sink.svg}     |  0
 .../images/kamelets/twitter-search-source.svg      |  6 ++
 docs/modules/ROOT/nav.adoc                         |  3 +
 .../{kafka-source.adoc => earthquake-source.adoc}  | 27 +++---
 .../{telegram-source.adoc => telegram-sink.adoc}   | 46 ++++++----
 docs/modules/ROOT/pages/twitter-search-source.adoc | 71 ++++++++++++++++
 earthquake-source.kamelet.yaml                     | 82 ++++++++++++++++++
 telegram-sink.kamelet.yaml                         | 99 ++++++++++++++++++++++
 telegram-source.kamelet.yaml                       |  1 +
 test/earthquake-source/earthquake-source.feature   | 21 +++++
 .../yaks-config.yaml                               |  2 +-
 twitter-search.kamelet.yaml                        | 75 ++++++++++++++++
 14 files changed, 402 insertions(+), 34 deletions(-)
 create mode 100644 docs/modules/ROOT/assets/images/kamelets/earthquake-source.svg
 copy docs/modules/ROOT/assets/images/kamelets/{telegram-source.svg => telegram-sink.svg} (100%)
 create mode 100644 docs/modules/ROOT/assets/images/kamelets/twitter-search-source.svg
 copy docs/modules/ROOT/pages/{kafka-source.adoc => earthquake-source.adoc} (52%)
 copy docs/modules/ROOT/pages/{telegram-source.adoc => telegram-sink.adoc} (51%)
 create mode 100644 docs/modules/ROOT/pages/twitter-search-source.adoc
 create mode 100755 earthquake-source.kamelet.yaml
 create mode 100755 telegram-sink.kamelet.yaml
 create mode 100644 test/earthquake-source/earthquake-source.feature
 copy test/{timer-source => earthquake-source}/yaks-config.yaml (93%)
 create mode 100755 twitter-search.kamelet.yaml


[camel-kamelets] 02/02: Add test for earthquake source

Posted by nf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c30d45dbfe18cf2476be213da556fc1a168c8e9e
Author: nicolaferraro <ni...@gmail.com>
AuthorDate: Fri Mar 12 11:50:34 2021 +0100

    Add test for earthquake source
---
 .github/workflows/test.yaml                      |  2 +-
 earthquake-source.kamelet.yaml                   |  1 +
 test/earthquake-source/earthquake-source.feature | 21 ++++++++++++++++++
 test/earthquake-source/yaks-config.yaml          | 27 ++++++++++++++++++++++++
 4 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index ec469ee..fcf210d 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -37,7 +37,7 @@ on:
 
 env:
   CAMEL_K_VERSION: 1.3.1
-  YAKS_VERSION: 0.2.0
+  YAKS_VERSION: 0.3.0
 
 jobs:
   test:
diff --git a/earthquake-source.kamelet.yaml b/earthquake-source.kamelet.yaml
index cd82ca9..a82554b 100755
--- a/earthquake-source.kamelet.yaml
+++ b/earthquake-source.kamelet.yaml
@@ -7,6 +7,7 @@ metadata:
     camel.apache.org/provider: "Apache Software Foundation"
   labels:
     camel.apache.org/kamelet.type: "source"
+    camel.apache.org/kamelet.verified: "true"
 spec:
   definition:
     title: Earthquake Source
diff --git a/test/earthquake-source/earthquake-source.feature b/test/earthquake-source/earthquake-source.feature
new file mode 100644
index 0000000..e18a2cf
--- /dev/null
+++ b/test/earthquake-source/earthquake-source.feature
@@ -0,0 +1,21 @@
+Feature: Kamelet earthquake-source works
+
+  Background:
+    Given Disable auto removal of Kamelet resources
+    Given Disable auto removal of Kubernetes resources
+    Given Camel-K resource polling configuration
+      | maxAttempts          | 60   |
+      | delayBetweenAttempts | 3000 |
+
+  Scenario: Bind Kamelet to service
+    Given create Kubernetes service test-service with target port 8080
+    And bind Kamelet earthquake-source to uri http://test-service.${YAKS_NAMESPACE}.svc.cluster.local/test
+    When create KameletBinding earthquake-source-uri
+    Then KameletBinding earthquake-source-uri should be available
+
+  Scenario: Verify binding
+    Given HTTP server "test-service"
+    And HTTP server timeout is 120000 ms
+    Then expect HTTP request header: Content-Type="application/json;charset=UTF-8"
+    And receive POST /test
+    And delete KameletBinding earthquake-source-uri
diff --git a/test/earthquake-source/yaks-config.yaml b/test/earthquake-source/yaks-config.yaml
new file mode 100644
index 0000000..efeddeb
--- /dev/null
+++ b/test/earthquake-source/yaks-config.yaml
@@ -0,0 +1,27 @@
+# ---------------------------------------------------------------------------
+# 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.
+# ---------------------------------------------------------------------------
+
+config:
+  namespace:
+    temporary: true
+pre:
+- name: installation
+  run: |
+    # Install required Kamelets (these steps may be done globally in future versions)
+
+    kamel install -n $YAKS_NAMESPACE
+    kubectl apply -f ../../earthquake-source.kamelet.yaml -n $YAKS_NAMESPACE


[camel-kamelets] 01/02: Add kamelets from developer guide

Posted by nf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit eaaa703bada30d4cb7b21795024fb6c18bfea833
Author: nicolaferraro <ni...@gmail.com>
AuthorDate: Fri Mar 12 11:48:03 2021 +0100

    Add kamelets from developer guide
---
 .../assets/images/kamelets/earthquake-source.svg   |  1 +
 .../ROOT/assets/images/kamelets/telegram-sink.svg  |  1 +
 .../images/kamelets/twitter-search-source.svg      |  6 ++
 docs/modules/ROOT/nav.adoc                         |  3 +
 docs/modules/ROOT/pages/earthquake-source.adoc     | 59 +++++++++++++
 docs/modules/ROOT/pages/telegram-sink.adoc         | 74 ++++++++++++++++
 docs/modules/ROOT/pages/twitter-search-source.adoc | 71 ++++++++++++++++
 earthquake-source.kamelet.yaml                     | 81 ++++++++++++++++++
 telegram-sink.kamelet.yaml                         | 99 ++++++++++++++++++++++
 telegram-source.kamelet.yaml                       |  1 +
 twitter-search.kamelet.yaml                        | 75 ++++++++++++++++
 11 files changed, 471 insertions(+)

diff --git a/docs/modules/ROOT/assets/images/kamelets/earthquake-source.svg b/docs/modules/ROOT/assets/images/kamelets/earthquake-source.svg
new file mode 100644
index 0000000..db8c041
--- /dev/null
+++ b/docs/modules/ROOT/assets/images/kamelets/earthquake-source.svg
@@ -0,0 +1 @@
+<svg height='100px' width='100px'  fill="#000000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100.003 79.997" enable-background="new 0 0 100.003 79.997" xml:space="preserve"><path d="M81.653,42.94c-1.387,0-2.666,0.767-3.315,1.992L72.942,55.1l-6.649-19.479c-0.508-1.472-1.865-2.48-3.423-2.534  c-1.602-0.046-2.983,0.859-3.589,2.292l-4.561,10.834l-7.2-43.128c-0.33-1.812-2.029-3.188-3.77-3.079  c-1.843,0.042-3.384,1. [...]
\ No newline at end of file
diff --git a/docs/modules/ROOT/assets/images/kamelets/telegram-sink.svg b/docs/modules/ROOT/assets/images/kamelets/telegram-sink.svg
new file mode 100644
index 0000000..080818f
--- /dev/null
+++ b/docs/modules/ROOT/assets/images/kamelets/telegram-sink.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240"><defs><linearGradient id="a" x1=".667" x2=".417" y1=".167" y2=".75"><stop offset="0" stop-color="#37aee2"/><stop offset="1" stop-color="#1e96c8"/></linearGradient><linearGradient id="b" x1=".66" x2=".851" y1=".437" y2=".802"><stop offset="0" stop-color="#eff7fc"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><circle cx="120" cy="120" r="120" fill="url(#a)"/><path fill="#c8daea" d="M98 175c-3.888 0-3.227-1.468-4.5 [...]
\ No newline at end of file
diff --git a/docs/modules/ROOT/assets/images/kamelets/twitter-search-source.svg b/docs/modules/ROOT/assets/images/kamelets/twitter-search-source.svg
new file mode 100644
index 0000000..c0364cc
--- /dev/null
+++ b/docs/modules/ROOT/assets/images/kamelets/twitter-search-source.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="256px" height="209px" viewBox="0 0 256 209" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
+    <g>
+        <path d="M256,25.4500259 C246.580841,29.6272672 236.458451,32.4504868 225.834156,33.7202333 C236.678503,27.2198053 245.00583,16.9269929 248.927437,4.66307685 C238.779765,10.6812633 227.539325,15.0523376 215.57599,17.408298 C205.994835,7.2006971 192.34506,0.822 177.239197,0.822 C148.232605,0.822 124.716076,24.3375931 124.716076,53.3423116 C124.716076,57.4586875 125.181462,61.4673784 126.076652,65.3112644 C82.4258385,63.1210453 43.7257252,42.211429 17.821398,10.4359288 C13.3005011, [...]
+    </g>
+</svg>
\ No newline at end of file
diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index ac6d265..3aee334 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -3,6 +3,7 @@
 * xref:ROOT:aws-s3-source.adoc[image:kamelets/aws-s3-source.svg[] AWS S3 Source]
 * xref:ROOT:aws-sqs-source.adoc[image:kamelets/aws-sqs-source.svg[] AWS SQS Source]
 * xref:ROOT:bitcoin-source.adoc[image:kamelets/bitcoin-source.svg[] Bitcoin Source]
+* xref:ROOT:earthquake-source.adoc[image:kamelets/earthquake-source.svg[] Earthquake Source]
 * xref:ROOT:ftp-source.adoc[image:kamelets/ftp-source.svg[] FTP Source]
 * xref:ROOT:ftps-source.adoc[image:kamelets/ftps-source.svg[] FTPS Source]
 * xref:ROOT:google-calendar-source.adoc[image:kamelets/google-calendar-source.svg[] Google Calendar Source]
@@ -19,7 +20,9 @@
 * xref:ROOT:salesforce-source.adoc[image:kamelets/salesforce-source.svg[] Salesforce Source]
 * xref:ROOT:sftp-source.adoc[image:kamelets/sftp-source.svg[] SFTP Source]
 * xref:ROOT:slack-source.adoc[image:kamelets/slack-source.svg[] Slack Source]
+* xref:ROOT:telegram-sink.adoc[image:kamelets/telegram-sink.svg[] Telegram Sink]
 * xref:ROOT:telegram-source.adoc[image:kamelets/telegram-source.svg[] Telegram Source]
 * xref:ROOT:timer-source.adoc[image:kamelets/timer-source.svg[] Timer Source]
+* xref:ROOT:twitter-search-source.adoc[image:kamelets/twitter-search-source.svg[] Twitter Search Source]
 * xref:ROOT:webhook-source.adoc[image:kamelets/webhook-source.svg[] Webhook Source]
 // THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
diff --git a/docs/modules/ROOT/pages/earthquake-source.adoc b/docs/modules/ROOT/pages/earthquake-source.adoc
new file mode 100644
index 0000000..b664673
--- /dev/null
+++ b/docs/modules/ROOT/pages/earthquake-source.adoc
@@ -0,0 +1,59 @@
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
+= image:kamelets/earthquake-source.svg[] Earthquake Source
+
+*Provided by: "Apache Software Foundation"*
+
+Get data about current earthquake events happening in the world using the USGS API
+
+== Configuration Options
+
+The following table summarizes the configuration options available for the `earthquake-source` Kamelet:
+[width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
+|===
+| Property| Name| Description| Type| Default| Example
+| lookAhead| Look-ahead minutes| The amount of minutes to look ahead when starting the integration afresh| integer| `120`| 
+| period| Period between polls| The interval between fetches to the earthquake API in milliseconds| integer| `60000`| 
+|===
+
+NOTE: Fields marked with ({empty}*) are mandatory.
+
+== Usage
+
+This section summarizes how the `earthquake-source` can be used in various contexts.
+
+=== Knative Source
+
+The `earthquake-source` Kamelet can be used as Knative source by binding it to a Knative object.
+
+.earthquake-source-binding.yaml
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: earthquake-source-binding
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: earthquake-source
+  sink:
+    ref:
+      kind: InMemoryChannel
+      apiVersion: messaging.knative.dev/v1
+      name: mychannel
+
+----
+
+Make sure you have xref:latest@camel-k::installation/installation.adoc[Camel K installed] into the Kubernetes cluster you're connected to.
+
+Save the `earthquake-source-binding.yaml` file into your hard drive, then configure it according to your needs.
+
+You can run the source using the following command:
+
+[source,shell]
+----
+kubectl apply -f earthquake-source-binding.yaml
+----
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
diff --git a/docs/modules/ROOT/pages/telegram-sink.adoc b/docs/modules/ROOT/pages/telegram-sink.adoc
new file mode 100644
index 0000000..f1e552d
--- /dev/null
+++ b/docs/modules/ROOT/pages/telegram-sink.adoc
@@ -0,0 +1,74 @@
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
+= image:kamelets/telegram-sink.svg[] Telegram Sink
+
+*Provided by: "Apache Software Foundation"*
+
+Send a message to a Telegram chat using your Telegram bot as sender.
+
+To create a bot, contact the @botfather account using the Telegram app.
+
+This sink supports the following message types:
+
+- Standard text messages
+- PNG images (`Content-Type` must be set to `image/png`)
+- JPEG images (`Content-Type` must be set to `image/jpeg`)
+
+This following message headers are also supported:
+
+- `text` / `ce-text`: when sending an image, the image caption
+- `chat-id` / `ce-chat-id`: to override the default chat where messages are sent to
+
+== Configuration Options
+
+The following table summarizes the configuration options available for the `telegram-sink` Kamelet:
+[width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
+|===
+| Property| Name| Description| Type| Default| Example
+| *authorizationToken {empty}* *| Token| The token to access your bot on Telegram. You you can obtain it from the Telegram @botfather.| string| | 
+| chatId| Chat ID| The Chat ID where messages should be sent by default| string| | 
+|===
+
+NOTE: Fields marked with ({empty}*) are mandatory.
+
+== Usage
+
+This section summarizes how the `telegram-sink` can be used in various contexts.
+
+=== Knative Sink
+
+The `telegram-sink` Kamelet can be used as Knative sink by binding it to a Knative object.
+
+.telegram-sink-binding.yaml
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: telegram-sink-binding
+spec:
+  source:
+    ref:
+      kind: InMemoryChannel
+      apiVersion: messaging.knative.dev/v1
+      name: mychannel
+  sink:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: telegram-sink
+    properties:
+      authorizationToken: "The Token"
+
+----
+
+Make sure you have xref:latest@camel-k::installation/installation.adoc[Camel K installed] into the Kubernetes cluster you're connected to.
+
+Save the `telegram-sink-binding.yaml` file into your hard drive, then configure it according to your needs.
+
+You can run the sink using the following command:
+
+[source,shell]
+----
+kubectl apply -f telegram-sink-binding.yaml
+----
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
diff --git a/docs/modules/ROOT/pages/twitter-search-source.adoc b/docs/modules/ROOT/pages/twitter-search-source.adoc
new file mode 100644
index 0000000..d5a3919
--- /dev/null
+++ b/docs/modules/ROOT/pages/twitter-search-source.adoc
@@ -0,0 +1,71 @@
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
+= image:kamelets/twitter-search-source.svg[] Twitter Search Source
+
+*Provided by: "Apache Software Foundation"*
+
+Allows to get all tweets on particular keywords from Twitter.
+
+It requires tokens that can be obtained by creating an application 
+in the Twitter developer portal: https://developer.twitter.com/.
+
+== Configuration Options
+
+The following table summarizes the configuration options available for the `twitter-search-source` Kamelet:
+[width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
+|===
+| Property| Name| Description| Type| Default| Example
+| *accessToken {empty}* *| Access Token| The Access Token from the Twitter application in the developer portal| string| | 
+| *accessTokenSecret {empty}* *| Access Token Secret| The Access Token Secret from the Twitter application in the developer portal| string| | 
+| *apiKey {empty}* *| API Key| The API Key from the Twitter application in the developer portal| string| | 
+| *apiKeySecret {empty}* *| API Key Secret| The API Key Secret from the Twitter application in the developer portal| string| | 
+| *keywords {empty}* *| Keywords| The keywords to use in the Twitter search (Supports Twitter standard operators)| string| | `"Apache Camel"`
+|===
+
+NOTE: Fields marked with ({empty}*) are mandatory.
+
+== Usage
+
+This section summarizes how the `twitter-search-source` can be used in various contexts.
+
+=== Knative Source
+
+The `twitter-search-source` Kamelet can be used as Knative source by binding it to a Knative object.
+
+.twitter-search-source-binding.yaml
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: twitter-search-source-binding
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: twitter-search-source
+    properties:
+      accessToken: "The Access Token"
+      accessTokenSecret: "The Access Token Secret"
+      apiKey: "The API Key"
+      apiKeySecret: "The API Key Secret"
+      keywords: "Apache Camel"
+  sink:
+    ref:
+      kind: InMemoryChannel
+      apiVersion: messaging.knative.dev/v1
+      name: mychannel
+
+----
+
+Make sure you have xref:latest@camel-k::installation/installation.adoc[Camel K installed] into the Kubernetes cluster you're connected to.
+
+Save the `twitter-search-source-binding.yaml` file into your hard drive, then configure it according to your needs.
+
+You can run the source using the following command:
+
+[source,shell]
+----
+kubectl apply -f twitter-search-source-binding.yaml
+----
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
diff --git a/earthquake-source.kamelet.yaml b/earthquake-source.kamelet.yaml
new file mode 100755
index 0000000..cd82ca9
--- /dev/null
+++ b/earthquake-source.kamelet.yaml
@@ -0,0 +1,81 @@
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: earthquake-source
+  annotations:
+    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9JzEwMHB4JyB3aWR0aD0nMTAwcHgnICBmaWxsPSIjMDAwMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAwLjAwMyA3OS45OTciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMC4wMDMgNzkuOTk3IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNODEuNjUzLDQyLjk0Yy0xLjM4NywwLTIuNjY2LDAuNzY3LTMuMzE1LDEuOTkyTDcyLjk0Miw1NS4xbC02Lj [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+  labels:
+    camel.apache.org/kamelet.type: "source"
+spec:
+  definition:
+    title: Earthquake Source
+    description: |-
+      Get data about current earthquake events happening in the world using the USGS API
+    properties:
+      period:
+        title: Period between polls
+        description: The interval between fetches to the earthquake API in milliseconds
+        type: integer
+        default: 60000
+      lookAhead:
+        title: Look-ahead minutes
+        description: The amount of minutes to look ahead when starting the integration afresh
+        type: integer
+        default: 120
+  types:
+    out:
+      mediaType: application/json
+  dependencies:
+    - camel-quarkus:caffeine
+    - camel-quarkus:http
+  flow:
+    from:
+      uri: "timer:earthquake"
+      parameters:
+        period: "{{period}}"
+      steps:
+      - set-header:
+          name: CamelCaffeineAction
+          constant: GET
+      - tod: "caffeine-cache:cache-${routeId}?key=lastUpdate"
+      - choice:
+          when:
+          - simple: "${header.CamelCaffeineActionHasResult}"
+            steps:
+            - set-property:
+                name: lastUpdate
+                simple: "${body}"
+          otherwise:
+            steps:
+            - set-property:
+                name: lastUpdate
+                simple: "${date-with-timezone:now-{{lookAhead}}m:UTC:yyyy-MM-dd'T'HH:mm:ss.SSS}"
+      - set-header:
+          name: CamelHttpMethod
+          constant: GET
+      - tod: "https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&updatedafter=${exchangeProperty.lastUpdate}&orderby=time-asc"
+      - unmarshal:
+          json: {}
+      - set-property:
+          name: generated
+          simple: "${body[metadata][generated]}"
+      - set-property:
+          name: lastUpdate
+          simple: "${date-with-timezone:exchangeProperty.generated:UTC:yyyy-MM-dd'T'HH:mm:ss.SSS}"
+      - claim-check:
+          operation: Push
+      - set-body:
+          exchange-property: lastUpdate
+      - set-header:
+          name: CamelCaffeineAction
+          constant: PUT
+      - tod: "caffeine-cache:cache-${routeId}?key=lastUpdate"
+      - claim-check:
+          operation: Pop
+      - split:
+          jsonpath: "$.features[*]"
+          steps:
+            - marshal:
+                json: {}
+            - to: "kamelet:sink"
diff --git a/telegram-sink.kamelet.yaml b/telegram-sink.kamelet.yaml
new file mode 100755
index 0000000..71b87c1
--- /dev/null
+++ b/telegram-sink.kamelet.yaml
@@ -0,0 +1,99 @@
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: telegram-sink
+  annotations:
+    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMjQwIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSIuNjY3IiB4Mj0iLjQxNyIgeTE9Ii4xNjciIHkyPSIuNzUiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzM3YWVlMiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzFlOTZjOCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iLjY2IiB4Mj0iLjg1MSIgeTE9Ii40MzciIHkyPSIuODAyIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZmY3Zm [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+  labels:
+    camel.apache.org/kamelet.type: "sink"
+    camel.apache.org/kamelet.group: "Telegram"
+spec:
+  definition:
+    title: "Telegram Sink"
+    description: |-
+      Send a message to a Telegram chat using your Telegram bot as sender.
+
+      To create a bot, contact the @botfather account using the Telegram app.
+
+      This sink supports the following message types:
+
+      - Standard text messages
+      - PNG images (`Content-Type` must be set to `image/png`)
+      - JPEG images (`Content-Type` must be set to `image/jpeg`)
+
+      This following message headers are also supported:
+
+      - `text` / `ce-text`: when sending an image, the image caption
+      - `chat-id` / `ce-chat-id`: to override the default chat where messages are sent to
+    required:
+      - authorizationToken
+    properties:
+      authorizationToken:
+        title: Token
+        description: The token to access your bot on Telegram. You you can obtain it from the Telegram @botfather.
+        type: string
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+      chatId:
+        title: Chat ID
+        description: The Chat ID where messages should be sent by default
+        type: string
+  types:
+    out:
+      mediaType: application/json
+  flow:
+    from:
+      uri: "kamelet:source"
+      steps:
+      - choice:
+          when:
+          - simple: "${header[Content-Type]} == 'image/png'"
+            steps:
+            - convert-body-to:
+                type: "byte[]"
+            - set-header:
+                name: CamelTelegramMediaType
+                constant: PHOTO_PNG
+          - simple: "${header[Content-Type]} == 'image/jpeg'"
+            steps:
+            - convert-body-to:
+                type: "byte[]"
+            - set-header:
+                name: CamelTelegramMediaType
+                constant: PHOTO_JPG
+          otherwise:
+            steps:
+            - convert-body-to:
+                type: "java.lang.String"
+      - choice:
+          when:
+          - simple: "${header[text]}"
+            steps:
+            - set-header:
+                name: CamelTelegramMediaTitleCaption
+                simple: "${header[text]}"
+          - simple: "${header[ce-text]}"
+            steps:
+            - set-header:
+                name: CamelTelegramMediaTitleCaption
+                simple: "${header[ce-text]}"
+      - choice:
+          when:
+          - simple: "${header[chat-id]}"
+            steps:
+            - set-header:
+                name: CamelTelegramChatId
+                simple: "${header[chat-id]}"
+          - simple: "${header[ce-chat-id]}"
+            steps:
+            - set-header:
+                name: CamelTelegramChatId
+                simple: "${header[ce-chat-id]}"
+      - to:
+          uri: "telegram:bots"
+          parameters:
+            authorizationToken: "{{authorizationToken}}"
+            chatId: "{{chatId}}"
+      - marshal:
+          json: {}
diff --git a/telegram-source.kamelet.yaml b/telegram-source.kamelet.yaml
index 3193e8a..c60015f 100644
--- a/telegram-source.kamelet.yaml
+++ b/telegram-source.kamelet.yaml
@@ -7,6 +7,7 @@ metadata:
     camel.apache.org/provider: "Apache Software Foundation"
   labels:
     camel.apache.org/kamelet.type: "source"
+    camel.apache.org/kamelet.group: "Telegram"
 spec:
   definition:
     title: "Telegram Source"
diff --git a/twitter-search.kamelet.yaml b/twitter-search.kamelet.yaml
new file mode 100755
index 0000000..a43b74a
--- /dev/null
+++ b/twitter-search.kamelet.yaml
@@ -0,0 +1,75 @@
+# camel-k: language=kamelet
+
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: twitter-search-source
+  annotations:
+    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjI1NnB4IiBoZWlnaHQ9IjIwOXB4IiB2aWV3Qm94PSIwIDAgMjU2IDIwOSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+CiAgICA8Zz4KICAgICAgICA8cGF0aCBkPSJNMjU2LDI1LjQ1MDAyNTkgQzI0Ni41ODA4NDEsMjkuNjI3MjY3MiAyMzYuNDU4NDUxLDMyLjQ1MDQ4NjggMj [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+  labels:
+    camel.apache.org/kamelet.type: "source"
+    camel.apache.org/kamelet.group: "Twitter"
+spec:
+  definition:
+    title: "Twitter Search Source"
+    description: |-
+      Allows to get all tweets on particular keywords from Twitter.
+
+      It requires tokens that can be obtained by creating an application 
+      in the Twitter developer portal: https://developer.twitter.com/.
+    required:
+    - keywords
+    - apiKey
+    - apiKeySecret
+    - accessToken
+    - accessTokenSecret
+    properties:
+      keywords:
+        title: Keywords
+        description: The keywords to use in the Twitter search (Supports Twitter standard operators)
+        type: string
+        example: "Apache Camel"
+      apiKey:
+        title: API Key
+        description: The API Key from the Twitter application in the developer portal
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+      apiKeySecret:
+        title: API Key Secret
+        description: The API Key Secret from the Twitter application in the developer portal
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+      accessToken:
+        title: Access Token
+        description: The Access Token from the Twitter application in the developer portal
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+      accessTokenSecret:
+        title: Access Token Secret
+        description: The Access Token Secret from the Twitter application in the developer portal
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+  types:
+    out:
+      mediaType: application/json
+  flow:
+    from:
+      uri: "twitter-search:{{keywords}}"
+      parameters:
+        accessToken: "{{accessToken}}"
+        accessTokenSecret: "{{accessTokenSecret}}"
+        consumerKey: "{{apiKey}}"
+        consumerSecret: "{{apiKeySecret}}"
+      steps:
+      - marshal:
+          json: {}
+      - to: "kamelet:sink"