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 2022/03/30 15:44:16 UTC

[camel-kamelets] 01/08: feature(salesforce-sink): Add, update, and delete salesforce sink

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

commit e305a4acaee454f88c174ba17e53851a9deea8ae
Author: Maria Arias de Reyna <ar...@redhat.com>
AuthorDate: Mon Mar 28 10:59:09 2022 +0200

    feature(salesforce-sink): Add, update, and delete salesforce sink
---
 kamelets/salesforce-create-sink.kamelet.yaml       | 101 +++++++++++++++++++
 kamelets/salesforce-delete-sink.kamelet.yaml       | 107 +++++++++++++++++++++
 kamelets/salesforce-update-sink.kamelet.yaml       | 105 ++++++++++++++++++++
 test/salesforce-sink/delete-secret.sh              |  19 ++++
 .../direct-to-salesforce-delete-binding.yaml       |  42 ++++++++
 .../direct-to-salesforce-update-binding.yaml       |  45 +++++++++
 test/salesforce-sink/prepare-secret.sh             |  21 ++++
 .../salesforce-credentials.properties              |  24 +++++
 test/salesforce-sink/salesforce-sink.feature       |  78 +++++++++++++++
 .../timer-to-salesforce-binding.yaml               |  41 ++++++++
 test/salesforce-sink/yaks-config.yaml              |  53 ++++++++++
 11 files changed, 636 insertions(+)

diff --git a/kamelets/salesforce-create-sink.kamelet.yaml b/kamelets/salesforce-create-sink.kamelet.yaml
new file mode 100644
index 0000000..2cbff14
--- /dev/null
+++ b/kamelets/salesforce-create-sink.kamelet.yaml
@@ -0,0 +1,101 @@
+#---------------------------------------------------------------------------
+# 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: salesforce-create-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,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdmVyc2lvbj0iMS4xIj48ZyBpZD0ic3VyZmFjZTEiPjxwYXRoIGQ9Ik0zNi41IDEyYy0xLjMyNCAwLTIuNTkuMjU4LTMuNzU4LjcwM0E3Ljk5NCA3Ljk5NCAwIDAgMCAyNiA5Yy0yLjEwNSAwLTQuMDIuODItNS40NDUgMi4xNTJBOS40NjggOS40NjggMCAwIDAgMTMuNSA4QzguMjU0IDggNCAxMi4yNTQgNCAxNy41YzAgLj [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+    camel.apache.org/kamelet.group: "Salesforce"
+  labels:
+    camel.apache.org/kamelet.type: "sink"
+spec:
+  definition:
+    title: "Salesforce Create Sink"
+    description: "Creates an object in  Salesforce."
+    required:
+      - sObjectName
+      - clientId
+      - clientSecret
+      - userName
+      - password
+    type: object
+    properties:
+      sObjectName:
+        title: sObjectName
+        description: Type of the object
+        type: string
+        example: Contact
+      loginUrl:
+        title: Login URL
+        description: The Salesforce instance login URL
+        type: string
+        default: https://login.salesforce.com
+      clientId:
+        title: Consumer Key
+        description: The Salesforce application consumer key
+        type: string
+        x-descriptors:
+        - urn:camel:group:credentials
+      clientSecret:
+        title: Consumer Secret
+        description: The Salesforce application consumer secret
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+        - urn:camel:group:credentials
+      userName:
+        title: Username
+        description: The Salesforce username
+        type: string
+        x-descriptors:
+        - urn:camel:group:credentials
+      password:
+        title: Password
+        description: The Salesforce user password
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+        - urn:camel:group:credentials
+  types:
+    in:
+      mediaType: application/json
+  dependencies:
+  - "camel:salesforce"
+  - "camel:kamelet"
+  template:
+    beans:
+      - name: local-salesforce
+        type: "#class:org.apache.camel.component.salesforce.SalesforceComponent"
+        properties:
+          clientId: "{{clientId}}"
+          clientSecret: "{{clientSecret}}"
+          userName: "{{userName}}"
+          password: "{{password}}"
+          loginUrl: "{{loginUrl}}"
+    from:
+      uri: kamelet:source
+      steps:
+        - to:
+            uri: "{{local-salesforce}}:createSObject"
+            parameters:
+              sObjectName: "{{sObjectName}}"
diff --git a/kamelets/salesforce-delete-sink.kamelet.yaml b/kamelets/salesforce-delete-sink.kamelet.yaml
new file mode 100644
index 0000000..8899277
--- /dev/null
+++ b/kamelets/salesforce-delete-sink.kamelet.yaml
@@ -0,0 +1,107 @@
+#---------------------------------------------------------------------------
+# 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: salesforce-delete-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,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdmVyc2lvbj0iMS4xIj48ZyBpZD0ic3VyZmFjZTEiPjxwYXRoIGQ9Ik0zNi41IDEyYy0xLjMyNCAwLTIuNTkuMjU4LTMuNzU4LjcwM0E3Ljk5NCA3Ljk5NCAwIDAgMCAyNiA5Yy0yLjEwNSAwLTQuMDIuODItNS40NDUgMi4xNTJBOS40NjggOS40NjggMCAwIDAgMTMuNSA4QzguMjU0IDggNCAxMi4yNTQgNCAxNy41YzAgLj [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+    camel.apache.org/kamelet.group: "Salesforce"
+  labels:
+    camel.apache.org/kamelet.type: "sink"
+spec:
+  definition:
+    title: "Salesforce Delete Sink"
+    description: "Removes an object from Salesforce."
+    required:
+      - sObjectId
+      - sObjectName
+      - clientId
+      - clientSecret
+      - userName
+      - password
+    type: object
+    properties:
+      sObjectName:
+        title: sObjectName
+        description: Type of the object
+        type: string
+        example: Contact
+      sObjectId:
+        title: sObjectId
+        description: Id of the object
+        type: string
+      loginUrl:
+        title: Login URL
+        description: The Salesforce instance login URL
+        type: string
+        default: https://login.salesforce.com
+      clientId:
+        title: Consumer Key
+        description: The Salesforce application consumer key
+        type: string
+        x-descriptors:
+        - urn:camel:group:credentials
+      clientSecret:
+        title: Consumer Secret
+        description: The Salesforce application consumer secret
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+        - urn:camel:group:credentials
+      userName:
+        title: Username
+        description: The Salesforce username
+        type: string
+        x-descriptors:
+        - urn:camel:group:credentials
+      password:
+        title: Password
+        description: The Salesforce user password
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+        - urn:camel:group:credentials
+  types:
+    in:
+      mediaType: application/json
+  dependencies:
+  - "camel:salesforce"
+  - "camel:kamelet"
+  template:
+    beans:
+      - name: local-delete-salesforce
+        type: "#class:org.apache.camel.component.salesforce.SalesforceComponent"
+        properties:
+          clientId: "{{clientId}}"
+          clientSecret: "{{clientSecret}}"
+          userName: "{{userName}}"
+          password: "{{password}}"
+          loginUrl: "{{loginUrl}}"
+    from:
+      uri: kamelet:source
+      steps:
+        - to:
+            uri: "{{local-delete-salesforce}}:deleteSObject"
+            parameters:
+              sObjectId: "{{sObjectId}}"
+              sObjectName: "{{sObjectName}}"
diff --git a/kamelets/salesforce-update-sink.kamelet.yaml b/kamelets/salesforce-update-sink.kamelet.yaml
new file mode 100644
index 0000000..d44bdbd
--- /dev/null
+++ b/kamelets/salesforce-update-sink.kamelet.yaml
@@ -0,0 +1,105 @@
+#---------------------------------------------------------------------------
+# 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: salesforce-update-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,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdmVyc2lvbj0iMS4xIj48ZyBpZD0ic3VyZmFjZTEiPjxwYXRoIGQ9Ik0zNi41IDEyYy0xLjMyNCAwLTIuNTkuMjU4LTMuNzU4LjcwM0E3Ljk5NCA3Ljk5NCAwIDAgMCAyNiA5Yy0yLjEwNSAwLTQuMDIuODItNS40NDUgMi4xNTJBOS40NjggOS40NjggMCAwIDAgMTMuNSA4QzguMjU0IDggNCAxMi4yNTQgNCAxNy41YzAgLj [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+    camel.apache.org/kamelet.group: "Salesforce"
+  labels:
+    camel.apache.org/kamelet.type: "sink"
+spec:
+  definition:
+    title: "Salesforce Update Sink"
+    description: "Updates an object in  Salesforce."
+    required:
+      - clientId
+      - clientSecret
+      - userName
+      - password
+    type: object
+    properties:
+      sObjectName:
+        title: sObjectName
+        description: Type of the object
+        type: string
+        example: Contact
+      sObjectId:
+        title: sObjectId
+        description: Id of the object
+        type: string
+      loginUrl:
+        title: Login URL
+        description: The Salesforce instance login URL
+        type: string
+        default: https://login.salesforce.com
+      clientId:
+        title: Consumer Key
+        description: The Salesforce application consumer key
+        type: string
+        x-descriptors:
+        - urn:camel:group:credentials
+      clientSecret:
+        title: Consumer Secret
+        description: The Salesforce application consumer secret
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+        - urn:camel:group:credentials
+      userName:
+        title: Username
+        description: The Salesforce username
+        type: string
+        x-descriptors:
+        - urn:camel:group:credentials
+      password:
+        title: Password
+        description: The Salesforce user password
+        type: string
+        format: password
+        x-descriptors:
+        - urn:alm:descriptor:com.tectonic.ui:password
+        - urn:camel:group:credentials
+  types:
+    in:
+      mediaType: application/json
+  dependencies:
+  - "camel:salesforce"
+  - "camel:kamelet"
+  template:
+    beans:
+      - name: local-salesforce
+        type: "#class:org.apache.camel.component.salesforce.SalesforceComponent"
+        properties:
+          clientId: "{{clientId}}"
+          clientSecret: "{{clientSecret}}"
+          userName: "{{userName}}"
+          password: "{{password}}"
+          loginUrl: "{{loginUrl}}"
+    from:
+      uri: kamelet:source
+      steps:
+        - to:
+            uri: "{{local-salesforce}}:updateSObject"
+            parameters:
+              sObjectId: "{{sObjectId}}"
+              sObjectName: "{{sObjectName}}"
diff --git a/test/salesforce-sink/delete-secret.sh b/test/salesforce-sink/delete-secret.sh
new file mode 100644
index 0000000..6661b95
--- /dev/null
+++ b/test/salesforce-sink/delete-secret.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# 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.
+
+# delete secret
+oc delete secret salesforce-credentials -n ${YAKS_NAMESPACE}
diff --git a/test/salesforce-sink/direct-to-salesforce-delete-binding.yaml b/test/salesforce-sink/direct-to-salesforce-delete-binding.yaml
new file mode 100644
index 0000000..7441a1c
--- /dev/null
+++ b/test/salesforce-sink/direct-to-salesforce-delete-binding.yaml
@@ -0,0 +1,42 @@
+# ---------------------------------------------------------------------------
+# 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: KameletBinding
+metadata:
+  name: direct-to-salesforce-delete-binding
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: timer-source
+    properties:
+      period: 60000
+      message: "Hello Salesforce!"
+  sink:
+    ref:
+      apiVersion: camel.apache.org/v1alpha1
+      kind: Kamelet
+      name: salesforce-delete-sink
+    properties:
+      clientId: "${client_id}"
+      clientSecret: "${client_secret}"
+      userName: "${userName}"
+      password: "${password}"
+      sObjectName: "Contact"
+      sObjectId: "${id}"
diff --git a/test/salesforce-sink/direct-to-salesforce-update-binding.yaml b/test/salesforce-sink/direct-to-salesforce-update-binding.yaml
new file mode 100644
index 0000000..f0fdbaa
--- /dev/null
+++ b/test/salesforce-sink/direct-to-salesforce-update-binding.yaml
@@ -0,0 +1,45 @@
+# ---------------------------------------------------------------------------
+# 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: KameletBinding
+metadata:
+  name: direct-to-salesforce-update-binding
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: timer-source
+    properties:
+      period: 60000
+      message: |-
+        {
+          "Phone": "1234567890"
+        }
+  sink:
+    ref:
+      apiVersion: camel.apache.org/v1alpha1
+      kind: Kamelet
+      name: salesforce-update-sink
+    properties:
+      clientId: "${client_id}"
+      clientSecret: "${client_secret}"
+      userName: "${userName}"
+      password: "${password}"
+      sObjectId: "${id}"
+      sObjectName: "Contact"
diff --git a/test/salesforce-sink/prepare-secret.sh b/test/salesforce-sink/prepare-secret.sh
new file mode 100755
index 0000000..88ebcc3
--- /dev/null
+++ b/test/salesforce-sink/prepare-secret.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# 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.
+
+# create secret from properties file
+oc create secret generic salesforce-credentials --from-file=salesforce-credentials.properties -n ${YAKS_NAMESPACE}
+# bind secret to test by name
+oc label secret salesforce-credentials yaks.citrusframework.org/test=salesforce-sink -n ${YAKS_NAMESPACE}
diff --git a/test/salesforce-sink/salesforce-credentials.properties b/test/salesforce-sink/salesforce-credentials.properties
new file mode 100644
index 0000000..3c95aef
--- /dev/null
+++ b/test/salesforce-sink/salesforce-credentials.properties
@@ -0,0 +1,24 @@
+#
+# 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.
+#
+
+# Please add your Salesforce account credentials
+
+clientId=
+clientSecret=
+userName=
+password=
+apiVersion=50.0
diff --git a/test/salesforce-sink/salesforce-sink.feature b/test/salesforce-sink/salesforce-sink.feature
new file mode 100644
index 0000000..79bc96f
--- /dev/null
+++ b/test/salesforce-sink/salesforce-sink.feature
@@ -0,0 +1,78 @@
+# ---------------------------------------------------------------------------
+# 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.
+# ---------------------------------------------------------------------------
+
+Feature: Salesforce Kamelet
+
+  Background:
+    Given variable client_id is "${clientId}"
+    Given variable userName is "${userName}"
+    Given variable password is "${password}"
+    Given variable client_secret is "${clientSecret}"
+
+    Given variable token_request is "grant_type=password&client_id=${client_id}&client_secret=${client_secret}&username=${userName}&password=${password}"
+    Given URL: https://login.salesforce.com
+    And HTTP request header Content-Type="application/x-www-form-urlencoded"
+    And HTTP request body: ${token_request}
+    When send POST /services/oauth2/token
+    Then verify HTTP response expression: $.instance_url="@variable(instance_url)@"
+    And verify HTTP response expression: $.access_token="@variable(access_token)@"
+    And receive HTTP 200 OK
+
+  Scenario: Interact with SalesForce
+    Given load KameletBinding timer-to-salesforce-binding.yaml
+    Then Camel K integration timer-to-salesforce-binding should be running
+    And Camel K integration timer-to-salesforce-binding should print Routes startup
+
+    Given URL: ${instance_url}
+    Then HTTP request header Authorization="Bearer ${access_token}"
+    And HTTP request header Content-Type="application/json"
+    And HTTP request query parameter q="citrus:urlEncode('SELECT Id FROM Contact LIMIT 1')"
+    When send GET /services/data/v50.0/query/
+    Then verify HTTP response expression: $.records[0].Id="@variable(id)@"
+    And receive HTTP 200 OK
+
+    And load KameletBinding direct-to-salesforce-update-binding.yaml
+    Then Camel K integration direct-to-salesforce-update-binding should be running
+    And Camel K integration direct-to-salesforce-update-binding should print Routes startup
+    Then sleep 5000 ms
+    Given URL: ${instance_url}
+    Then HTTP request header Authorization="Bearer ${access_token}"
+    And HTTP request header Content-Type="application/json"
+    Given variable query is "SELECT Phone FROM Contact WHERE Id = '${id}'"
+    And HTTP request query parameter q="citrus:urlEncode('${query}')"
+    When send GET /services/data/v50.0/query/
+    Then verify HTTP response expression: $.records[0].Phone="1234567890"
+    And receive HTTP 200 OK
+
+    When load KameletBinding direct-to-salesforce-delete-binding.yaml
+    Then Camel K integration direct-to-salesforce-delete-binding should be running
+    And Camel K integration direct-to-salesforce-delete-binding should print Routes startup
+    Then sleep 5000 ms
+
+    Given URL: ${instance_url}
+    Given HTTP request header Authorization="Bearer ${access_token}"
+    And HTTP request header Content-Type="application/json"
+    And HTTP request query parameter q="citrus:urlEncode('${query}')"
+    When send GET /services/data/v50.0/query/
+    Then verify HTTP response expression: $.totalSize="0"
+    And receive HTTP 200 OK
+
+
+  Scenario: Remove Camel-K resources
+    Given delete KameletBinding timer-to-salesforce-binding
+    And delete KameletBinding direct-to-salesforce-update-binding
+    And delete KameletBinding direct-to-salesforce-delete-binding
diff --git a/test/salesforce-sink/timer-to-salesforce-binding.yaml b/test/salesforce-sink/timer-to-salesforce-binding.yaml
new file mode 100644
index 0000000..c9dc125
--- /dev/null
+++ b/test/salesforce-sink/timer-to-salesforce-binding.yaml
@@ -0,0 +1,41 @@
+# ---------------------------------------------------------------------------
+# 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: KameletBinding
+metadata:
+  name: timer-to-salesforce-binding
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: timer-source
+    properties:
+      period: 60000
+      message: "{ \"name\": \"Test\", \"lastname\": \"Tester\", \"Phone\": \"123\" }"
+  sink:
+    ref:
+      apiVersion: camel.apache.org/v1alpha1
+      kind: Kamelet
+      name: salesforce-create-sink
+    properties:
+      clientId: "${client_id}"
+      clientSecret: "${client_secret}"
+      userName: "${userName}"
+      password: "${password}"
+      sObjectName: "Contact"
diff --git a/test/salesforce-sink/yaks-config.yaml b/test/salesforce-sink/yaks-config.yaml
new file mode 100644
index 0000000..95b5c3b
--- /dev/null
+++ b/test/salesforce-sink/yaks-config.yaml
@@ -0,0 +1,53 @@
+# ---------------------------------------------------------------------------
+# 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: false
+  runtime:
+    settings:
+      loggers:
+        - name: root
+          level: INFO
+        - name: org.citrusframework.yaks
+          level: DEBUG
+        - name: com.consol.citrus
+          level: INFO
+        - name: Logger.Message_IN
+          level: DEBUG
+        - name: Logger.Message_OUT
+          level: DEBUG
+    env:
+      - name: YAKS_CAMELK_AUTO_REMOVE_RESOURCES
+        value: false
+      - name: YAKS_KUBERNETES_AUTO_REMOVE_RESOURCES
+        value: false
+    secret:  salesforce-credentials
+    resources:
+      - timer-to-salesforce-binding.yaml
+      - direct-to-salesforce-update-binding.yaml
+      - direct-to-salesforce-delete-binding.yaml
+      - salesforce-credentials.properties
+  dump:
+    enabled: true
+    failedOnly: true
+    includes:
+      - app=camel-k
+pre:
+  - script: prepare-secret.sh
+post:
+  - script: delete-secret.sh