Repository: apache/camel-k
Pull request #1957 (2021-01-29 12:32:13)

proposal: provided kamelets
<!-- Description -->

A proposal to move forward with Kamelets.

cc: @davsclaus , @oscerd , @astefanutti , @squakez , @doru1004 , @lburgazzoli


<!--
Enter your extended release note in the below block. If the PR requires
additional action from users switching to the new release, include the string
"action required". If no release note is required, write "NONE". 

You can (optionally) mark this PR with labels "kind/bug" or "kind/feature" to make sure
the text is added to the right section of the release notes. 
-->

**Release Note**
```release-note
NONE
```


davsclaus: LGTM

Thought its 2021 so the yyyy should be updated.

And I noticed there was 2 x single in the text in the top

Patch:
diff --git a/.github/actions/backport b/.github/actions/backport
new file mode 160000
index 000000000..2d7713b17
--- /dev/null
+++ b/.github/actions/backport
@@ -0,0 +1,1 @@
+Subproject commit 2d7713b178ee4f86d505da2f829301b912c0a4ca
diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
new file mode 100644
index 000000000..5860f31e6
--- /dev/null
+++ b/.github/workflows/backport.yml
@@ -0,0 +1,38 @@
+#
+# 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: Backport
+on:
+  pull_request:
+    types:
+      - closed
+      - labeled
+
+jobs:
+  backport:
+    runs-on: ubuntu-18.04
+    name: Backport
+    steps:
+      - name: "Checkout camel-k"
+        uses: actions/checkout@v2
+        with:
+          persist-credentials: false
+          submodules: recursive
+      - name: Backport
+        uses: ./.github/actions/backport
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..61cda74e7
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule ".github/actions/backport"]
+	path = .github/actions/backport
+	url = https://github.com/tibdex/backport
diff --git a/cmd/util/doc-gen/generators/traitdocgen.go b/cmd/util/doc-gen/generators/traitdocgen.go
index ec3ef230b..0e5bc0330 100644
--- a/cmd/util/doc-gen/generators/traitdocgen.go
+++ b/cmd/util/doc-gen/generators/traitdocgen.go
@@ -185,7 +185,7 @@ func writeFields(t *types.Type, traitID string, content *[]string) {
 	}
 	res = append(res, "```")
 	res = append(res, "The following configuration options are available:", "")
-	res = append(res, "[cols=\"2,1,5a\"]", "|===")
+	res = append(res, "[cols=\"2m,1m,5a\"]", "|===")
 	res = append(res, "|Property | Type | Description", "")
 	writeMembers(t, traitID, &res)
 	res = append(res, "|===", "", adocConfigurationMarkerEnd)
diff --git a/docs/modules/ROOT/pages/contributing/developers.adoc b/docs/modules/ROOT/pages/contributing/developers.adoc
index 80463ca34..5ef434d66 100644
--- a/docs/modules/ROOT/pages/contributing/developers.adoc
+++ b/docs/modules/ROOT/pages/contributing/developers.adoc
@@ -152,7 +152,7 @@ To add additional dependencies to your routes:
 
 [source]
 ----
-./kamel run -d camel:dns examples/dns.js
+./kamel run -d camel-dns examples/dns.js
 ----
 
 [[local-development]]
diff --git a/docs/modules/ROOT/pages/installation/registry/icr.adoc b/docs/modules/ROOT/pages/installation/registry/icr.adoc
index 967124bcf..8fb905274 100644
--- a/docs/modules/ROOT/pages/installation/registry/icr.adoc
+++ b/docs/modules/ROOT/pages/installation/registry/icr.adoc
@@ -8,18 +8,26 @@ In order to push images to `gcr.io`, you need to provide a valid key to Camel K.
 The fast way to obtain create a Namespace on ICR is by https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli[IBM Command line tool]:
 
 - Install https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli[IBM Command line tool]:
-    ```
-    ibmcloud plugin install container-registry -r 'IBM Cloud'
-    ```
++
+[source,console]
+----
+$ ibmcloud plugin install container-registry -r 'IBM Cloud'
+----
 - Log in to your IBM Cloud account.
-    ```
-    ibmcloud login -a https://cloud.ibm.com
-    ```
-- Ensure that you're targeting the correct IBM Cloud Container Registry region.
-    ```
-    ibmcloud cr region-set us-south
-    ```
-- Choose a name for your namespace, and create that namespace.
-    ```
-    ibmcloud cr namespace-add <my_namespace>
-    ```
\ No newline at end of file
++
+[source,console]
+----
+$ ibmcloud login -a https://cloud.ibm.com
+----
+- Ensure that you're targeting the correct IBM Cloud Container Registry region:
++
+[source,console]
+----
+$ ibmcloud cr region-set us-south
+----
+- Choose a name for your namespace, and create that namespace:
++
+[source,console]
+----
+$ ibmcloud cr namespace-add <my_namespace>
+----
diff --git a/docs/modules/ROOT/pages/installation/registry/registry.adoc b/docs/modules/ROOT/pages/installation/registry/registry.adoc
index 343656dae..e0efddac6 100644
--- a/docs/modules/ROOT/pages/installation/registry/registry.adoc
+++ b/docs/modules/ROOT/pages/installation/registry/registry.adoc
@@ -1,7 +1,7 @@
 [[configuring-registry]]
 = Configuring Registry
 
-Every Camel K installation needs a container registry that that will be used to host integration container images.
+Every Camel K installation needs a container registry that will be used to host integration container images.
 
 A **default registry** is present in all the following supported installations:
 
@@ -16,7 +16,7 @@ Registry configuration can be set upon installation using command:
 
 [source,bash]
 ----
-kamel install --registry registry-host.io --organization your-user-id-or-org --registry-secret the-push-kubernetes-secret-name
+$ kamel install --registry registry-host.io --organization your-user-id-or-org --registry-secret the-push-kubernetes-secret-name
 ----
 
 Alternatively, the same settings can be set in the `.spec.build.registry` section of the `IntegrationPlatform` resource.
diff --git a/docs/modules/traits/pages/3scale.adoc b/docs/modules/traits/pages/3scale.adoc
index cd7d0ecea..fd7ab9faa 100755
--- a/docs/modules/traits/pages/3scale.adoc
+++ b/docs/modules/traits/pages/3scale.adoc
@@ -19,7 +19,7 @@ kamel run --trait 3scale.[key]=[value] --trait 3scale.[key2]=[value2] integratio
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/affinity.adoc b/docs/modules/traits/pages/affinity.adoc
index 6b1b98dba..6f2cddfe5 100755
--- a/docs/modules/traits/pages/affinity.adoc
+++ b/docs/modules/traits/pages/affinity.adoc
@@ -19,7 +19,7 @@ kamel run --trait affinity.[key]=[value] --trait affinity.[key2]=[value2] integr
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/builder.adoc b/docs/modules/traits/pages/builder.adoc
index ecfb1eece..3e89d9b60 100755
--- a/docs/modules/traits/pages/builder.adoc
+++ b/docs/modules/traits/pages/builder.adoc
@@ -19,7 +19,7 @@ kamel run --trait builder.[key]=[value] --trait builder.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/camel.adoc b/docs/modules/traits/pages/camel.adoc
index cc73caf5b..6331571df 100755
--- a/docs/modules/traits/pages/camel.adoc
+++ b/docs/modules/traits/pages/camel.adoc
@@ -18,7 +18,7 @@ kamel run --trait camel.[key]=[value] --trait camel.[key2]=[value2] integration.
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/container.adoc b/docs/modules/traits/pages/container.adoc
index ff6880daa..6d721704c 100755
--- a/docs/modules/traits/pages/container.adoc
+++ b/docs/modules/traits/pages/container.adoc
@@ -20,7 +20,7 @@ kamel run --trait container.[key]=[value] --trait container.[key2]=[value2] inte
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/cron.adoc b/docs/modules/traits/pages/cron.adoc
index d6403885d..9d8089587 100755
--- a/docs/modules/traits/pages/cron.adoc
+++ b/docs/modules/traits/pages/cron.adoc
@@ -28,7 +28,7 @@ kamel run --trait cron.[key]=[value] --trait cron.[key2]=[value2] integration.gr
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/dependencies.adoc b/docs/modules/traits/pages/dependencies.adoc
index c1c94fbfd..c4490ca3d 100755
--- a/docs/modules/traits/pages/dependencies.adoc
+++ b/docs/modules/traits/pages/dependencies.adoc
@@ -19,7 +19,7 @@ kamel run --trait dependencies.[key]=[value] integration.groovy
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/deployer.adoc b/docs/modules/traits/pages/deployer.adoc
index f98c43a24..ba7f66493 100755
--- a/docs/modules/traits/pages/deployer.adoc
+++ b/docs/modules/traits/pages/deployer.adoc
@@ -19,7 +19,7 @@ kamel run --trait deployer.[key]=[value] --trait deployer.[key2]=[value2] integr
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/deployment.adoc b/docs/modules/traits/pages/deployment.adoc
index 362668300..a09a244b7 100755
--- a/docs/modules/traits/pages/deployment.adoc
+++ b/docs/modules/traits/pages/deployment.adoc
@@ -19,7 +19,7 @@ kamel run --trait deployment.[key]=[value] integration.groovy
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/environment.adoc b/docs/modules/traits/pages/environment.adoc
index 787c00eaa..ef803ffd0 100755
--- a/docs/modules/traits/pages/environment.adoc
+++ b/docs/modules/traits/pages/environment.adoc
@@ -19,7 +19,7 @@ kamel run --trait environment.[key]=[value] --trait environment.[key2]=[value2]
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/gc.adoc b/docs/modules/traits/pages/gc.adoc
index 0b61f3ef6..51a3b268c 100755
--- a/docs/modules/traits/pages/gc.adoc
+++ b/docs/modules/traits/pages/gc.adoc
@@ -16,7 +16,7 @@ kamel run --trait gc.[key]=[value] --trait gc.[key2]=[value2] integration.groovy
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/ingress.adoc b/docs/modules/traits/pages/ingress.adoc
index 302440999..df0d4557e 100755
--- a/docs/modules/traits/pages/ingress.adoc
+++ b/docs/modules/traits/pages/ingress.adoc
@@ -19,7 +19,7 @@ kamel run --trait ingress.[key]=[value] --trait ingress.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/istio.adoc b/docs/modules/traits/pages/istio.adoc
index 081468344..23a072aa3 100755
--- a/docs/modules/traits/pages/istio.adoc
+++ b/docs/modules/traits/pages/istio.adoc
@@ -17,7 +17,7 @@ kamel run --trait istio.[key]=[value] --trait istio.[key2]=[value2] integration.
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/jolokia.adoc b/docs/modules/traits/pages/jolokia.adoc
index 9332b431d..e5914ce34 100755
--- a/docs/modules/traits/pages/jolokia.adoc
+++ b/docs/modules/traits/pages/jolokia.adoc
@@ -18,7 +18,7 @@ kamel run --trait jolokia.[key]=[value] --trait jolokia.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/jvm.adoc b/docs/modules/traits/pages/jvm.adoc
index 913ef7de4..920512119 100755
--- a/docs/modules/traits/pages/jvm.adoc
+++ b/docs/modules/traits/pages/jvm.adoc
@@ -18,7 +18,7 @@ kamel run --trait jvm.[key]=[value] --trait jvm.[key2]=[value2] integration.groo
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/kamelets.adoc b/docs/modules/traits/pages/kamelets.adoc
index 7409709f4..82da6a2ee 100755
--- a/docs/modules/traits/pages/kamelets.adoc
+++ b/docs/modules/traits/pages/kamelets.adoc
@@ -18,7 +18,7 @@ kamel run --trait kamelets.[key]=[value] --trait kamelets.[key2]=[value2] integr
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/knative-service.adoc b/docs/modules/traits/pages/knative-service.adoc
index 0aaba4faa..8051d6909 100755
--- a/docs/modules/traits/pages/knative-service.adoc
+++ b/docs/modules/traits/pages/knative-service.adoc
@@ -20,7 +20,7 @@ kamel run --trait knative-service.[key]=[value] --trait knative-service.[key2]=[
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/knative.adoc b/docs/modules/traits/pages/knative.adoc
index 6660115fe..2427c8e39 100755
--- a/docs/modules/traits/pages/knative.adoc
+++ b/docs/modules/traits/pages/knative.adoc
@@ -22,7 +22,7 @@ kamel run --trait knative.[key]=[value] --trait knative.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/master.adoc b/docs/modules/traits/pages/master.adoc
index ded352ec0..4ca20c477 100755
--- a/docs/modules/traits/pages/master.adoc
+++ b/docs/modules/traits/pages/master.adoc
@@ -22,7 +22,7 @@ kamel run --trait master.[key]=[value] --trait master.[key2]=[value2] integratio
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/openapi.adoc b/docs/modules/traits/pages/openapi.adoc
index 8d455cfef..ad814df54 100755
--- a/docs/modules/traits/pages/openapi.adoc
+++ b/docs/modules/traits/pages/openapi.adoc
@@ -18,7 +18,7 @@ kamel run --trait openapi.[key]=[value] integration.groovy
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/owner.adoc b/docs/modules/traits/pages/owner.adoc
index 2a8e4c8df..f020cd080 100755
--- a/docs/modules/traits/pages/owner.adoc
+++ b/docs/modules/traits/pages/owner.adoc
@@ -19,7 +19,7 @@ kamel run --trait owner.[key]=[value] --trait owner.[key2]=[value2] integration.
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/pdb.adoc b/docs/modules/traits/pages/pdb.adoc
index 56da0c7b6..fc348908e 100755
--- a/docs/modules/traits/pages/pdb.adoc
+++ b/docs/modules/traits/pages/pdb.adoc
@@ -16,7 +16,7 @@ kamel run --trait pdb.[key]=[value] --trait pdb.[key2]=[value2] integration.groo
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/platform.adoc b/docs/modules/traits/pages/platform.adoc
index 5e8a08853..959deadb2 100755
--- a/docs/modules/traits/pages/platform.adoc
+++ b/docs/modules/traits/pages/platform.adoc
@@ -22,7 +22,7 @@ kamel run --trait platform.[key]=[value] --trait platform.[key2]=[value2] integr
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/prometheus.adoc b/docs/modules/traits/pages/prometheus.adoc
index 1bc57ac05..7530ebf76 100755
--- a/docs/modules/traits/pages/prometheus.adoc
+++ b/docs/modules/traits/pages/prometheus.adoc
@@ -26,7 +26,7 @@ kamel run --trait prometheus.[key]=[value] --trait prometheus.[key2]=[value2] in
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/pull-secret.adoc b/docs/modules/traits/pages/pull-secret.adoc
index 49cc88e11..864ae2dd7 100755
--- a/docs/modules/traits/pages/pull-secret.adoc
+++ b/docs/modules/traits/pages/pull-secret.adoc
@@ -25,7 +25,7 @@ kamel run --trait pull-secret.[key]=[value] --trait pull-secret.[key2]=[value2]
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/quarkus.adoc b/docs/modules/traits/pages/quarkus.adoc
index 08687c11f..133280038 100755
--- a/docs/modules/traits/pages/quarkus.adoc
+++ b/docs/modules/traits/pages/quarkus.adoc
@@ -20,7 +20,7 @@ kamel run --trait quarkus.[key]=[value] --trait quarkus.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/route.adoc b/docs/modules/traits/pages/route.adoc
index 791a08fc2..84759de7c 100755
--- a/docs/modules/traits/pages/route.adoc
+++ b/docs/modules/traits/pages/route.adoc
@@ -16,7 +16,7 @@ kamel run --trait route.[key]=[value] --trait route.[key2]=[value2] integration.
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/service.adoc b/docs/modules/traits/pages/service.adoc
index 28878f3cc..ae3da6513 100755
--- a/docs/modules/traits/pages/service.adoc
+++ b/docs/modules/traits/pages/service.adoc
@@ -19,7 +19,7 @@ kamel run --trait service.[key]=[value] --trait service.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/docs/modules/traits/pages/tracing.adoc b/docs/modules/traits/pages/tracing.adoc
index b6ece2102..23872474e 100755
--- a/docs/modules/traits/pages/tracing.adoc
+++ b/docs/modules/traits/pages/tracing.adoc
@@ -21,7 +21,7 @@ kamel run --trait tracing.[key]=[value] --trait tracing.[key2]=[value2] integrat
 ```
 The following configuration options are available:
 
-[cols="2,1,5a"]
+[cols="2m,1m,5a"]
 |===
 |Property | Type | Description
 
diff --git a/examples/README.md b/examples/README.md
index 89fdbe842..239916c11 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -1,3 +1,42 @@
 # Camel K Examples
 
-This folder contains examples of Camel K integrations defined in various languages.
\ No newline at end of file
+This folder contains various examples of `Camel K` integrations. You can use them to learn more about the capabilities of Camel K or to inspire your integration development.
+
+## Basic usage examples
+
+In this section you will find the most basic examples. Useful to start learning about Camel K and how to run. You can use many supported languages and learn about the most basic features:
+
+| Type  |  Description | Link  |
+|---|---|---|
+| Languages | Simple integrations developed in various supported languages | [see examples](./languages/)|
+| Basic | Basic features such as `cron`, `properties` or `resource`s | [see examples](./basic/)|
+| Processor | Show how to include `Processor`s logic | [see examples](./processor/)|
+| Open API | `Open API` support | [see examples](./openapi/)|
+| Rest | Produce/Consume `REST`ful services | [see examples](./rest/)|
+| Modeline | [Camel K modeline support](https://camel.apache.org/camel-k/latest/cli/modeline.html) | [see examples](./modeline/)|
+
+## Component usage examples
+
+In this section you can find a few examples of certain [`Camel` components](https://camel.apache.org/components/latest/index.html). This is a limited number of the wide variety of components supported by Apache Camel. You can also find useful examples [in this repository](https://github.com/apache/camel-k-examples).
+
+
+| Type  |  Description | Link  |
+|---|---|---|
+| AMQP | Component usage | [see examples](./amqp/)|
+| Caffeine | Component usage | [see examples](./caffeine/)|
+| DNS | Component usage | [see examples](./dns/)|
+| Kafka | Component usage | [see examples](./kafka/)|
+| Knative | Component usage | [see examples](./knative/)|
+
+## Advanced usage examples
+
+As soon as you will learn the basic stuff, you will like to try the new advanced feature offered by Camel K. Here a few examples:
+
+| Type  |  Description | Link  |
+|---|---|---|
+| Kamelets | How to use [`Kamelet`s](https://camel.apache.org/camel-k/latest/kamelets/kamelets.html) | [see examples](./kamelets/)|
+| Master | Master support example | [see examples](./master/)|
+| Polyglot | Polyglot integration examples | [see examples](./polyglot/)|
+| Pulsar | Pulsar usage | [see examples](./pulsar/)|
+| Saga | Saga pattern example | [see examples](./saga/)|
+| Tekton | Tekton tutorial | [see examples](./tekton/)|
\ No newline at end of file
diff --git a/examples/AMQPBindToRegistry.java b/examples/amqp/AMQPBindToRegistry.java
similarity index 100%
rename from examples/AMQPBindToRegistry.java
rename to examples/amqp/AMQPBindToRegistry.java
diff --git a/examples/amqp/README.md b/examples/amqp/README.md
new file mode 100644
index 000000000..01759451b
--- /dev/null
+++ b/examples/amqp/README.md
@@ -0,0 +1,3 @@
+# AMQP Camel K examples
+
+Find useful examples about how to use AMQP in a Camel K integration.
\ No newline at end of file
diff --git a/examples/amqp.groovy b/examples/amqp/amqp.groovy
similarity index 100%
rename from examples/amqp.groovy
rename to examples/amqp/amqp.groovy
diff --git a/examples/amqp.js b/examples/amqp/amqp.js
similarity index 100%
rename from examples/amqp.js
rename to examples/amqp/amqp.js
diff --git a/examples/amqpConsume.java b/examples/amqp/amqpConsume.java
similarity index 100%
rename from examples/amqpConsume.java
rename to examples/amqp/amqpConsume.java
diff --git a/examples/basic/README.md b/examples/basic/README.md
new file mode 100644
index 000000000..721f701d1
--- /dev/null
+++ b/examples/basic/README.md
@@ -0,0 +1,3 @@
+# Basic Camel K examples
+
+Find useful examples about how to use certain basic features of Camel K.
\ No newline at end of file
diff --git a/examples/cron.groovy b/examples/basic/cron.groovy
similarity index 100%
rename from examples/cron.groovy
rename to examples/basic/cron.groovy
diff --git a/examples/props.js b/examples/basic/props.js
similarity index 100%
rename from examples/props.js
rename to examples/basic/props.js
diff --git a/examples/resources-data.txt b/examples/basic/resources-data.txt
similarity index 100%
rename from examples/resources-data.txt
rename to examples/basic/resources-data.txt
diff --git a/examples/resources-route.groovy b/examples/basic/resources-route.groovy
similarity index 100%
rename from examples/resources-route.groovy
rename to examples/basic/resources-route.groovy
diff --git a/examples/CaffeineCacheSample.java b/examples/caffeine/CaffeineCacheSample.java
similarity index 100%
rename from examples/CaffeineCacheSample.java
rename to examples/caffeine/CaffeineCacheSample.java
diff --git a/examples/caffeine/README.md b/examples/caffeine/README.md
new file mode 100644
index 000000000..0be603fa1
--- /dev/null
+++ b/examples/caffeine/README.md
@@ -0,0 +1,3 @@
+# Caffeine Camel K examples
+
+Find useful examples about how to use Caffeine in a Camel K integration.
\ No newline at end of file
diff --git a/examples/camel-caffeine.groovy b/examples/caffeine/camel-caffeine.groovy
similarity index 100%
rename from examples/camel-caffeine.groovy
rename to examples/caffeine/camel-caffeine.groovy
diff --git a/examples/dns/README.md b/examples/dns/README.md
new file mode 100644
index 000000000..301ee949f
--- /dev/null
+++ b/examples/dns/README.md
@@ -0,0 +1,3 @@
+# DNS Camel K examples
+
+Find useful examples about how to use DNS in a Camel K integration.
\ No newline at end of file
diff --git a/examples/dns.js b/examples/dns/dns.js
similarity index 100%
rename from examples/dns.js
rename to examples/dns/dns.js
diff --git a/examples/kafka/README.adoc b/examples/kafka/README.md
similarity index 94%
rename from examples/kafka/README.adoc
rename to examples/kafka/README.md
index aa38cf462..d92fbca1f 100644
--- a/examples/kafka/README.adoc
+++ b/examples/kafka/README.md
@@ -1,5 +1,4 @@
-Kafka Example (Apache Camel K)
-==============================
+# Kafka Camel K examples
 
 This example shows how Camel K can be used to connect to a Kafka broker.
 
diff --git a/examples/kamelets/README.md b/examples/kamelets/README.md
new file mode 100644
index 000000000..819f1738d
--- /dev/null
+++ b/examples/kamelets/README.md
@@ -0,0 +1,3 @@
+# Kamelets Camel K examples
+
+Find useful examples about how to use Kamelets.
\ No newline at end of file
diff --git a/examples/knative/README.adoc b/examples/knative/README.md
similarity index 96%
rename from examples/knative/README.adoc
rename to examples/knative/README.md
index 18d0d7acd..0c856e26c 100644
--- a/examples/knative/README.adoc
+++ b/examples/knative/README.md
@@ -1,6 +1,4 @@
-Knative Example (Apache Camel K)
-================================
-
+# Knative Camel K Example
 This example shows how Camel K can be used to connect Knative building blocks to create awesome applications.
 
 A video version of this https://youtu.be/btf_e2GniXM[demo is available on YouTube].
@@ -23,7 +21,7 @@ kubectl create -f words-channel.yaml
 
 We can now proceed to install all camel K integrations.
 
-== Install a "Printer"
+## Install a "Printer"
 
 We'll install a Camel K integration that will print all words from the `words` channel.
 
@@ -48,7 +46,7 @@ Under the hood, the Camel K operator does this:
 
 The resulting integration will be scaled to 0 when not used (if you wait ~5 minutes, you'll see it).
 
-== Install a "Splitter"
+## Install a "Splitter"
 
 We're now going to deploy a splitter, using the Camel core Split EIP. The splitter will take all messages from the `messages` channel,
 split them and push the single words into the `words` channel.
@@ -70,7 +68,7 @@ kamel run splitter.groovy
 
 This integration will be also materialized as a Knative autoscaling service, because the only entrypoint is passive (waits for a push notification).
 
-== Install a "Feed"
+## Install a "Feed"
 
 We're going to feed this chain of functions using a timed feed like this:
 
@@ -92,7 +90,7 @@ kamel run feed.groovy
 This cannot be materialized into an autoscaling service, but the operator understands it automatically and maps it to a plain Kubernetes Deployment
 (Istio sidecar will be injected).
 
-== Playing around
+## Playing around
 
 If you've installed all the services, you'll find that the printer pod will print single words as they arrive from the feed (every 3 seconds, passing by the splitter function).
 
@@ -100,7 +98,7 @@ If you now stop the feed integration (`kamel delete feed`) you will notice that
 
 And if you reinstall the feed again (`kamel run feed.groovy`), the other integration will scale up again as soon as they receive messages (splitter first, then printer).
 
-== Playing harder
+## Playing harder
 
 You can also play with different kind of feeds. E.g. the following simple feed can be used to bind messages from Telegram to the system:
 
diff --git a/examples/languages/README.md b/examples/languages/README.md
new file mode 100644
index 000000000..1d70af4d0
--- /dev/null
+++ b/examples/languages/README.md
@@ -0,0 +1,3 @@
+# Supported languages Camel K examples
+
+Find useful examples about how to develop a Camel K integration in `Java`, `Javascript`, `Groovy`, `XML` and `YAML`.
\ No newline at end of file
diff --git a/examples/Sample.java b/examples/languages/Sample.java
similarity index 100%
rename from examples/Sample.java
rename to examples/languages/Sample.java
diff --git a/examples/hello.xml b/examples/languages/hello.xml
similarity index 100%
rename from examples/hello.xml
rename to examples/languages/hello.xml
diff --git a/examples/routes.yaml b/examples/languages/routes.yaml
similarity index 100%
rename from examples/routes.yaml
rename to examples/languages/routes.yaml
diff --git a/examples/simple.groovy b/examples/languages/simple.groovy
similarity index 100%
rename from examples/simple.groovy
rename to examples/languages/simple.groovy
diff --git a/examples/simple.js b/examples/languages/simple.js
similarity index 100%
rename from examples/simple.js
rename to examples/languages/simple.js
diff --git a/examples/Master.java b/examples/master/Master.java
similarity index 100%
rename from examples/Master.java
rename to examples/master/Master.java
diff --git a/examples/master/README.md b/examples/master/README.md
new file mode 100644
index 000000000..11018055c
--- /dev/null
+++ b/examples/master/README.md
@@ -0,0 +1,3 @@
+# Master Camel K examples
+
+Find useful examples about how to use Master in a Camel K integration.
\ No newline at end of file
diff --git a/examples/modeline/README.md b/examples/modeline/README.md
new file mode 100644
index 000000000..922833aed
--- /dev/null
+++ b/examples/modeline/README.md
@@ -0,0 +1,3 @@
+# Modeline Camel K examples
+
+Find useful examples about how to use Modeline in a Camel K integration.
\ No newline at end of file
diff --git a/examples/SampleModeline.java b/examples/modeline/SampleModeline.java
similarity index 100%
rename from examples/SampleModeline.java
rename to examples/modeline/SampleModeline.java
diff --git a/examples/openapi/README.md b/examples/openapi/README.md
new file mode 100644
index 000000000..41193d7fb
--- /dev/null
+++ b/examples/openapi/README.md
@@ -0,0 +1,3 @@
+# Open API Camel K examples
+
+Find useful examples about how to expose an Open API specification in a Camel K integration.
\ No newline at end of file
diff --git a/examples/greetings-api.json b/examples/openapi/greetings-api.json
similarity index 100%
rename from examples/greetings-api.json
rename to examples/openapi/greetings-api.json
diff --git a/examples/greetings.groovy b/examples/openapi/greetings.groovy
similarity index 100%
rename from examples/greetings.groovy
rename to examples/openapi/greetings.groovy
diff --git a/examples/petstore-api.yaml b/examples/openapi/petstore-api.yaml
similarity index 100%
rename from examples/petstore-api.yaml
rename to examples/openapi/petstore-api.yaml
diff --git a/examples/petstore.groovy b/examples/openapi/petstore.groovy
similarity index 100%
rename from examples/petstore.groovy
rename to examples/openapi/petstore.groovy
diff --git a/examples/polyglot/README.adoc b/examples/polyglot/README.adoc
deleted file mode 100644
index 9600f5a99..000000000
--- a/examples/polyglot/README.adoc
+++ /dev/null
@@ -1,8 +0,0 @@
-= Example of route built using multiple DSLs
-
-To run it:
-
-[source,shell]
-----
-$ kamel run --name polyglot routes.xml beans.groovy JavaRoute.java
-----
\ No newline at end of file
diff --git a/examples/polyglot/README.md b/examples/polyglot/README.md
new file mode 100644
index 000000000..07072cfd8
--- /dev/null
+++ b/examples/polyglot/README.md
@@ -0,0 +1,7 @@
+# Polyglot Camel K examples
+
+Run an integration using different Camel DSL languages.
+
+```
+$ kamel run --name polyglot routes.xml beans.groovy JavaRoute.java
+```
\ No newline at end of file
diff --git a/examples/processor/README.md b/examples/processor/README.md
new file mode 100644
index 000000000..558280a2d
--- /dev/null
+++ b/examples/processor/README.md
@@ -0,0 +1,3 @@
+# Processors Camel K examples
+
+Find useful examples about how to include a `Processor` in a Camel K integration.
\ No newline at end of file
diff --git a/examples/kotlin-routes.kts b/examples/processor/kotlin-routes.kts
similarity index 100%
rename from examples/kotlin-routes.kts
rename to examples/processor/kotlin-routes.kts
diff --git a/examples/routes.groovy b/examples/processor/routes.groovy
similarity index 100%
rename from examples/routes.groovy
rename to examples/processor/routes.groovy
diff --git a/examples/routes.js b/examples/processor/routes.js
similarity index 100%
rename from examples/routes.js
rename to examples/processor/routes.js
diff --git a/examples/pulsar/README.md b/examples/pulsar/README.md
new file mode 100644
index 000000000..025150d61
--- /dev/null
+++ b/examples/pulsar/README.md
@@ -0,0 +1,3 @@
+# Pulsar Camel K examples
+
+Find useful examples about how to use Pulsar in a Camel K integration.
\ No newline at end of file
diff --git a/examples/pulsar.groovy b/examples/pulsar/pulsar.groovy
similarity index 100%
rename from examples/pulsar.groovy
rename to examples/pulsar/pulsar.groovy
diff --git a/examples/rest/README.md b/examples/rest/README.md
new file mode 100644
index 000000000..ef294339b
--- /dev/null
+++ b/examples/rest/README.md
@@ -0,0 +1,3 @@
+# Rest Camel K examples
+
+Find useful examples about how to Produce/Consume RESTful webservices in a Camel K integration.
\ No newline at end of file
diff --git a/examples/RestDSL.java b/examples/rest/RestDSL.java
similarity index 100%
rename from examples/RestDSL.java
rename to examples/rest/RestDSL.java
diff --git a/examples/routes-rest.js b/examples/rest/routes-rest.js
similarity index 100%
rename from examples/routes-rest.js
rename to examples/rest/routes-rest.js
diff --git a/examples/saga/Readme.md b/examples/saga/README.md
similarity index 98%
rename from examples/saga/Readme.md
rename to examples/saga/README.md
index 7debc1f7d..56ba1f4d7 100644
--- a/examples/saga/Readme.md
+++ b/examples/saga/README.md
@@ -1,4 +1,4 @@
-# Saga example
+# Saga Camel K examples
 
 This example is from [camel-saga-quickstart](https://github.com/nicolaferraro/camel-saga-quickstart/) adapted to work with camel-k.
 
diff --git a/examples/tekton/README.md b/examples/tekton/README.md
index 86d1e87cd..c386ba98f 100644
--- a/examples/tekton/README.md
+++ b/examples/tekton/README.md
@@ -1,4 +1,4 @@
-# Example: Camel K in Tekton Pipelines
+# Camel K in Tekton Pipelines
 
 This example is part of a tutorial about running Camel K on Tekton pipelines.
 
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index 3fa45d784..1c1c4df7b 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -20,10 +20,10 @@ package trait
 import (
 	"fmt"
 	"path"
+	"sort"
 	"strconv"
 	"strings"
 
-	"github.com/apache/camel-k/pkg/builder/spectrum"
 	"github.com/pkg/errors"
 
 	corev1 "k8s.io/api/core/v1"
@@ -34,6 +34,7 @@ import (
 	"github.com/apache/camel-k/pkg/builder"
 	"github.com/apache/camel-k/pkg/builder/kaniko"
 	"github.com/apache/camel-k/pkg/builder/s2i"
+	"github.com/apache/camel-k/pkg/builder/spectrum"
 	"github.com/apache/camel-k/pkg/util/defaults"
 )
 
@@ -179,25 +180,33 @@ func (t *builderTrait) builderTask(e *Environment) *v1.BuilderTask {
 		BaseImage:    e.Platform.Status.Build.BaseImage,
 		Runtime:      e.CamelCatalog.Runtime,
 		Dependencies: e.IntegrationKit.Spec.Dependencies,
-		//TODO: sort steps for easier read
-		Steps:      builder.StepIDsFor(builder.DefaultSteps...),
-		Properties: e.Platform.Status.Build.Properties,
-		Timeout:    e.Platform.Status.Build.GetTimeout(),
-		Maven:      e.Platform.Status.Build.Maven,
+		Properties:   e.Platform.Status.Build.Properties,
+		Timeout:      e.Platform.Status.Build.GetTimeout(),
+		Maven:        e.Platform.Status.Build.Maven,
 	}
 
+	steps := make([]builder.Step, 0)
+	steps = append(steps, builder.DefaultSteps...)
+
 	switch e.Platform.Status.Build.PublishStrategy {
 	case v1.IntegrationPlatformBuildPublishStrategyBuildah, v1.IntegrationPlatformBuildPublishStrategyKaniko:
 		task.BuildDir = path.Join(builderDir, e.IntegrationKit.Name)
 
 	case v1.IntegrationPlatformBuildPublishStrategyS2I:
-		task.Steps = append(task.Steps, builder.StepIDsFor(s2i.S2iSteps...)...)
+		steps = append(steps, s2i.S2iSteps...)
 	case v1.IntegrationPlatformBuildPublishStrategySpectrum:
-		task.Steps = append(task.Steps, builder.StepIDsFor(spectrum.SpectrumSteps...)...)
+		steps = append(steps, spectrum.SpectrumSteps...)
 	}
 
 	quarkus := e.Catalog.GetTrait("quarkus").(*quarkusTrait)
-	quarkus.addBuildSteps(task)
+	quarkus.addBuildSteps(&steps)
+
+	// sort steps by phase
+	sort.SliceStable(steps, func(i, j int) bool {
+		return steps[i].Phase() < steps[j].Phase()
+	})
+
+	task.Steps = builder.StepIDsFor(steps...)
 
 	return task
 }
@@ -241,7 +250,7 @@ func (t *builderTrait) buildahTask(e *Environment) (*v1.ImageTask, error) {
 		}
 		mountRegistryConfigMap(e.Platform.Status.Build.Registry.CA, config, &volumes, &volumeMounts)
 		// This is easier to use the --cert-dir option, otherwise Buildah defaults to looking up certificates
-		//into a directory named after the registry address
+		// into a directory named after the registry address
 		bud = append(bud[:2], append([]string{"--cert-dir=/etc/containers/certs.d"}, bud[2:]...)...)
 		push = append(push[:2], append([]string{"--cert-dir=/etc/containers/certs.d"}, push[2:]...)...)
 	}
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index ea2b3d512..4227221f5 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -18,7 +18,6 @@ limitations under the License.
 package trait
 
 import (
-	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/builder"
 	"github.com/apache/camel-k/pkg/builder/runtime"
 )
@@ -62,6 +61,6 @@ func (t *quarkusTrait) InfluencesKit() bool {
 	return true
 }
 
-func (t *quarkusTrait) addBuildSteps(task *v1.BuilderTask) {
-	task.Steps = append(task.Steps, builder.StepIDsFor(runtime.QuarkusSteps...)...)
+func (t *quarkusTrait) addBuildSteps(steps *[]builder.Step) {
+	*steps = append(*steps, runtime.QuarkusSteps...)
 }
diff --git a/pkg/util/camel/camel_runtime_catalog.go b/pkg/util/camel/camel_runtime_catalog.go
index 2482effe3..dc71a4094 100644
--- a/pkg/util/camel/camel_runtime_catalog.go
+++ b/pkg/util/camel/camel_runtime_catalog.go
@@ -36,6 +36,15 @@ func NewRuntimeCatalog(spec v1.CamelCatalogSpec) *RuntimeCatalog {
 	for id, artifact := range catalog.Artifacts {
 		for _, scheme := range artifact.Schemes {
 			scheme := scheme
+
+			// In case of duplicate only, choose the "org.apache.camel.quarkus" artifact (if present).
+			// Workaround for https://github.com/apache/camel-k-runtime/issues/592
+			if _, duplicate := catalog.artifactByScheme[scheme.ID]; duplicate {
+				if artifact.GroupID != "org.apache.camel.quarkus" {
+					continue
+				}
+			}
+
 			catalog.artifactByScheme[scheme.ID] = id
 			catalog.schemesByID[scheme.ID] = scheme
 		}
diff --git a/proposals/provided-kamelets.adoc b/proposals/provided-kamelets.adoc
new file mode 100644
index 000000000..a3af111c3
--- /dev/null
+++ b/proposals/provided-kamelets.adoc
@@ -0,0 +1,83 @@
+---
+title: Provided Kamelets
+authors:
+  - "@nicolaferraro"
+creation-date: 2021-01-29
+last-updated: 2021-01-29
+status: implementable
+see-also: []
+replaces: []
+superseded-by: []
+---
+
+[[provided-kamelets]]
+= Provided Kamelets
+
+== Summary
+
+As Apache Camel, we offer several components (300+) that can be used out-of-the-box in Camel K. Each one of them implements connection for a single
+system/protocol and usually provides access to several features (hence the component configuration is usually over-complicated).
+We also have defined the concept of Kamelet, that differently from a component, is an higher level resource and satisfies a single use case and provides a
+simple configuration. A Kamelet can also use one or more components in its definition, to make the distinction clearer.
+
+In parallel to the component catalog, I think it's a good idea to offer also a catalog of **"Apache Camel Kamelets"**.
+
+== Motivation
+
+There are several platforms that may benefit from a Kamelet Catalog that is embedded in Camel K:
+
+- The Knative team is https://github.com/knative-sandbox/kn-plugin-source-kamelet[thinking to integrate Kamelets into the `kn` CLI]: that plugin would query the
+kamelets present in a Cluster and allow to instantiate sources from them.
+- The OpenShift console https://github.com/openshift/console/pull/7344[has already merged support for Kamelets in next 4.7 release]: the console will display
+Kamelets among available sources and allow users to configure them and bind them to a destination.
+- Other platforms are encouraged to use the Kamelet model for ingress/egress use cases.
+
+As we move forward, we may want to build together a Catalog of curated Kamelets that people can leverage when using any platform that is powered by Camel K.
+
+== Goals
+
+- Involve the community into the creation of a Kamelet catalog, giving them means and examples on how to contribute new Kamelets and related tests,
+ to ensure we don't break them as we move forward.
+- Make sure that when Camel K is installed on a cluster, tools and platforms can query the Kubernetes API to find installed Kamelets and use them.
+- Make sure that Kamelets can be also used in `local run` executions.
+
+== Non-Goals
+
+- We don't want to auto-generate Kamelets from components, the Kamelet catalog should focus on common use-cases and grow with users needs.
+
+== Current state
+
+There's a procedure to embed Kamelets in the operator, but it's not used.
+
+The current implementation currently looks up Kamelets in the current namespace first, then in the operator namespace (in case it's different), then
+it does a lookup on the `master` branch in https://github.com/apache/camel-kamelets to search for a specific Kamelet when used.
+This causes problems because it's not difficult to hit rate limiting on using the Github APIs. There's a cache to avoid too many requests, but it's not always sufficient.
+
+== Proposal
+
+We should start to add Kamelets to https://github.com/apache/camel-kamelets, and help people contributing their own.
+
+The Kamelet Catalog can be periodically versioned upon need by different projects that use Kamelets. We can use semantic version to signal
+when there's some breaking change in one or more Kamelets, or when a Kamelet uses a feature that is not present in the current version of Camel K (or other projects, when they'll support Kamelets).
+
+A Camel K release should always reference a specific tag of the Kamelet catalog. At release time (or before, to let the CI test them),
+the Catalog from the git repository is embedded into the `kamel` binary (both CLI and operator).
+
+When the operator starts, it should sync the embedded Kamelet catalog into the operator namespace, replacing
+old Kamelets in case of name clash (e.g. upgrade).
+
+In case of `kamel local run`, the CLI will use the catalog embedded in the CLI.
+
+The option to use a remote git catalog can be left as optional to let users plug their own Kamelets.
+
+== Problems and alternatives
+
+In this proposal, the Kamelet catalog is the same for the lifetime of a specific Camel K release, there's no way to upgrade the catalog without a new release
+(talking about the provided Kamelets here, people are always free to `kubectl apply` their own Kamelets into the cluster).
+
+We can leave the dynamic lookup on Github (implemented in 1.3), but multiple users will hit rate limits.
+
+Another issue of dynamic lookup is that tools and platforms cannot query the Kubernetes API to obtain the list of Kamelets, but they need to
+query Github as well.
+
+We can think of a different packaging mechanism for the Kamelet catalog, e.g. an additional container image, but the `local run` use case would be worse.


Test patch:
diff --git a/e2e/yaks/openshift/monitoring/monitoringResources.sh b/e2e/yaks/openshift/monitoring/monitoringResources.sh
new file mode 100644
index 000000000..3c11d9d5a
--- /dev/null
+++ b/e2e/yaks/openshift/monitoring/monitoringResources.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# 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.
+
+SOURCE_DIR=$( dirname "${BASH_SOURCE[0]}")
+RESOURCES_FOLDER="${SOURCE_DIR}/resources"
+oc create -n ${YAKS_NAMESPACE} -f $RESOURCES_FOLDER/operator-pod-monitor.yaml
+oc create -n ${YAKS_NAMESPACE} -f $RESOURCES_FOLDER/operator-prometheus-rule.yaml
\ No newline at end of file
diff --git a/e2e/yaks/openshift/monitoring/resources/operator-pod-monitor.yaml b/e2e/yaks/openshift/monitoring/resources/operator-pod-monitor.yaml
new file mode 100644
index 000000000..f0d9e6030
--- /dev/null
+++ b/e2e/yaks/openshift/monitoring/resources/operator-pod-monitor.yaml
@@ -0,0 +1,31 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+
+apiVersion: monitoring.coreos.com/v1
+kind: PodMonitor
+metadata:
+  name: camel-k-operator
+  labels:
+    app: "camel-k"
+    camel.apache.org/component: operator
+spec:
+  selector:
+    matchLabels:
+      app: "camel-k"
+      camel.apache.org/component: operator
+  podMetricsEndpoints:
+    - port: metrics
\ No newline at end of file
diff --git a/e2e/yaks/openshift/monitoring/resources/operator-prometheus-rule.yaml b/e2e/yaks/openshift/monitoring/resources/operator-prometheus-rule.yaml
new file mode 100644
index 000000000..2e00f68f5
--- /dev/null
+++ b/e2e/yaks/openshift/monitoring/resources/operator-prometheus-rule.yaml
@@ -0,0 +1,145 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+  name: camel-k-operator
+spec:
+  groups:
+    - name: camel-k-operator
+      rules:
+        - alert: CamelKReconciliationDuration
+          expr: |
+            (
+            1 - sum(rate(camel_k_reconciliation_duration_seconds_bucket{le="0.5"}[5m])) by (job)
+            /
+            sum(rate(camel_k_reconciliation_duration_seconds_count[5m])) by (job)
+            )
+            * 100
+            > 10
+          for: 1m
+          labels:
+            severity: warning
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the reconciliation requests
+              for {{ $labels.job }} have their duration above 0.5s.
+        - alert: CamelKReconciliationFailure
+          expr: |
+            sum(rate(camel_k_reconciliation_duration_seconds_count{result="Errored"}[5m])) by (job)
+            /
+            sum(rate(camel_k_reconciliation_duration_seconds_count[5m])) by (job)
+            * 100
+            > 1
+          for: 10m
+          labels:
+            severity: warning
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the reconciliation requests
+              for {{ $labels.job }} have failed.
+        - alert: CamelKSuccessBuildDuration2m
+          expr: |
+            (
+            1 - sum(rate(camel_k_build_duration_seconds_bucket{le="120",result="Succeeded"}[5m])) by (job)
+            /
+            sum(rate(camel_k_build_duration_seconds_count{result="Succeeded"}[5m])) by (job)
+            )
+            * 100
+            > 10
+          for: 1m
+          labels:
+            severity: warning
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the successful builds
+              for {{ $labels.job }} have their duration above 2m.
+        - alert: CamelKSuccessBuildDuration5m
+          expr: |
+            (
+            1 - sum(rate(camel_k_build_duration_seconds_bucket{le="300",result="Succeeded"}[5m])) by (job)
+            /
+            sum(rate(camel_k_build_duration_seconds_count{result="Succeeded"}[5m])) by (job)
+            )
+            * 100
+            > 1
+          for: 1m
+          labels:
+            severity: critical
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the successful builds
+              for {{ $labels.job }} have their duration above 5m.
+        - alert: CamelKBuildFailure
+          expr: |
+            sum(rate(camel_k_build_duration_seconds_count{result="Failed"}[5m])) by (job)
+            /
+            sum(rate(camel_k_build_duration_seconds_count[5m])) by (job)
+            * 100
+            > 1
+          for: 10m
+          labels:
+            severity: warning
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the builds for {{ $labels.job }} have failed.
+        - alert: CamelKBuildError
+          expr: |
+            sum(rate(camel_k_build_duration_seconds_count{result="Error"}[5m])) by (job)
+            /
+            sum(rate(camel_k_build_duration_seconds_count[5m])) by (job)
+            * 100
+            > 1
+          for: 10m
+          labels:
+            severity: critical
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the builds for {{ $labels.job }} have errored.
+        - alert: CamelKBuildQueueDuration1m
+          expr: |
+            (
+            1 - sum(rate(camel_k_build_queue_duration_seconds_bucket{le="60"}[5m])) by (job)
+            /
+            sum(rate(camel_k_build_queue_duration_seconds_count[5m])) by (job)
+            )
+            * 100
+            > 1
+          for: 1m
+          labels:
+            severity: warning
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the builds for {{ $labels.job }}
+              have been queued for more than 1m.
+        - alert: CamelKBuildQueueDuration5m
+          expr: |
+            (
+            1 - sum(rate(camel_k_build_queue_duration_seconds_bucket{le="300"}[5m])) by (job)
+            /
+            sum(rate(camel_k_build_queue_duration_seconds_count[5m])) by (job)
+            )
+            * 100
+            > 1
+          for: 1m
+          labels:
+            severity: critical
+          annotations:
+            message: |
+              {{ printf "%0.0f" $value }}% of the builds for {{ $labels.job }}
+              have been queued for more than 5m.
\ No newline at end of file
diff --git a/e2e/yaks/openshift/monitoring/yaks-config.yaml b/e2e/yaks/openshift/monitoring/yaks-config.yaml
index 242ae0564..b29f76bf4 100644
--- a/e2e/yaks/openshift/monitoring/yaks-config.yaml
+++ b/e2e/yaks/openshift/monitoring/yaks-config.yaml
@@ -23,7 +23,9 @@ pre:
     script: ./obtainToken.sh
   - name: Camel-k install
     run: |
-      kamel install -w -n ${YAKS_NAMESPACE} --monitoring=true
+      kamel install -w -n ${YAKS_NAMESPACE}
+  - name: Setup monitoring resources
+    script: ./monitoringResources.sh
   - name: Dependency install
     script: ./dependencyInstall.sh
   - name: Integration run
diff --git a/pkg/trait/quarkus_test.go b/pkg/trait/quarkus_test.go
index 9ee8ae9ab..9061f574f 100644
--- a/pkg/trait/quarkus_test.go
+++ b/pkg/trait/quarkus_test.go
@@ -20,11 +20,11 @@ package trait
 import (
 	"testing"
 
-	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/stretchr/testify/assert"
 
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/builder"
 	"github.com/apache/camel-k/pkg/util/camel"
-	"github.com/stretchr/testify/assert"
 )
 
 func TestConfigureQuarkusTraitShouldSucceed(t *testing.T) {
@@ -57,13 +57,12 @@ func TestApplyQuarkusTraitDoesNothing(t *testing.T) {
 func TestQuarkusTraitAddBuildStepsShouldSucceed(t *testing.T) {
 	quarkusTrait, _ := createNominalQuarkusTest()
 
-	task := &v1.BuilderTask{
-		Steps: builder.StepIDsFor(builder.DefaultSteps...),
-	}
+	steps := make([]builder.Step, 0)
+	steps = append(steps, builder.DefaultSteps...)
 
-	quarkusTrait.addBuildSteps(task)
+	quarkusTrait.addBuildSteps(&steps)
 
-	assert.Len(t, task.Steps, 9)
+	assert.Len(t, steps, 9)
 }
 
 func createNominalQuarkusTest() (*quarkusTrait, *Environment) {