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

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

commit 0e1630c7c2458b64493aa92d1d9af87b1684c4e0
Author: nicolaferraro <ni.ferr...@gmail.com>
AuthorDate: Wed Apr 28 17:16:32 2021 +0200

    Add validator bound to the CI and fix kamelets
---
 .github/workflows/validate.yaml                    |  53 +++++
 aws-kinesis-firehose-sink.kamelet.yaml             |   2 +-
 aws-s3-sink.kamelet.yaml                           |   2 +-
 aws-s3-source.kamelet.yaml                         |   4 +-
 aws-sns-fifo-sink.kamelet.yaml                     |   2 +-
 aws-sns-sink.kamelet.yaml                          |   2 +-
 aws-sqs-batch-sink.kamelet.yaml                    |   2 +-
 aws-sqs-fifo-sink.kamelet.yaml                     |   2 +-
 aws-sqs-sink.kamelet.yaml                          |   2 +-
 aws-sqs-source.kamelet.yaml                        |   6 +-
 azure-eventhubs-sink.kamelet.yaml                  |   6 +-
 azure-eventhubs-source.kamelet.yaml                |  12 +-
 azure-storage-blob-source.kamelet.yaml             |   2 +-
 bitcoin-source.kamelet.yaml                        |   2 +-
 .../twitter-directmessage-source.kamelet.yaml      |   0
 .../kamelets/twitter-search-source.kamelet.yaml    |   0
 .../kamelets/twitter-timeline-source.kamelet.yaml  |   0
 cassandra-sink.kamelet.yaml                        |   4 +-
 docs/README.md                                     |  13 +-
 docs/generator/go.mod                              |   8 -
 .../ROOT/pages/aws-kinesis-firehose-sink.adoc      |   4 +-
 docs/modules/ROOT/pages/aws-s3-sink.adoc           |   2 +-
 docs/modules/ROOT/pages/aws-s3-source.adoc         |   4 +-
 docs/modules/ROOT/pages/aws-sns-fifo-sink.adoc     |   2 +-
 docs/modules/ROOT/pages/aws-sns-sink.adoc          |   2 +-
 docs/modules/ROOT/pages/aws-sqs-batch-sink.adoc    |   2 +-
 docs/modules/ROOT/pages/aws-sqs-fifo-sink.adoc     |   2 +-
 docs/modules/ROOT/pages/aws-sqs-sink.adoc          |   2 +-
 docs/modules/ROOT/pages/aws-sqs-source.adoc        |   6 +-
 docs/modules/ROOT/pages/azure-eventhubs-sink.adoc  |  12 +-
 .../modules/ROOT/pages/azure-eventhubs-source.adoc |  24 +--
 .../ROOT/pages/azure-storage-blob-source.adoc      |   2 +-
 docs/modules/ROOT/pages/bitcoin-source.adoc        |   2 +-
 docs/modules/ROOT/pages/cassandra-sink.adoc        |   3 +-
 docs/modules/ROOT/pages/dropbox-sink.adoc          |   8 +-
 docs/modules/ROOT/pages/dropbox-source.adoc        |  14 +-
 docs/modules/ROOT/pages/earthquake-source.adoc     |   4 +-
 .../ROOT/pages/elasticsearch-search-source.adoc    |   8 +-
 docs/modules/ROOT/pages/exec-sink.adoc             |   6 +-
 docs/modules/ROOT/pages/fhir-source.adoc           |   4 +-
 docs/modules/ROOT/pages/file-watch-source.adoc     |   6 +-
 docs/modules/ROOT/pages/github-source.adoc         |   2 +-
 docs/modules/ROOT/pages/google-mail-source.adoc    |  10 +-
 docs/modules/ROOT/pages/http-source.adoc           |   4 +-
 docs/modules/ROOT/pages/kafka-source.adoc          |   4 +-
 docs/modules/ROOT/pages/minio-sink.adoc            |   2 +-
 docs/modules/ROOT/pages/minio-source.adoc          |   4 +-
 docs/modules/ROOT/pages/nats-source.adoc           |   7 +-
 docs/modules/ROOT/pages/ssh-source.adoc            |  16 +-
 dropbox-sink.kamelet.yaml                          |   4 +-
 dropbox-source.kamelet.yaml                        |   8 +-
 earthquake-source.kamelet.yaml                     |   4 +-
 elasticsearch-search-source.kamelet.yaml           |   4 +-
 exec-sink.kamelet.yaml                             |   7 +-
 fhir-source.kamelet.yaml                           |   4 +-
 file-watch-source.kamelet.yaml                     |   4 +-
 github-source.kamelet.yaml                         |   2 +-
 google-mail-source.kamelet.yaml                    |   8 +-
 http-source.kamelet.yaml                           |   4 +-
 kafka-source.kamelet.yaml                          |   2 +-
 minio-sink.kamelet.yaml                            |   2 +-
 minio-source.kamelet.yaml                          |   4 +-
 nats-source.kamelet.yaml                           |   6 +-
 script/generator/README.md                         |   8 +
 {docs => script}/generator/generator.go            |   0
 script/generator/go.mod                            |  10 +
 {docs => script}/generator/go.sum                  |  92 ++++++++
 script/validator/README.md                         |   8 +
 script/validator/go.mod                            |  12 ++
 script/validator/go.sum                            | 208 ++++++++++++++++++
 script/validator/validator.go                      | 239 +++++++++++++++++++++
 ssh-source.kamelet.yaml                            |  10 +-
 ...ml => twitter-directmessage-source.kamelet.yaml |   0
 ...elet.yaml => twitter-search-source.kamelet.yaml |   0
 ...et.yaml => twitter-timeline-source.kamelet.yaml |   0
 75 files changed, 780 insertions(+), 162 deletions(-)

diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml
new file mode 100644
index 0000000..5f9afbd
--- /dev/null
+++ b/.github/workflows/validate.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.
+# ---------------------------------------------------------------------------
+
+name: validate
+
+on:
+  pull_request:
+    branches:
+      - main
+    paths-ignore:
+      - '**.adoc'
+      - 'KEYS'
+      - 'LICENSE'
+      - 'NOTICE'
+  push:
+    branches:
+      - main
+    paths-ignore:
+      - '**.adoc'
+      - 'KEYS'
+      - 'LICENSE'
+      - 'NOTICE'
+
+jobs:
+  validate:
+    runs-on: ubuntu-latest
+    steps:
+    - name: Checkout code
+      uses: actions/checkout@v2
+    - name: Install Go
+      uses: actions/setup-go@v1
+      with:
+        go-version: 1.13.x
+    - name: Run Validator
+      run: |
+        echo "Running Kamelet validator..."
+
+        cd script/validator
+        go run . ../../
diff --git a/aws-kinesis-firehose-sink.kamelet.yaml 
b/aws-kinesis-firehose-sink.kamelet.yaml
index 33ac7c4..7d992e7 100644
--- a/aws-kinesis-firehose-sink.kamelet.yaml
+++ b/aws-kinesis-firehose-sink.kamelet.yaml
@@ -19,7 +19,7 @@ spec:
       - region
     properties:
       streamName:
-        title: Stream name
+        title: Stream Name
         description: The name of the stream we want to send to data to
         type: string
       accessKey:
diff --git a/aws-s3-sink.kamelet.yaml b/aws-s3-sink.kamelet.yaml
index 5caafb2..85d061e 100644
--- a/aws-s3-sink.kamelet.yaml
+++ b/aws-s3-sink.kamelet.yaml
@@ -56,7 +56,7 @@ spec:
         type: string
         example: "http://another-s3-endpoint:9000";
       autoCreateBucket:
-        title: Autocreate bucket
+        title: Autocreate Bucket
         description: Setting the autocreation of the S3 bucket bucketName.
         type: boolean
         x-descriptors:
diff --git a/aws-s3-source.kamelet.yaml b/aws-s3-source.kamelet.yaml
index 77f9bee..8c4ab4c 100644
--- a/aws-s3-source.kamelet.yaml
+++ b/aws-s3-source.kamelet.yaml
@@ -23,7 +23,7 @@ spec:
         description: The S3 Bucket name or ARN
         type: string
       deleteAfterRead:
-        title: Auto-delete objects
+        title: Auto-delete Objects
         description: Delete objects after consuming them
         type: boolean
         x-descriptors:
@@ -47,7 +47,7 @@ spec:
         type: string
         example: eu-west-1
       autoCreateBucket:
-        title: Autocreate bucket
+        title: Autocreate Bucket
         description: Setting the autocreation of the S3 bucket bucketName. 
         type: boolean
         x-descriptors:
diff --git a/aws-sns-fifo-sink.kamelet.yaml b/aws-sns-fifo-sink.kamelet.yaml
index 21bcc58..af43b31 100644
--- a/aws-sns-fifo-sink.kamelet.yaml
+++ b/aws-sns-fifo-sink.kamelet.yaml
@@ -45,7 +45,7 @@ spec:
         type: boolean
         default: false
       autoCreateTopic:
-        title: Autocreate topic
+        title: Autocreate Topic
         description: Setting the autocreation of the SNS topic. 
         type: boolean
         x-descriptors:
diff --git a/aws-sns-sink.kamelet.yaml b/aws-sns-sink.kamelet.yaml
index 6a668e0..3925568 100644
--- a/aws-sns-sink.kamelet.yaml
+++ b/aws-sns-sink.kamelet.yaml
@@ -40,7 +40,7 @@ spec:
         type: string
         example: eu-west-1
       autoCreateTopic:
-        title: Autocreate topic
+        title: Autocreate Topic
         description: Setting the autocreation of the SNS topic. 
         type: boolean
         x-descriptors:
diff --git a/aws-sqs-batch-sink.kamelet.yaml b/aws-sqs-batch-sink.kamelet.yaml
index 8a95a76..56c15f7 100644
--- a/aws-sqs-batch-sink.kamelet.yaml
+++ b/aws-sqs-batch-sink.kamelet.yaml
@@ -41,7 +41,7 @@ spec:
         type: string
         example: eu-west-1
       autoCreateQueue:
-        title: Autocreate queue
+        title: Autocreate Queue
         description: Setting the autocreation of the SQS queue. 
         type: boolean
         x-descriptors:
diff --git a/aws-sqs-fifo-sink.kamelet.yaml b/aws-sqs-fifo-sink.kamelet.yaml
index dd2a427..f4a07b9 100644
--- a/aws-sqs-fifo-sink.kamelet.yaml
+++ b/aws-sqs-fifo-sink.kamelet.yaml
@@ -45,7 +45,7 @@ spec:
         type: boolean
         default: false
       autoCreateQueue:
-        title: Autocreate queue
+        title: Autocreate Queue
         description: Setting the autocreation of the SQS queue. 
         type: boolean
         x-descriptors:
diff --git a/aws-sqs-sink.kamelet.yaml b/aws-sqs-sink.kamelet.yaml
index d4151fe..e45bd03 100644
--- a/aws-sqs-sink.kamelet.yaml
+++ b/aws-sqs-sink.kamelet.yaml
@@ -40,7 +40,7 @@ spec:
         type: string
         example: eu-west-1
       autoCreateQueue:
-        title: Autocreate queue
+        title: Autocreate Queue
         description: Setting the autocreation of the SQS queue. 
         type: boolean
         x-descriptors:
diff --git a/aws-sqs-source.kamelet.yaml b/aws-sqs-source.kamelet.yaml
index 20e7326..47337b2 100644
--- a/aws-sqs-source.kamelet.yaml
+++ b/aws-sqs-source.kamelet.yaml
@@ -20,10 +20,10 @@ spec:
     properties:
       queueNameOrArn:
         title: Queue Name
-        description: The SQS Queue name or ARN
+        description: The SQS Queue Name or ARN
         type: string
       deleteAfterRead:
-        title: Auto-delete messages
+        title: Auto-delete Messages
         description: Delete messages after consuming them
         type: boolean
         x-descriptors:
@@ -47,7 +47,7 @@ spec:
         type: string
         example: eu-west-1
       autoCreateQueue:
-        title: Autocreate queue
+        title: Autocreate Queue
         description: Setting the autocreation of the SQS queue. 
         type: boolean
         x-descriptors:
diff --git a/azure-eventhubs-sink.kamelet.yaml 
b/azure-eventhubs-sink.kamelet.yaml
index 9208f06..0082ef6 100644
--- a/azure-eventhubs-sink.kamelet.yaml
+++ b/azure-eventhubs-sink.kamelet.yaml
@@ -29,16 +29,16 @@ spec:
         description: The eventhubs namespace
         type: string
       eventhubName:
-        title: Eventhubs name
+        title: Eventhubs Name
         description: The eventhub name
         type: boolean
         type: string
       sharedAccessName:
-        title: Share access name
+        title: Share Access Name
         description: EventHubs SAS key name
         type: string
       sharedAccessKey:
-        title: Share access key
+        title: Share Access Key
         description: The key for EventHubs SAS key name
         type: string
         x-descriptors:
diff --git a/azure-eventhubs-source.kamelet.yaml 
b/azure-eventhubs-source.kamelet.yaml
index 863f3df..3a1ab67 100644
--- a/azure-eventhubs-source.kamelet.yaml
+++ b/azure-eventhubs-source.kamelet.yaml
@@ -26,30 +26,30 @@ spec:
         description: The eventhubs namespace
         type: string
       eventhubName:
-        title: Eventhubs name
+        title: Eventhubs Name
         description: The eventhub name
         type: boolean
         type: string
       sharedAccessName:
-        title: Share access name
+        title: Share Access Name
         description: EventHubs SAS key name
         type: string
       sharedAccessKey:
-        title: Share access key
+        title: Share Access Key
         description: The key for EventHubs SAS key name
         type: string
         x-descriptors:
         - urn:alm:descriptor:com.tectonic.ui:password
       blobAccountName:
-        title: Azure Storage Blob account name
+        title: Azure Storage Blob Account Name
         description: The name of the storage blob account to be use
         type: string
       blobContainerName:
-        title: Azure Storage Blob container name
+        title: Azure Storage Blob Container Name
         description: The name of the storage blob container to be use
         type: string
       blobAccessKey:
-        title: Azure Storage Blob access key
+        title: Azure Storage Blob Access Key
         description: The key for Azure Storage Blob service associated with 
the Blob account name
         type: string
         x-descriptors:
diff --git a/azure-storage-blob-source.kamelet.yaml 
b/azure-storage-blob-source.kamelet.yaml
index 93aa156..3b77cef 100644
--- a/azure-storage-blob-source.kamelet.yaml
+++ b/azure-storage-blob-source.kamelet.yaml
@@ -19,7 +19,7 @@ spec:
       - accessKey
     properties:
       period:
-        title: Period between polls
+        title: Period between Polls
         description: The interval between fetches to the Azure Storage 
Container in milliseconds
         type: integer
         default: 10000
diff --git a/bitcoin-source.kamelet.yaml b/bitcoin-source.kamelet.yaml
index 9d35788..21ccaa0 100644
--- a/bitcoin-source.kamelet.yaml
+++ b/bitcoin-source.kamelet.yaml
@@ -14,7 +14,7 @@ spec:
       Provides a feed of the value of the Bitcoin compared to USDT using the 
Binance service.
     properties:
       period:
-        title: Period between updates
+        title: Period between Updates
         description: The interval between updates in milliseconds
         type: integer
         default: 10000
diff --git a/twitter-directmessage.kamelet.yaml 
b/camel-kamelets-catalog/src/main/resources/kamelets/twitter-directmessage-source.kamelet.yaml
old mode 100755
new mode 100644
similarity index 100%
rename from twitter-directmessage.kamelet.yaml
rename to 
camel-kamelets-catalog/src/main/resources/kamelets/twitter-directmessage-source.kamelet.yaml
diff --git a/twitter-search.kamelet.yaml 
b/camel-kamelets-catalog/src/main/resources/kamelets/twitter-search-source.kamelet.yaml
old mode 100755
new mode 100644
similarity index 100%
rename from twitter-search.kamelet.yaml
rename to 
camel-kamelets-catalog/src/main/resources/kamelets/twitter-search-source.kamelet.yaml
diff --git a/twitter-timeline.kamelet.yaml 
b/camel-kamelets-catalog/src/main/resources/kamelets/twitter-timeline-source.kamelet.yaml
old mode 100755
new mode 100644
similarity index 100%
rename from twitter-timeline.kamelet.yaml
rename to 
camel-kamelets-catalog/src/main/resources/kamelets/twitter-timeline-source.kamelet.yaml
diff --git a/cassandra-sink.kamelet.yaml b/cassandra-sink.kamelet.yaml
index 6a9d428..cf62e89 100644
--- a/cassandra-sink.kamelet.yaml
+++ b/cassandra-sink.kamelet.yaml
@@ -20,7 +20,7 @@ spec:
       - keyspace
       - username
       - password
-      - query
+      - preparedStatement
     properties:
       host:
         title: Host
@@ -53,7 +53,7 @@ spec:
         type: string
         default: ANY
       preparedStatement:
-        title: The Prepared statement
+        title: Prepared Statement
         description: The Prepared statement to execute against the Cassandra 
cluster table
         type: string
   dependencies:
diff --git a/docs/README.md b/docs/README.md
index 4f51d31..4a8ce33 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -2,18 +2,13 @@
 
 This section contains the Kamelet catalog website, auto-generated from the 
source Kamelets.
 
-## Building
-
-To generate the adoc and svg files for the website (you need `go`):
-
-```
-# From the /docs/generator directory
-go run . ../../ ../modules/ROOT/
-```
-
 To preview the website:
 
 ```
 # From the /docs directory
 yarn preview
 ```
+
+## Generator
+
+The generator tool has been moved in the /script/generator directory
diff --git a/docs/generator/go.mod b/docs/generator/go.mod
deleted file mode 100644
index 85f55e1..0000000
--- a/docs/generator/go.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-module github.com/apache/camel-kamelets/docs/generator
-
-go 1.14
-
-require (
-       github.com/apache/camel-k/pkg/apis/camel v1.3.1
-       k8s.io/apimachinery v0.18.9
-)
diff --git a/docs/modules/ROOT/pages/aws-kinesis-firehose-sink.adoc 
b/docs/modules/ROOT/pages/aws-kinesis-firehose-sink.adoc
index 8187b9b..155e61c 100644
--- a/docs/modules/ROOT/pages/aws-kinesis-firehose-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-kinesis-firehose-sink.adoc
@@ -14,7 +14,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *accessKey {empty}* *| Access Key| The access key obtained from AWS| string| 
| 
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
-| *streamName {empty}* *| Stream name| The name of the stream we want to send 
to data to| string| | 
+| *streamName {empty}* *| Stream Name| The name of the stream we want to send 
to data to| string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -49,7 +49,7 @@ spec:
       accessKey: "The Access Key"
       region: "eu-west-1"
       secretKey: "The Secret Key"
-      streamName: "The Stream name"
+      streamName: "The Stream Name"
 
 ----
 
diff --git a/docs/modules/ROOT/pages/aws-s3-sink.adoc 
b/docs/modules/ROOT/pages/aws-s3-sink.adoc
index a2703f5..9289761 100644
--- a/docs/modules/ROOT/pages/aws-s3-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-s3-sink.adoc
@@ -21,7 +21,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *bucketNameOrArn {empty}* *| Bucket Name| The S3 Bucket name or ARN.| 
string| | 
 | *region {empty}* *| AWS Region| The AWS region to connect to.| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS.| 
string| | 
-| autoCreateBucket| Autocreate bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
+| autoCreateBucket| Autocreate Bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
 | overrideEndpoint| Override Endpoint| Set the need for overidding the 
endpoint. This option needs to be used in combination with 
uriEndpointOverride.| boolean| `false`| 
 | uriEndpointOverride| Override Endpoint URI| Set the overriding uri endpoint. 
This option needs to be used in combination with overrideEndpoint option.| 
string| | `"http://another-s3-endpoint:9000"`
 |===
diff --git a/docs/modules/ROOT/pages/aws-s3-source.adoc 
b/docs/modules/ROOT/pages/aws-s3-source.adoc
index 66d4b52..11570b4 100644
--- a/docs/modules/ROOT/pages/aws-s3-source.adoc
+++ b/docs/modules/ROOT/pages/aws-s3-source.adoc
@@ -15,8 +15,8 @@ The following table summarizes the configuration options 
available for the `aws-
 | *bucketNameOrArn {empty}* *| Bucket Name| The S3 Bucket name or ARN| string| 
| 
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
-| autoCreateBucket| Autocreate bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
-| deleteAfterRead| Auto-delete objects| Delete objects after consuming them| 
boolean| `true`| 
+| autoCreateBucket| Autocreate Bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
+| deleteAfterRead| Auto-delete Objects| Delete objects after consuming them| 
boolean| `true`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/aws-sns-fifo-sink.adoc 
b/docs/modules/ROOT/pages/aws-sns-fifo-sink.adoc
index 37256fa..d8a9058 100644
--- a/docs/modules/ROOT/pages/aws-sns-fifo-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-sns-fifo-sink.adoc
@@ -15,7 +15,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
 | *topicNameOrArn {empty}* *| Topic Name| The SNS Topic name or ARN| string| | 
-| autoCreateTopic| Autocreate topic| Setting the autocreation of the SNS 
topic.| boolean| `false`| 
+| autoCreateTopic| Autocreate Topic| Setting the autocreation of the SNS 
topic.| boolean| `false`| 
 | contentBasedDeduplication| Content-Based Deduplication| Use content-based 
deduplication (should be enabled in the SQS FIFO queue first)| boolean| 
`false`| 
 |===
 
diff --git a/docs/modules/ROOT/pages/aws-sns-sink.adoc 
b/docs/modules/ROOT/pages/aws-sns-sink.adoc
index 9ce2f28..0f74eb9 100644
--- a/docs/modules/ROOT/pages/aws-sns-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-sns-sink.adoc
@@ -15,7 +15,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
 | *topicNameOrArn {empty}* *| Topic Name| The SQS Topic name or ARN| string| | 
-| autoCreateTopic| Autocreate topic| Setting the autocreation of the SNS 
topic.| boolean| `false`| 
+| autoCreateTopic| Autocreate Topic| Setting the autocreation of the SNS 
topic.| boolean| `false`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/aws-sqs-batch-sink.adoc 
b/docs/modules/ROOT/pages/aws-sqs-batch-sink.adoc
index 4caee88..aa37b3e 100644
--- a/docs/modules/ROOT/pages/aws-sqs-batch-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-sqs-batch-sink.adoc
@@ -16,7 +16,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *queueNameOrArn {empty}* *| Queue Name| The SQS Queue name or ARN| string| | 
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
-| autoCreateQueue| Autocreate queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
+| autoCreateQueue| Autocreate Queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/aws-sqs-fifo-sink.adoc 
b/docs/modules/ROOT/pages/aws-sqs-fifo-sink.adoc
index 8db85a3..f6b43f9 100644
--- a/docs/modules/ROOT/pages/aws-sqs-fifo-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-sqs-fifo-sink.adoc
@@ -15,7 +15,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *queueNameOrArn {empty}* *| Queue Name| The SQS Queue name or ARN| string| | 
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
-| autoCreateQueue| Autocreate queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
+| autoCreateQueue| Autocreate Queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
 | contentBasedDeduplication| Content-Based Deduplication| Use content-based 
deduplication (should be enabled in the SQS FIFO queue first)| boolean| 
`false`| 
 |===
 
diff --git a/docs/modules/ROOT/pages/aws-sqs-sink.adoc 
b/docs/modules/ROOT/pages/aws-sqs-sink.adoc
index 0ea5c3a..95fa148 100644
--- a/docs/modules/ROOT/pages/aws-sqs-sink.adoc
+++ b/docs/modules/ROOT/pages/aws-sqs-sink.adoc
@@ -15,7 +15,7 @@ The following table summarizes the configuration options 
available for the `aws-
 | *queueNameOrArn {empty}* *| Queue Name| The SQS Queue name or ARN| string| | 
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
-| autoCreateQueue| Autocreate queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
+| autoCreateQueue| Autocreate Queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/aws-sqs-source.adoc 
b/docs/modules/ROOT/pages/aws-sqs-source.adoc
index 55957d8..5d1dfca 100644
--- a/docs/modules/ROOT/pages/aws-sqs-source.adoc
+++ b/docs/modules/ROOT/pages/aws-sqs-source.adoc
@@ -12,11 +12,11 @@ The following table summarizes the configuration options 
available for the `aws-
 |===
 | Property| Name| Description| Type| Default| Example
 | *accessKey {empty}* *| Access Key| The access key obtained from AWS| string| 
| 
-| *queueNameOrArn {empty}* *| Queue Name| The SQS Queue name or ARN| string| | 
+| *queueNameOrArn {empty}* *| Queue Name| The SQS Queue Name or ARN| string| | 
 | *region {empty}* *| AWS Region| The AWS region to connect to| string| | 
`"eu-west-1"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from AWS| string| 
| 
-| autoCreateQueue| Autocreate queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
-| deleteAfterRead| Auto-delete messages| Delete messages after consuming them| 
boolean| `true`| 
+| autoCreateQueue| Autocreate Queue| Setting the autocreation of the SQS 
queue.| boolean| `false`| 
+| deleteAfterRead| Auto-delete Messages| Delete messages after consuming them| 
boolean| `true`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/azure-eventhubs-sink.adoc 
b/docs/modules/ROOT/pages/azure-eventhubs-sink.adoc
index 78e47ff..3afd386 100644
--- a/docs/modules/ROOT/pages/azure-eventhubs-sink.adoc
+++ b/docs/modules/ROOT/pages/azure-eventhubs-sink.adoc
@@ -17,10 +17,10 @@ The following table summarizes the configuration options 
available for the `azur
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *eventhubName {empty}* *| Eventhubs name| The eventhub name| string| | 
+| *eventhubName {empty}* *| Eventhubs Name| The eventhub name| string| | 
 | *namespaceName {empty}* *| Eventhubs Namespace| The eventhubs namespace| 
string| | 
-| *sharedAccessKey {empty}* *| Share access key| The key for EventHubs SAS key 
name| string| | 
-| *sharedAccessName {empty}* *| Share access name| EventHubs SAS key name| 
string| | 
+| *sharedAccessKey {empty}* *| Share Access Key| The key for EventHubs SAS key 
name| string| | 
+| *sharedAccessName {empty}* *| Share Access Name| EventHubs SAS key name| 
string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -52,10 +52,10 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: azure-eventhubs-sink
     properties:
-      eventhubName: "The Eventhubs name"
+      eventhubName: "The Eventhubs Name"
       namespaceName: "The Eventhubs Namespace"
-      sharedAccessKey: "The Share access key"
-      sharedAccessName: "The Share access name"
+      sharedAccessKey: "The Share Access Key"
+      sharedAccessName: "The Share Access Name"
 
 ----
 
diff --git a/docs/modules/ROOT/pages/azure-eventhubs-source.adoc 
b/docs/modules/ROOT/pages/azure-eventhubs-source.adoc
index 9e7acd0..1a1af7f 100644
--- a/docs/modules/ROOT/pages/azure-eventhubs-source.adoc
+++ b/docs/modules/ROOT/pages/azure-eventhubs-source.adoc
@@ -11,13 +11,13 @@ The following table summarizes the configuration options 
available for the `azur
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *blobAccessKey {empty}* *| Azure Storage Blob access key| The key for Azure 
Storage Blob service associated with the Blob account name| string| | 
-| *blobAccountName {empty}* *| Azure Storage Blob account name| The name of 
the storage blob account to be use| string| | 
-| *blobContainerName {empty}* *| Azure Storage Blob container name| The name 
of the storage blob container to be use| string| | 
-| *eventhubName {empty}* *| Eventhubs name| The eventhub name| string| | 
+| *blobAccessKey {empty}* *| Azure Storage Blob Access Key| The key for Azure 
Storage Blob service associated with the Blob account name| string| | 
+| *blobAccountName {empty}* *| Azure Storage Blob Account Name| The name of 
the storage blob account to be use| string| | 
+| *blobContainerName {empty}* *| Azure Storage Blob Container Name| The name 
of the storage blob container to be use| string| | 
+| *eventhubName {empty}* *| Eventhubs Name| The eventhub name| string| | 
 | *namespaceName {empty}* *| Eventhubs Namespace| The eventhubs namespace| 
string| | 
-| *sharedAccessKey {empty}* *| Share access key| The key for EventHubs SAS key 
name| string| | 
-| *sharedAccessName {empty}* *| Share access name| EventHubs SAS key name| 
string| | 
+| *sharedAccessKey {empty}* *| Share Access Key| The key for EventHubs SAS key 
name| string| | 
+| *sharedAccessName {empty}* *| Share Access Name| EventHubs SAS key name| 
string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -44,13 +44,13 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: azure-eventhubs-source
     properties:
-      blobAccessKey: "The Azure Storage Blob access key"
-      blobAccountName: "The Azure Storage Blob account name"
-      blobContainerName: "The Azure Storage Blob container name"
-      eventhubName: "The Eventhubs name"
+      blobAccessKey: "The Azure Storage Blob Access Key"
+      blobAccountName: "The Azure Storage Blob Account Name"
+      blobContainerName: "The Azure Storage Blob Container Name"
+      eventhubName: "The Eventhubs Name"
       namespaceName: "The Eventhubs Namespace"
-      sharedAccessKey: "The Share access key"
-      sharedAccessName: "The Share access name"
+      sharedAccessKey: "The Share Access Key"
+      sharedAccessName: "The Share Access Name"
   sink:
     ref:
       kind: InMemoryChannel
diff --git a/docs/modules/ROOT/pages/azure-storage-blob-source.adoc 
b/docs/modules/ROOT/pages/azure-storage-blob-source.adoc
index 703d9a7..edb8450 100644
--- a/docs/modules/ROOT/pages/azure-storage-blob-source.adoc
+++ b/docs/modules/ROOT/pages/azure-storage-blob-source.adoc
@@ -14,7 +14,7 @@ The following table summarizes the configuration options 
available for the `azur
 | *accessKey {empty}* *| Access Key| The Azure Storage Blob access Key.| 
string| | 
 | *accountName {empty}* *| Account Name| The Azure Storage Blob account name.| 
string| | 
 | *containerName {empty}* *| Container Name| The Azure Storage Blob container 
name.| string| | 
-| *period {empty}* *| Period between polls| The interval between fetches to 
the Azure Storage Container in milliseconds| integer| `10000`| 
+| *period {empty}* *| Period between Polls| The interval between fetches to 
the Azure Storage Container in milliseconds| integer| `10000`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/bitcoin-source.adoc 
b/docs/modules/ROOT/pages/bitcoin-source.adoc
index 9130b62..6c52ca1 100644
--- a/docs/modules/ROOT/pages/bitcoin-source.adoc
+++ b/docs/modules/ROOT/pages/bitcoin-source.adoc
@@ -11,7 +11,7 @@ The following table summarizes the configuration options 
available for the `bitc
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| period| Period between updates| The interval between updates in 
milliseconds| integer| `10000`| 
+| period| Period between Updates| The interval between updates in 
milliseconds| integer| `10000`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/cassandra-sink.adoc 
b/docs/modules/ROOT/pages/cassandra-sink.adoc
index bfd5c03..5863e92 100644
--- a/docs/modules/ROOT/pages/cassandra-sink.adoc
+++ b/docs/modules/ROOT/pages/cassandra-sink.adoc
@@ -17,9 +17,9 @@ The following table summarizes the configuration options 
available for the `cass
 | *keyspace {empty}* *| Keyspace| Keyspace to use| string| | `"customers"`
 | *password {empty}* *| Password| The password to use for accessing a secured 
Cassandra Cluster| string| | 
 | *port {empty}* *| Port| Port number of cassandra server(s)| string| | `9042`
+| *preparedStatement {empty}* *| Prepared Statement| The Prepared statement to 
execute against the Cassandra cluster table| string| | 
 | *username {empty}* *| Username| The username to use for accessing a secured 
Cassandra Cluster| string| | 
 | consistencyLevel| Consistency Level| Consistency level to use. The value can 
be one of ANY, ONE, TWO, THREE, QUORUM, ALL, LOCAL_QUORUM, EACH_QUORUM, SERIAL, 
LOCAL_SERIAL, LOCAL_ONE| string| `"ANY"`| 
-| preparedStatement| The Prepared statement| The Prepared statement to execute 
against the Cassandra cluster table| string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -55,6 +55,7 @@ spec:
       keyspace: "customers"
       password: "The Password"
       port: 9042
+      preparedStatement: "The Prepared Statement"
       username: "The Username"
 
 ----
diff --git a/docs/modules/ROOT/pages/dropbox-sink.adoc 
b/docs/modules/ROOT/pages/dropbox-sink.adoc
index b71a5b7..24f6d0a 100644
--- a/docs/modules/ROOT/pages/dropbox-sink.adoc
+++ b/docs/modules/ROOT/pages/dropbox-sink.adoc
@@ -18,8 +18,8 @@ The following table summarizes the configuration options 
available for the `drop
 |===
 | Property| Name| Description| Type| Default| Example
 | *accessToken {empty}* *| Dropbox Access Token| The access Token to use to 
access Dropbox| string| | 
-| *clientIdentifier {empty}* *| The client identifier| Dropbox App client 
Identifier| string| | 
-| *remotePath {empty}* *| Remote path| Original file or folder to work with| 
string| | 
+| *clientIdentifier {empty}* *| Client Identifier| Dropbox App client 
Identifier| string| | 
+| *remotePath {empty}* *| Remote Path| Original file or folder to work with| 
string| | 
 | *uploadMode {empty}* *| Upload Mode| Which mode to upload. in case of add 
the new file will be renamed if a file with the same name already exists on 
dropbox. in case of force if a file with the same name already exists on 
dropbox, this will be overwritten. The value can be one of add, force.| string| 
`"add"`| 
 |===
 
@@ -53,8 +53,8 @@ spec:
       name: dropbox-sink
     properties:
       accessToken: "The Dropbox Access Token"
-      clientIdentifier: "The The client identifier"
-      remotePath: "The Remote path"
+      clientIdentifier: "The Client Identifier"
+      remotePath: "The Remote Path"
 
 ----
 
diff --git a/docs/modules/ROOT/pages/dropbox-source.adoc 
b/docs/modules/ROOT/pages/dropbox-source.adoc
index 10601a6..695faba 100644
--- a/docs/modules/ROOT/pages/dropbox-source.adoc
+++ b/docs/modules/ROOT/pages/dropbox-source.adoc
@@ -12,10 +12,10 @@ The following table summarizes the configuration options 
available for the `drop
 |===
 | Property| Name| Description| Type| Default| Example
 | *accessToken {empty}* *| Dropbox Access Token| The access Token to use to 
access Dropbox| string| | 
-| *clientIdentifier {empty}* *| The client identifier| Dropbox App client 
Identifier| string| | 
-| *period {empty}* *| Period between polls| The interval between fetches to 
the Dropbox remote path in milliseconds| integer| `10000`| 
-| *query {empty}* *| Querys| A space-separated list of sub-strings to search 
for. A file matches only if it contains all the sub-strings. If this option is 
not set, all files will be matched.| string| | 
-| *remotePath {empty}* *| Remote path| Original file or folder to work with| 
string| | 
+| *clientIdentifier {empty}* *| Client Identifier| Dropbox App client 
Identifier| string| | 
+| *period {empty}* *| Period between Polls| The interval between fetches to 
the Dropbox remote path in milliseconds| integer| `10000`| 
+| *query {empty}* *| Queries| A space-separated list of sub-strings to search 
for. A file matches only if it contains all the sub-strings. If this option is 
not set, all files will be matched.| string| | 
+| *remotePath {empty}* *| Remote Path| Original file or folder to work with| 
string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -43,9 +43,9 @@ spec:
       name: dropbox-source
     properties:
       accessToken: "The Dropbox Access Token"
-      clientIdentifier: "The The client identifier"
-      query: "The Querys"
-      remotePath: "The Remote path"
+      clientIdentifier: "The Client Identifier"
+      query: "The Queries"
+      remotePath: "The Remote Path"
   sink:
     ref:
       kind: InMemoryChannel
diff --git a/docs/modules/ROOT/pages/earthquake-source.adoc 
b/docs/modules/ROOT/pages/earthquake-source.adoc
index b664673..e3a023e 100644
--- a/docs/modules/ROOT/pages/earthquake-source.adoc
+++ b/docs/modules/ROOT/pages/earthquake-source.adoc
@@ -11,8 +11,8 @@ The following table summarizes the configuration options 
available for the `eart
 [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`| 
+| 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.
diff --git a/docs/modules/ROOT/pages/elasticsearch-search-source.adoc 
b/docs/modules/ROOT/pages/elasticsearch-search-source.adoc
index 5203d56..16524c4 100644
--- a/docs/modules/ROOT/pages/elasticsearch-search-source.adoc
+++ b/docs/modules/ROOT/pages/elasticsearch-search-source.adoc
@@ -11,8 +11,8 @@ The following table summarizes the configuration options 
available for the `elas
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *clusterName {empty}* *| ElasticSearch cluster name| Name of the cluster.| 
string| | 
-| *hostAddresses {empty}* *| Host addresses| Comma separated list with ip:port 
formatted remote transport addresses to use.| string| | 
+| *clusterName {empty}* *| ElasticSearch Cluster Name| Name of the cluster.| 
string| | 
+| *hostAddresses {empty}* *| Host Addresses| Comma separated list with ip:port 
formatted remote transport addresses to use.| string| | 
 | *indexName {empty}* *| Index in ElasticSearch| The name of the index to act 
against.| string| | 
 | *query {empty}* *| Query| The query we want to use to search on 
ElasticSearch.| string| | 
 | enableSSL| Enable SSL| Do we want to connect using SSL?| boolean| `true`| 
@@ -45,8 +45,8 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: elasticsearch-search-source
     properties:
-      clusterName: "The ElasticSearch cluster name"
-      hostAddresses: "The Host addresses"
+      clusterName: "The ElasticSearch Cluster Name"
+      hostAddresses: "The Host Addresses"
       indexName: "The Index in ElasticSearch"
       query: "The Query"
   sink:
diff --git a/docs/modules/ROOT/pages/exec-sink.adoc 
b/docs/modules/ROOT/pages/exec-sink.adoc
index 0b7defa..0199360 100644
--- a/docs/modules/ROOT/pages/exec-sink.adoc
+++ b/docs/modules/ROOT/pages/exec-sink.adoc
@@ -7,7 +7,7 @@ Execute system commands
 
 The Kamelet expects the following headers to be set:
 
-- `args/ `ce-args`: as the args to be set on the executable.
+- `args` / `ce-args`: as the args to be set on the executable.
 
 If the header won't be set the executable will be run without arguments.
 
@@ -17,7 +17,7 @@ The following table summarizes the configuration options 
available for the `exec
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *executable {empty}* *| Executable command| The command to execute| string| 
| 
+| *executable {empty}* *| Executable Command| The command to execute| string| 
| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -49,7 +49,7 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: exec-sink
     properties:
-      executable: "The Executable command"
+      executable: "The Executable Command"
 
 ----
 
diff --git a/docs/modules/ROOT/pages/fhir-source.adoc 
b/docs/modules/ROOT/pages/fhir-source.adoc
index dee17a4..b410db4 100644
--- a/docs/modules/ROOT/pages/fhir-source.adoc
+++ b/docs/modules/ROOT/pages/fhir-source.adoc
@@ -14,8 +14,8 @@ The following table summarizes the configuration options 
available for the `fhir
 | *password {empty}* *| Password| The password to access the Fhir server| 
string| | 
 | *serverUrl {empty}* *| Server URL| The Fhir server url| string| | 
 | *username {empty}* *| Username| The username to access the Fhir server| 
string| | 
-| encoding| encoding| Encoding to use for all request. Possible values are 
JSON and XML| string| `"JSON"`| 
-| fhirVersion| Fhir version| The FHIR Version to use. There are 6 enums and 
the value can be one of DSTU2, DSTU2_HL7ORG, DSTU2_1, DSTU3, R4, R5| string| 
`"R4"`| 
+| encoding| Encoding| Encoding to use for all request. Possible values are 
JSON and XML| string| `"JSON"`| 
+| fhirVersion| Fhir Version| The FHIR Version to use. There are 6 enums and 
the value can be one of DSTU2, DSTU2_HL7ORG, DSTU2_1, DSTU3, R4, R5| string| 
`"R4"`| 
 | prettyPrint| Json Pretty Print| Define if the Json must be pretty print or 
not| boolean| `true`| 
 | url| URL| The Fhir resource type url| string| `"/Patient"`| 
 |===
diff --git a/docs/modules/ROOT/pages/file-watch-source.adoc 
b/docs/modules/ROOT/pages/file-watch-source.adoc
index 4cc21b9..d379b4a 100644
--- a/docs/modules/ROOT/pages/file-watch-source.adoc
+++ b/docs/modules/ROOT/pages/file-watch-source.adoc
@@ -11,8 +11,8 @@ The following table summarizes the configuration options 
available for the `file
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *events {empty}* *| The events| The type of events to consume| boolean| 
`"CREATE,MODIFY,DELETE"`| 
-| *path {empty}* *| The path| Path of file or folder to watch| string| | 
+| *events {empty}* *| Events| The type of events to consume| boolean| 
`"CREATE,MODIFY,DELETE"`| 
+| *path {empty}* *| Path to Watch| Path of file or folder to watch| string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -39,7 +39,7 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: file-watch-source
     properties:
-      path: "The The path"
+      path: "The Path to Watch"
   sink:
     ref:
       kind: InMemoryChannel
diff --git a/docs/modules/ROOT/pages/github-source.adoc 
b/docs/modules/ROOT/pages/github-source.adoc
index 8ed2d86..a1670d6 100644
--- a/docs/modules/ROOT/pages/github-source.adoc
+++ b/docs/modules/ROOT/pages/github-source.adoc
@@ -14,7 +14,7 @@ The following table summarizes the configuration options 
available for the `gith
 | *oauthToken {empty}* *| OAuth Token| Oauth token| string| | 
 | *repoName {empty}* *| Repository Name| The Github Repository name| string| | 
 | *repoOwner {empty}* *| Repository Owner| The repository owner| string| | 
-| *type {empty}* *| Event type| The type of event to consume. One of event, 
pullRequest, pullRequestComment or tag| string| `"event"`| 
+| *type {empty}* *| Event Type| The type of event to consume. One of event, 
pullRequest, pullRequestComment or tag| string| `"event"`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/google-mail-source.adoc 
b/docs/modules/ROOT/pages/google-mail-source.adoc
index 15a7bf1..71c6f8b 100644
--- a/docs/modules/ROOT/pages/google-mail-source.adoc
+++ b/docs/modules/ROOT/pages/google-mail-source.adoc
@@ -13,14 +13,14 @@ The following table summarizes the configuration options 
available for the `goog
 | Property| Name| Description| Type| Default| Example
 | *accessToken {empty}* *| Access Token| OAuth 2 access token for google mail 
application. This typically expires after an hour so refreshToken is 
recommended for long term usage.| string| | 
 | *applicationName {empty}* *| Application name| Google Mail application name| 
string| | 
-| *clientId {empty}* *| Client Id| Client ID of the gmail application| string| 
| 
+| *clientId {empty}* *| Client ID| Client ID of the gmail application| string| 
| 
 | *clientSecret {empty}* *| Client Secret| Client Secret of the gmail 
application| string| | 
 | *index {empty}* *| Index| An index for the google mail endpoint| string| | 
 | *refreshToken {empty}* *| Refresh Token| OAuth 2 refresh token for google 
mail application. Using this, the Google Calendar component can obtain a new 
accessToken whenever the current one expires - a necessity if the application 
is long-lived.| string| | 
 | delay| Delay| Milliseconds before the next poll| integer| `500`| 
-| labels| Gmail labels| Comma separated list of labels to take into account| 
string| | `"inbox"`
-| markAsRead| Mark as read| Mark the message as read once it has been 
consumed| boolean| `true`| 
-| query| Gmail query| The query to execute on gmail box| string| 
`"is:unread"`| `"is:unread -category:(promotions OR social)"`
+| labels| Gmail Labels| Comma separated list of labels to take into account| 
string| | `"inbox"`
+| markAsRead| Mark as Read| Mark the message as read once it has been 
consumed| boolean| `true`| 
+| query| Gmail Query| The query to execute on gmail box| string| 
`"is:unread"`| `"is:unread -category:(promotions OR social)"`
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -49,7 +49,7 @@ spec:
     properties:
       accessToken: "The Access Token"
       applicationName: "The Application name"
-      clientId: "The Client Id"
+      clientId: "The Client ID"
       clientSecret: "The Client Secret"
       index: "The Index"
       refreshToken: "The Refresh Token"
diff --git a/docs/modules/ROOT/pages/http-source.adoc 
b/docs/modules/ROOT/pages/http-source.adoc
index 721a456..eaa1936 100644
--- a/docs/modules/ROOT/pages/http-source.adoc
+++ b/docs/modules/ROOT/pages/http-source.adoc
@@ -12,8 +12,8 @@ The following table summarizes the configuration options 
available for the `http
 |===
 | Property| Name| Description| Type| Default| Example
 | *url {empty}* *| URL| The URL to fetch for data| string| | 
`"https://gist.githubusercontent.com/nicolaferraro/e3c72ace3c751f9f88273896611ce5fe/raw/3b6f54060bacb56b6719b7386a4645cb59ad6cc1/quote.json"`
-| contentType| Content type| The content type accepted for the resource| 
string| `"application/json"`| 
-| period| Period between updates| The interval between fetches in 
milliseconds| integer| `10000`| 
+| contentType| Content Type| The content type accepted for the resource| 
string| `"application/json"`| 
+| period| Period between Updates| The interval between fetches in 
milliseconds| integer| `10000`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/kafka-source.adoc 
b/docs/modules/ROOT/pages/kafka-source.adoc
index 5095592..e8e2295 100644
--- a/docs/modules/ROOT/pages/kafka-source.adoc
+++ b/docs/modules/ROOT/pages/kafka-source.adoc
@@ -12,7 +12,7 @@ The following table summarizes the configuration options 
available for the `kafk
 |===
 | Property| Name| Description| Type| Default| Example
 | *brokers {empty}* *| Brokers| Comma separated list of Kafka Broker URLs| 
string| | 
-| *topic {empty}* *| Topic names| Comma separated list of Kafka topic names| 
string| | 
+| *topic {empty}* *| Topic Names| Comma separated list of Kafka topic names| 
string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -40,7 +40,7 @@ spec:
       name: kafka-source
     properties:
       brokers: "The Brokers"
-      topic: "The Topic names"
+      topic: "The Topic Names"
   sink:
     ref:
       kind: InMemoryChannel
diff --git a/docs/modules/ROOT/pages/minio-sink.adoc 
b/docs/modules/ROOT/pages/minio-sink.adoc
index 1596986..a554f90 100644
--- a/docs/modules/ROOT/pages/minio-sink.adoc
+++ b/docs/modules/ROOT/pages/minio-sink.adoc
@@ -21,7 +21,7 @@ The following table summarizes the configuration options 
available for the `mini
 | *bucketName {empty}* *| Bucket Name| The Minio Bucket name| string| | 
 | *endpoint {empty}* *| Endpoint| The Minio Endpoint, it can be an URL, domain 
name, IPv4 address or IPv6 address.| string| | `"http://localhost:9000"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from Minio| 
string| | 
-| autoCreateBucket| Autocreate bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
+| autoCreateBucket| Autocreate Bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/minio-source.adoc 
b/docs/modules/ROOT/pages/minio-source.adoc
index f0a2ff2..8f45e81 100644
--- a/docs/modules/ROOT/pages/minio-source.adoc
+++ b/docs/modules/ROOT/pages/minio-source.adoc
@@ -15,8 +15,8 @@ The following table summarizes the configuration options 
available for the `mini
 | *bucketName {empty}* *| Bucket Name| The Minio Bucket name| string| | 
 | *endpoint {empty}* *| Endpoint| The Minio Endpoint, it can be an URL, domain 
name, IPv4 address or IPv6 address.| string| | `"http://localhost:9000"`
 | *secretKey {empty}* *| Secret Key| The secret key obtained from Minio| 
string| | 
-| autoCreateBucket| Autocreate bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
-| deleteAfterRead| Auto-delete objects| Delete objects after consuming them| 
boolean| `true`| 
+| autoCreateBucket| Autocreate Bucket| Setting the autocreation of the S3 
bucket bucketName.| boolean| `false`| 
+| deleteAfterRead| Auto-delete Objects| Delete objects after consuming them| 
boolean| `true`| 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
diff --git a/docs/modules/ROOT/pages/nats-source.adoc 
b/docs/modules/ROOT/pages/nats-source.adoc
index cd6afec..005c21b 100644
--- a/docs/modules/ROOT/pages/nats-source.adoc
+++ b/docs/modules/ROOT/pages/nats-source.adoc
@@ -11,8 +11,8 @@ The following table summarizes the configuration options 
available for the `nats
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *topic {empty}* *| topic| NATS Topic name| string| | 
-| brokers| servers| Comma separated list of NATS Servers| string| | 
+| *servers {empty}* *| Servers| Comma separated list of NATS Servers| string| 
| 
+| *topic {empty}* *| Topic| NATS Topic name| string| | 
 |===
 
 NOTE: Fields marked with ({empty}*) are mandatory.
@@ -39,7 +39,8 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: nats-source
     properties:
-      topic: "The topic"
+      servers: "The Servers"
+      topic: "The Topic"
   sink:
     ref:
       kind: InMemoryChannel
diff --git a/docs/modules/ROOT/pages/ssh-source.adoc 
b/docs/modules/ROOT/pages/ssh-source.adoc
index 2424690..73e7a9f 100644
--- a/docs/modules/ROOT/pages/ssh-source.adoc
+++ b/docs/modules/ROOT/pages/ssh-source.adoc
@@ -11,11 +11,11 @@ The following table summarizes the configuration options 
available for the `ssh-
 [width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
 |===
 | Property| Name| Description| Type| Default| Example
-| *host {empty}* *| SSH Host| The SSH Host| string| | 
-| *password {empty}* *| The SSH password| The SSH password to use| string| | 
-| *pollCommand {empty}* *| The Poll command| The command to run while polling 
the SSH session| string| | `"date"`
-| *port {empty}* *| SSH Port| The SSH Port| string| `22`| 
-| *username {empty}* *| The SSH username| The SSH username to use| string| | 
+| *host {empty}* *| Host| The SSH Host| string| | 
+| *password {empty}* *| Password| The SSH password to use| string| | 
+| *pollCommand {empty}* *| Poll Command| The command to run while polling the 
SSH session| string| | `"date"`
+| *port {empty}* *| Port| The SSH Port| string| `22`| 
+| *username {empty}* *| Username| The SSH username to use| string| | 
 | delay| Delay| Milliseconds before the next poll| integer| `500`| 
 |===
 
@@ -43,10 +43,10 @@ spec:
       apiVersion: camel.apache.org/v1alpha1
       name: ssh-source
     properties:
-      host: "The SSH Host"
-      password: "The The SSH password"
+      host: "The Host"
+      password: "The Password"
       pollCommand: "date"
-      username: "The The SSH username"
+      username: "The Username"
   sink:
     ref:
       kind: InMemoryChannel
diff --git a/dropbox-sink.kamelet.yaml b/dropbox-sink.kamelet.yaml
index ed060c1..bb072c9 100644
--- a/dropbox-sink.kamelet.yaml
+++ b/dropbox-sink.kamelet.yaml
@@ -31,11 +31,11 @@ spec:
         x-descriptors:
         - urn:alm:descriptor:com.tectonic.ui:password
       clientIdentifier:
-        title: The client identifier
+        title: Client Identifier
         description: Dropbox App client Identifier
         type: string
       remotePath:
-        title: Remote path
+        title: Remote Path
         description: Original file or folder to work with
         type: string
       uploadMode:
diff --git a/dropbox-source.kamelet.yaml b/dropbox-source.kamelet.yaml
index 5a1a3d4..19b1732 100644
--- a/dropbox-source.kamelet.yaml
+++ b/dropbox-source.kamelet.yaml
@@ -20,7 +20,7 @@ spec:
       - query
     properties:
       period:
-        title: Period between polls
+        title: Period between Polls
         description: The interval between fetches to the Dropbox remote path 
in milliseconds
         type: integer
         default: 10000
@@ -31,15 +31,15 @@ spec:
         x-descriptors:
         - urn:alm:descriptor:com.tectonic.ui:password
       clientIdentifier:
-        title: The client identifier
+        title: Client Identifier
         description: Dropbox App client Identifier
         type: string
       remotePath:
-        title: Remote path
+        title: Remote Path
         description: Original file or folder to work with
         type: string
       query:
-        title: Querys
+        title: Queries
         description: A space-separated list of sub-strings to search for. A 
file matches only if it contains all the sub-strings. If this option is not 
set, all files will be matched.
         type: string
   flow:
diff --git a/earthquake-source.kamelet.yaml b/earthquake-source.kamelet.yaml
index 1954140..8afb6e6 100755
--- a/earthquake-source.kamelet.yaml
+++ b/earthquake-source.kamelet.yaml
@@ -16,12 +16,12 @@ spec:
       Get data about current earthquake events happening in the world using 
the USGS API
     properties:
       period:
-        title: Period between polls
+        title: Period between Polls
         description: The interval between fetches to the earthquake API in 
milliseconds
         type: integer
         default: 60000
       lookAhead:
-        title: Look-ahead minutes
+        title: Look-ahead Minutes
         description: The amount of minutes to look ahead when starting the 
integration afresh
         type: integer
         default: 120
diff --git a/elasticsearch-search-source.kamelet.yaml 
b/elasticsearch-search-source.kamelet.yaml
index 83953bd..3aa8ce3 100755
--- a/elasticsearch-search-source.kamelet.yaml
+++ b/elasticsearch-search-source.kamelet.yaml
@@ -51,7 +51,7 @@ spec:
         type: boolean
         default: true
       hostAddresses:
-        title: Host addresses
+        title: Host Addresses
         description: Comma separated list with ip:port formatted remote 
transport addresses to use.
         type: string
       indexName:
@@ -59,7 +59,7 @@ spec:
         description: The name of the index to act against.
         type: string
       clusterName:
-        title: ElasticSearch cluster name
+        title: ElasticSearch Cluster Name
         description: Name of the cluster.
         type: string
   dependencies:
diff --git a/exec-sink.kamelet.yaml b/exec-sink.kamelet.yaml
index 78bbadf..ed89525 100644
--- a/exec-sink.kamelet.yaml
+++ b/exec-sink.kamelet.yaml
@@ -15,15 +15,14 @@ spec:
 
       The Kamelet expects the following headers to be set:
 
-      - `args/ `ce-args`: as the args to be set on the executable.
+      - `args` / `ce-args`: as the args to be set on the executable.
 
       If the header won't be set the executable will be run without arguments.
     required:
-      - executable
-      - args
+    - executable
     properties:
       executable:
-        title: Executable command
+        title: Executable Command
         description: The command to execute
         type: string
   flow:
diff --git a/fhir-source.kamelet.yaml b/fhir-source.kamelet.yaml
index 5d48f2f..f6b7cb8 100644
--- a/fhir-source.kamelet.yaml
+++ b/fhir-source.kamelet.yaml
@@ -27,12 +27,12 @@ spec:
         type: string
         default: "/Patient"
       encoding:
-        title: encoding
+        title: Encoding
         description: Encoding to use for all request. Possible values are JSON 
and XML
         type: string
         default: "JSON"
       fhirVersion:
-        title: Fhir version
+        title: Fhir Version
         description: The FHIR Version to use. There are 6 enums and the value 
can be one of DSTU2, DSTU2_HL7ORG, DSTU2_1, DSTU3, R4, R5
         type: string
         default: "R4"
diff --git a/file-watch-source.kamelet.yaml b/file-watch-source.kamelet.yaml
index 415a7d4..c59a51a 100644
--- a/file-watch-source.kamelet.yaml
+++ b/file-watch-source.kamelet.yaml
@@ -17,11 +17,11 @@ spec:
       - events
     properties:
       path:
-        title: The path
+        title: Path to Watch
         description: Path of file or folder to watch
         type: string
       events:
-        title: The events
+        title: Events
         description: The type of events to consume
         type: boolean
         default: "CREATE,MODIFY,DELETE"
diff --git a/github-source.kamelet.yaml b/github-source.kamelet.yaml
index 0adf74c..e63ac56 100644
--- a/github-source.kamelet.yaml
+++ b/github-source.kamelet.yaml
@@ -33,7 +33,7 @@ spec:
         x-descriptors:
         - urn:alm:descriptor:com.tectonic.ui:password
       type:
-        title: Event type
+        title: Event Type
         description: The type of event to consume. One of event, pullRequest, 
pullRequestComment or tag
         type: string
         default: event
diff --git a/google-mail-source.kamelet.yaml b/google-mail-source.kamelet.yaml
index ed4461c..c1abb1a 100644
--- a/google-mail-source.kamelet.yaml
+++ b/google-mail-source.kamelet.yaml
@@ -25,7 +25,7 @@ spec:
         description: An index for the google mail endpoint
         type: string
       clientId:
-        title: Client Id
+        title: Client ID
         description: Client ID of the gmail application
         type: string
         x-descriptors:
@@ -58,19 +58,19 @@ spec:
         description: Google Mail application name
         type: string
       markAsRead:
-        title: Mark as read
+        title: Mark as Read
         description: Mark the message as read once it has been consumed
         type: boolean
         x-descriptors:
         - 'urn:alm:descriptor:com.tectonic.ui:checkbox'
         default: true
       labels:
-        title: Gmail labels
+        title: Gmail Labels
         description: Comma separated list of labels to take into account
         type: string
         example: "inbox"
       query:
-        title: Gmail query
+        title: Gmail Query
         description: The query to execute on gmail box
         type: string
         example: "is:unread -category:(promotions OR social)"
diff --git a/http-source.kamelet.yaml b/http-source.kamelet.yaml
index 39da2db..bcdc2cf 100644
--- a/http-source.kamelet.yaml
+++ b/http-source.kamelet.yaml
@@ -17,12 +17,12 @@ spec:
     - url
     properties:
       period:
-        title: Period between updates
+        title: Period between Updates
         description: The interval between fetches in milliseconds
         type: integer
         default: 10000
       contentType:
-        title: Content type
+        title: Content Type
         description: The content type accepted for the resource
         type: string
         default: "application/json"
diff --git a/kafka-source.kamelet.yaml b/kafka-source.kamelet.yaml
index 3dd616e..670f95a 100644
--- a/kafka-source.kamelet.yaml
+++ b/kafka-source.kamelet.yaml
@@ -17,7 +17,7 @@ spec:
       - brokers
     properties:
       topic:
-        title: Topic names
+        title: Topic Names
         description: Comma separated list of Kafka topic names
         type: string
       brokers:
diff --git a/minio-sink.kamelet.yaml b/minio-sink.kamelet.yaml
index 78e894c..0dc94d0 100644
--- a/minio-sink.kamelet.yaml
+++ b/minio-sink.kamelet.yaml
@@ -46,7 +46,7 @@ spec:
         type: string
         example: http://localhost:9000
       autoCreateBucket:
-        title: Autocreate bucket
+        title: Autocreate Bucket
         description: Setting the autocreation of the S3 bucket bucketName. 
         type: boolean
         x-descriptors:
diff --git a/minio-source.kamelet.yaml b/minio-source.kamelet.yaml
index da7e82a..f79c9bf 100644
--- a/minio-source.kamelet.yaml
+++ b/minio-source.kamelet.yaml
@@ -23,7 +23,7 @@ spec:
         description: The Minio Bucket name
         type: string
       deleteAfterRead:
-        title: Auto-delete objects
+        title: Auto-delete Objects
         description: Delete objects after consuming them
         type: boolean
         x-descriptors:
@@ -47,7 +47,7 @@ spec:
         type: string
         example: http://localhost:9000
       autoCreateBucket:
-        title: Autocreate bucket
+        title: Autocreate Bucket
         description: Setting the autocreation of the S3 bucket bucketName. 
         type: boolean
         x-descriptors:
diff --git a/nats-source.kamelet.yaml b/nats-source.kamelet.yaml
index ed5ee90..8ceee77 100644
--- a/nats-source.kamelet.yaml
+++ b/nats-source.kamelet.yaml
@@ -17,11 +17,11 @@ spec:
       - servers
     properties:
       topic:
-        title: topic
+        title: Topic
         description: NATS Topic name
         type: string
-      brokers:
-        title: servers
+      servers:
+        title: Servers
         description: Comma separated list of NATS Servers
         type: string
   types:
diff --git a/script/generator/README.md b/script/generator/README.md
new file mode 100644
index 0000000..5f3ff78
--- /dev/null
+++ b/script/generator/README.md
@@ -0,0 +1,8 @@
+# Website Generator
+
+To generate the adoc and svg files for the website (you need `go`):
+
+```
+# From the /tools/generator directory
+go run . ../../ ../../docs/modules/ROOT/
+```
diff --git a/docs/generator/generator.go b/script/generator/generator.go
similarity index 100%
rename from docs/generator/generator.go
rename to script/generator/generator.go
diff --git a/script/generator/go.mod b/script/generator/go.mod
new file mode 100644
index 0000000..9833de2
--- /dev/null
+++ b/script/generator/go.mod
@@ -0,0 +1,10 @@
+module github.com/apache/camel-kamelets/docs/generator
+
+go 1.14
+
+require (
+       github.com/apache/camel-k/pkg/apis/camel v1.4.0
+       k8s.io/apimachinery v0.19.8
+       k8s.io/klog v1.0.0 // indirect
+       sigs.k8s.io/structured-merge-diff/v3 v3.0.0 // indirect
+)
diff --git a/docs/generator/go.sum b/script/generator/go.sum
similarity index 52%
rename from docs/generator/go.sum
rename to script/generator/go.sum
index aead593..2576cd7 100644
--- a/docs/generator/go.sum
+++ b/script/generator/go.sum
@@ -1,42 +1,72 @@
+cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod 
h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/PuerkitoBio/purell v1.0.0/go.mod 
h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod 
h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/apache/camel-k/pkg/apis/camel v1.3.1 
h1:8w3oXV1gQbTeazfOGuvYiSy52s3Zx9f3TeFF0pWyJvs=
 github.com/apache/camel-k/pkg/apis/camel v1.3.1/go.mod 
h1:N3N41+jPM447J8CvnzUcIdGZVvMh1dxP31xDSpZDeUk=
+github.com/apache/camel-k/pkg/apis/camel v1.4.0 
h1:iXa6uCVvMUItFejc+7WuLvcRyfQaRYWtg+9pEexgcM8=
+github.com/apache/camel-k/pkg/apis/camel v1.4.0/go.mod 
h1:uv2KugsT0kfLiRJZS15UqQ3gHsvuhmOax9+0Rs9L1wY=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod 
h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod 
h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod 
h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod 
h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/envoyproxy/go-control-plane 
v0.9.1-0.20191026205805-5f8ba28d4473/go.mod 
h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod 
h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod 
h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fsnotify/fsnotify v1.4.7/go.mod 
h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod 
h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod 
h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-logr/logr v0.1.0/go.mod 
h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
+github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY=
+github.com/go-logr/logr v0.2.0/go.mod 
h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod 
h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
 github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod 
h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
 github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod 
h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
 github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod 
h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
 github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 github.com/gogo/protobuf v1.3.1/go.mod 
h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod 
h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod 
h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod 
h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod 
h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod 
h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod 
h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod 
h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/gofuzz v1.0.0/go.mod 
h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod 
h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.1.1/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod 
h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.1.0/go.mod 
h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
+github.com/googleapis/gnostic v0.4.1/go.mod 
h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 github.com/hashicorp/golang-lru v0.5.1/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.8 
h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
 github.com/json-iterator/go v1.1.8/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10 
h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
+github.com/json-iterator/go v1.1.10/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/kisielk/errcheck v1.2.0/go.mod 
h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/gotool v1.0.0/go.mod 
h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod 
h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod 
h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -54,31 +84,80 @@ github.com/onsi/ginkgo v1.11.0/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod 
h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod 
h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/pkg/errors v0.8.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod 
h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod 
h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 
h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod 
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b 
h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.27.0/go.mod 
h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod 
h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod 
h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod 
h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod 
h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
@@ -87,18 +166,31 @@ gopkg.in/yaml.v2 v2.2.1/go.mod 
h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 k8s.io/api v0.18.9 h1:7VDtivqwbvLOf8hmXSd/PDSSbpCBq49MELg84EYBYiQ=
 k8s.io/api v0.18.9/go.mod h1:9u/h6sUh6FxfErv7QqetX1EB3yBMIYOBXzdcf0Gf0rc=
+k8s.io/api v0.19.8 h1:U50vBUCb5kc2J483mnITLKfdyoITaC7PnaOJwT7oRRM=
+k8s.io/api v0.19.8/go.mod h1:9TMGoKoidvicOK0LSqj+Mj98pugQycbViPKyZHqutBc=
 k8s.io/apimachinery v0.18.9 h1:3ZABKQx3F3xPWlsGhCfUl8W+JXRRblV6Wo2A3zn0pvY=
 k8s.io/apimachinery v0.18.9/go.mod 
h1:PF5taHbXgTEJLU+xMypMmYTXTWPJ5LaW8bfsisxnEXk=
+k8s.io/apimachinery v0.19.8 h1:MaehcNcx8brsgvMsqspcI0bi22E1np/DACnjf2mhJ5A=
+k8s.io/apimachinery v0.19.8/go.mod 
h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod 
h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod 
h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod 
h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
+k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod 
h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
+k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod 
h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod 
h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0 
h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod 
h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1 
h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod 
h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/script/validator/README.md b/script/validator/README.md
new file mode 100644
index 0000000..5fec61f
--- /dev/null
+++ b/script/validator/README.md
@@ -0,0 +1,8 @@
+# Kamelet Validator
+
+To validate the Kamelets:
+
+```
+# From the /tools/validator directory
+go run . ../../
+```
diff --git a/script/validator/go.mod b/script/validator/go.mod
new file mode 100644
index 0000000..093cb04
--- /dev/null
+++ b/script/validator/go.mod
@@ -0,0 +1,12 @@
+module github.com/apache/camel-kamelets/docs/generator
+
+go 1.14
+
+require (
+       github.com/apache/camel-k/pkg/apis/camel v1.4.0
+       github.com/bbalet/stopwords v1.0.0
+       github.com/pkg/errors v0.9.1
+       k8s.io/apimachinery v0.19.8
+       k8s.io/klog v1.0.0 // indirect
+       sigs.k8s.io/structured-merge-diff/v3 v3.0.0 // indirect
+)
diff --git a/script/validator/go.sum b/script/validator/go.sum
new file mode 100644
index 0000000..286352c
--- /dev/null
+++ b/script/validator/go.sum
@@ -0,0 +1,208 @@
+cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod 
h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/PuerkitoBio/purell v1.0.0/go.mod 
h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod 
h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/apache/camel-k/pkg/apis/camel v1.3.1 
h1:8w3oXV1gQbTeazfOGuvYiSy52s3Zx9f3TeFF0pWyJvs=
+github.com/apache/camel-k/pkg/apis/camel v1.3.1/go.mod 
h1:N3N41+jPM447J8CvnzUcIdGZVvMh1dxP31xDSpZDeUk=
+github.com/apache/camel-k/pkg/apis/camel v1.4.0 
h1:iXa6uCVvMUItFejc+7WuLvcRyfQaRYWtg+9pEexgcM8=
+github.com/apache/camel-k/pkg/apis/camel v1.4.0/go.mod 
h1:uv2KugsT0kfLiRJZS15UqQ3gHsvuhmOax9+0Rs9L1wY=
+github.com/bbalet/stopwords v1.0.0 
h1:0TnGycCtY0zZi4ltKoOGRFIlZHv0WqpoIGUsObjztfo=
+github.com/bbalet/stopwords v1.0.0/go.mod 
h1:sAWrQoDMfqARGIn4s6dp7OW7ISrshUD8IP2q3KoqPjc=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 
h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod 
h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod 
h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod 
h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod 
h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/envoyproxy/go-control-plane 
v0.9.1-0.20191026205805-5f8ba28d4473/go.mod 
h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod 
h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/evanphx/json-patch v4.9.0+incompatible/go.mod 
h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/fsnotify/fsnotify v1.4.7/go.mod 
h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod 
h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod 
h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-logr/logr v0.1.0/go.mod 
h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
+github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY=
+github.com/go-logr/logr v0.2.0/go.mod 
h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod 
h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
+github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod 
h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
+github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod 
h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
+github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod 
h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
+github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
+github.com/gogo/protobuf v1.3.1/go.mod 
h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod 
h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod 
h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod 
h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod 
h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod 
h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod 
h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod 
h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
+github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod 
h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod 
h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.1.1/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod 
h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
+github.com/googleapis/gnostic v0.1.0/go.mod 
h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
+github.com/googleapis/gnostic v0.4.1/go.mod 
h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/hashicorp/golang-lru v0.5.1/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.8 
h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
+github.com/json-iterator/go v1.1.8/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10 
h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
+github.com/json-iterator/go v1.1.10/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/kisielk/errcheck v1.2.0/go.mod 
h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod 
h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod 
h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod 
h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod 
h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd 
h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod 
h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod 
h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 
h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod 
h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod 
h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod 
h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
+github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod 
h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.7.0/go.mod 
h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+github.com/pkg/errors v0.8.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 
h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod 
h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 
h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod 
h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 
h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
+golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod 
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b 
h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.27.0/go.mod 
h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod 
h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod 
h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod 
h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 
h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod 
h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod 
h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+k8s.io/api v0.18.9 h1:7VDtivqwbvLOf8hmXSd/PDSSbpCBq49MELg84EYBYiQ=
+k8s.io/api v0.18.9/go.mod h1:9u/h6sUh6FxfErv7QqetX1EB3yBMIYOBXzdcf0Gf0rc=
+k8s.io/api v0.19.8 h1:U50vBUCb5kc2J483mnITLKfdyoITaC7PnaOJwT7oRRM=
+k8s.io/api v0.19.8/go.mod h1:9TMGoKoidvicOK0LSqj+Mj98pugQycbViPKyZHqutBc=
+k8s.io/apimachinery v0.18.9 h1:3ZABKQx3F3xPWlsGhCfUl8W+JXRRblV6Wo2A3zn0pvY=
+k8s.io/apimachinery v0.18.9/go.mod 
h1:PF5taHbXgTEJLU+xMypMmYTXTWPJ5LaW8bfsisxnEXk=
+k8s.io/apimachinery v0.19.8 h1:MaehcNcx8brsgvMsqspcI0bi22E1np/DACnjf2mhJ5A=
+k8s.io/apimachinery v0.19.8/go.mod 
h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q=
+k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod 
h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod 
h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod 
h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
+k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
+k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
+k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod 
h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
+k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod 
h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
+sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod 
h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+sigs.k8s.io/structured-merge-diff/v3 v3.0.0 
h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
+sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod 
h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1 
h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod 
h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/script/validator/validator.go b/script/validator/validator.go
new file mode 100644
index 0000000..6097385
--- /dev/null
+++ b/script/validator/validator.go
@@ -0,0 +1,239 @@
+package main
+
+import (
+       "fmt"
+       "io/ioutil"
+       "os"
+       "path"
+       "path/filepath"
+       "sort"
+       "strings"
+
+       camel "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/bbalet/stopwords"
+       perrors "github.com/pkg/errors"
+       "k8s.io/apimachinery/pkg/api/equality"
+       "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+       "k8s.io/apimachinery/pkg/runtime"
+       "k8s.io/apimachinery/pkg/runtime/schema"
+       "k8s.io/apimachinery/pkg/runtime/serializer"
+       "k8s.io/apimachinery/pkg/util/json"
+       "k8s.io/apimachinery/pkg/util/yaml"
+)
+
+func main() {
+       if len(os.Args) != 2 {
+               println("usage: validator kamelets-path")
+               os.Exit(1)
+       }
+
+       dir := os.Args[1]
+
+       kamelets := listKamelets(dir)
+
+       errors := verifyFileNames(kamelets)
+       errors = append(errors, verifyKameletType(kamelets)...)
+       errors = append(errors, verifyAnnotations(kamelets)...)
+       errors = append(errors, verifyParameters(kamelets)...)
+       errors = append(errors, verifyInvalidContent(kamelets)...)
+
+       for _, err := range errors {
+               fmt.Printf("ERROR: %v\n", err)
+       }
+       if len(errors) > 0 {
+               os.Exit(1)
+       }
+}
+
+func verifyInvalidContent(kamelets []KameletInfo) (errors []error) {
+       for _, kamelet := range kamelets {
+               ser, err := json.Marshal(&kamelet.Kamelet)
+               if err != nil {
+                       errors = append(errors, perrors.Wrapf(err, "cannot 
marshal kamelet %q", kamelet.Name))
+                       continue
+               }
+               var unstr unstructured.Unstructured
+               err = json.Unmarshal(ser, &unstr)
+               if err != nil {
+                       errors = append(errors, perrors.Wrapf(err, "cannot 
unmarshal kamelet %q", kamelet.Name))
+                       continue
+               }
+
+               file, err := ioutil.ReadFile(kamelet.FileName)
+               if err != nil {
+                       errors = append(errors, perrors.Wrapf(err, "cannot load 
kamelet %q", kamelet.Name))
+                       continue
+               }
+               jsonFile, err := yaml.ToJSON(file)
+               if err != nil {
+                       errors = append(errors, perrors.Wrapf(err, "cannot 
convert kamelet %q to JSON", kamelet.Name))
+                       continue
+               }
+               unstrFile := unstructured.Unstructured{}
+               err = json.Unmarshal(jsonFile, &unstrFile)
+               if err != nil {
+                       errors = append(errors, perrors.Wrapf(err, "cannot 
unmarshal kamelet file %q", kamelet.Name))
+                       continue
+               }
+
+               if !equality.Semantic.DeepDerivative(unstrFile, unstr) {
+                       errors = append(errors, fmt.Errorf("kamelet %q contains 
invalid content that is not supported by the Kamelet schema", kamelet.Name))
+               }
+       }
+       return errors
+}
+
+func verifyParameters(kamelets []KameletInfo) (errors []error) {
+       for _, kamelet := range kamelets {
+               if kamelet.Spec.Definition == nil {
+                       errors = append(errors, fmt.Errorf("kamelet %q does not 
contain the JSON schema definition", kamelet.Name))
+                       continue
+               }
+               if kamelet.Spec.Definition.Title == "" {
+                       errors = append(errors, fmt.Errorf("kamelet %q does not 
contain title", kamelet.Name))
+               }
+               if kamelet.Spec.Definition.Description == "" {
+                       errors = append(errors, fmt.Errorf("kamelet %q does not 
contain description", kamelet.Name))
+               }
+               for k, p := range kamelet.Spec.Definition.Properties {
+                       if p.Type == "" {
+                               errors = append(errors, fmt.Errorf("property %q 
in kamelet %q does not contain type", k, kamelet.Name))
+                       }
+                       if p.Title == "" {
+                               errors = append(errors, fmt.Errorf("property %q 
in kamelet %q does not contain title", k, kamelet.Name))
+                       } else {
+                               cleanTitle := stopwords.CleanString(p.Title, 
"en", false)
+                               goodWords := strings.Split(cleanTitle, " ")
+                               check := make(map[string]bool, len(goodWords))
+                               for _, w := range goodWords {
+                                       check[strings.ToLower(w)] = true
+                               }
+                               words := strings.Split(p.Title, " ")
+                               for _, w := range words {
+                                       if !check[strings.ToLower(w)] {
+                                               continue
+                                       }
+                                       if len(w) > 0 && 
strings.ToUpper(w[0:1]) != w[0:1] {
+                                               errors = append(errors, 
fmt.Errorf("property %q in kamelet %q does has non-capitalized word in the 
title: %q", k, kamelet.Name, w))
+                                       }
+                               }
+                       }
+                       if strings.HasPrefix(p.Title, "The ") {
+                               errors = append(errors, fmt.Errorf("property %q 
in kamelet %q has a title starting with \"The \"", k, kamelet.Name))
+                       }
+                       if strings.HasPrefix(p.Title, "A ") {
+                               errors = append(errors, fmt.Errorf("property %q 
in kamelet %q has a title starting with \"A \"", k, kamelet.Name))
+                       }
+                       if strings.HasPrefix(p.Title, "An ") {
+                               errors = append(errors, fmt.Errorf("property %q 
in kamelet %q has a title starting with \"An \"", k, kamelet.Name))
+                       }
+                       if p.Description == "" {
+                               errors = append(errors, fmt.Errorf("property %q 
in kamelet %q does not contain a description", k, kamelet.Name))
+                       }
+               }
+               for _, k := range kamelet.Spec.Definition.Required {
+                       if _, ok := kamelet.Spec.Definition.Properties[k]; !ok {
+                               errors = append(errors, fmt.Errorf("required 
property %q in kamelet %q is not defined", k, kamelet.Name))
+                       }
+               }
+       }
+       return errors
+}
+
+func verifyAnnotations(kamelets []KameletInfo) (errors []error) {
+       for _, kamelet := range kamelets {
+               if icon := 
kamelet.Annotations["camel.apache.org/kamelet.icon"]; icon == "" {
+                       errors = append(errors, fmt.Errorf("kamelet %q does not 
contain the camel.apache.org/kamelet.icon annotation", kamelet.Name))
+               }
+               expectedProvider := "Apache Software Foundation"
+               if provider := 
kamelet.Annotations["camel.apache.org/provider"]; provider != expectedProvider {
+                       errors = append(errors, fmt.Errorf("kamelet %q does not 
contain the right value for the camel.apache.org/provider annotation: expected 
%q, found %q", kamelet.Name, expectedProvider, provider))
+               }
+       }
+       return errors
+}
+
+func verifyKameletType(kamelets []KameletInfo) (errors []error) {
+       for _, kamelet := range kamelets {
+               tp := kamelet.Labels["camel.apache.org/kamelet.type"]
+               switch tp {
+               case "source":
+                       fallthrough
+               case "sink":
+                       fallthrough
+               case "action":
+                       expectedSuffix := fmt.Sprintf("-%s", tp)
+                       if !strings.HasSuffix(kamelet.Name, expectedSuffix) {
+                               errors = append(errors, fmt.Errorf("name of 
kamelet %q does not end with %q", kamelet.Name, expectedSuffix))
+                       }
+               default:
+                       errors = append(errors, fmt.Errorf("kamelet %q contains 
an invalid value for the camel.apache.org/kamelet.type label: %q", 
kamelet.Name, tp))
+               }
+       }
+       return errors
+}
+
+func verifyFileNames(kamelets []KameletInfo) (errors []error) {
+       for _, kamelet := range kamelets {
+               if kamelet.Name != 
strings.TrimSuffix(path.Base(kamelet.FileName), ".kamelet.yaml") {
+                       errors = append(errors, fmt.Errorf("file %q does not 
match the name of the contained kamelet: %q", kamelet.FileName, kamelet.Name))
+               }
+       }
+       return errors
+}
+
+func listKamelets(dir string) []KameletInfo {
+       scheme := runtime.NewScheme()
+       err := camel.AddToScheme(scheme)
+       handleGeneralError("cannot to add camel APIs to scheme", err)
+
+       codecs := serializer.NewCodecFactory(scheme)
+       gv := camel.SchemeGroupVersion
+       gvk := schema.GroupVersionKind{
+               Group:   gv.Group,
+               Version: gv.Version,
+               Kind:    "Kamelet",
+       }
+       decoder := codecs.UniversalDecoder(gv)
+
+       kamelets := make([]KameletInfo, 0)
+       files, err := ioutil.ReadDir(dir)
+       filesSorted := make([]string, 0)
+       handleGeneralError(fmt.Sprintf("cannot list dir %q", dir), err)
+       for _, fd := range files {
+               if !fd.IsDir() && strings.HasSuffix(fd.Name(), ".kamelet.yaml") 
{
+                       fullName := filepath.Join(dir, fd.Name())
+                       filesSorted = append(filesSorted, fullName)
+               }
+       }
+       sort.Strings(filesSorted)
+       for _, fileName := range filesSorted {
+               content, err := ioutil.ReadFile(fileName)
+               handleGeneralError(fmt.Sprintf("cannot read file %q", 
fileName), err)
+
+               json, err := yaml.ToJSON(content)
+               handleGeneralError(fmt.Sprintf("cannot convert file %q to 
JSON", fileName), err)
+
+               kamelet := camel.Kamelet{}
+               _, _, err = decoder.Decode(json, &gvk, &kamelet)
+               handleGeneralError(fmt.Sprintf("cannot unmarshal file %q into 
Kamelet", fileName), err)
+               kameletInfo := KameletInfo{
+                       Kamelet:  kamelet,
+                       FileName: fileName,
+               }
+               kamelets = append(kamelets, kameletInfo)
+       }
+       return kamelets
+}
+
+type KameletInfo struct {
+       camel.Kamelet
+       FileName string
+}
+
+func handleGeneralError(desc string, err error) {
+       if err != nil {
+               fmt.Printf("%s: %+v\n", desc, err)
+               os.Exit(2)
+       }
+}
diff --git a/ssh-source.kamelet.yaml b/ssh-source.kamelet.yaml
index b0533b0..773133e 100644
--- a/ssh-source.kamelet.yaml
+++ b/ssh-source.kamelet.yaml
@@ -20,22 +20,22 @@ spec:
       - pollCommand
     properties:
       host:
-        title: SSH Host
+        title: Host
         description: The SSH Host
         type: string
       port:
-        title: SSH Port
+        title: Port
         description: The SSH Port
         type: string
         default: 22
       username:
-        title: The SSH username
+        title: Username
         description: The SSH username to use
         type: string
         x-descriptors:
         - urn:alm:descriptor:com.tectonic.ui:password
       password:
-        title: The SSH password
+        title: Password
         description: The SSH password to use
         type: string
         x-descriptors:
@@ -46,7 +46,7 @@ spec:
         type: integer
         default: 500
       pollCommand:
-        title: The Poll command
+        title: Poll Command
         description: The command to run while polling the SSH session
         type: string
         example: date
diff --git 
a/camel-kamelets-catalog/src/main/resources/kamelets/twitter-directmessage.kamelet.yaml
 b/twitter-directmessage-source.kamelet.yaml
old mode 100644
new mode 100755
similarity index 100%
rename from 
camel-kamelets-catalog/src/main/resources/kamelets/twitter-directmessage.kamelet.yaml
rename to twitter-directmessage-source.kamelet.yaml
diff --git 
a/camel-kamelets-catalog/src/main/resources/kamelets/twitter-search.kamelet.yaml
 b/twitter-search-source.kamelet.yaml
old mode 100644
new mode 100755
similarity index 100%
rename from 
camel-kamelets-catalog/src/main/resources/kamelets/twitter-search.kamelet.yaml
rename to twitter-search-source.kamelet.yaml
diff --git 
a/camel-kamelets-catalog/src/main/resources/kamelets/twitter-timeline.kamelet.yaml
 b/twitter-timeline-source.kamelet.yaml
old mode 100644
new mode 100755
similarity index 100%
rename from 
camel-kamelets-catalog/src/main/resources/kamelets/twitter-timeline.kamelet.yaml
rename to twitter-timeline-source.kamelet.yaml

Reply via email to