You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2021/03/05 11:46:47 UTC

[camel-k] branch master updated (b7e6b9d -> 629c302)

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

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


    from b7e6b9d  Add missing classpath locations for external kits
     new 58b9141  chore: Upgrade controller-runtime to version 0.7.2
     new 0c24b3f  chore: Remove uneeded DeepCopyObject calls before Update/Patch
     new 2b06b9a  fix: Do not rely on default controller-runtime EventBroadcaster
     new 3a3b0bc  fix: Do not sink events when the operator lacks Event permissions
     new 629c302  fix: Events sink is already started by controller runtime

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


Summary of changes:
 addons/master/master.go                            |   5 +-
 e2e/common/traits/pdb_test.go                      |   6 +-
 e2e/support/test_support.go                        |  68 ++++++-------
 go.mod                                             |   9 +-
 go.sum                                             |  33 ++++--
 pkg/builder/s2i/publisher.go                       |   8 +-
 pkg/cmd/install.go                                 |   2 +-
 pkg/cmd/kit_create.go                              |   7 +-
 pkg/cmd/operator/operator.go                       |  32 +++---
 pkg/cmd/run.go                                     |  34 +++----
 pkg/controller/build/build_controller.go           |  21 ++--
 .../integration/integration_controller.go          | 112 +++++++++++----------
 .../integrationkit/integrationkit_controller.go    |  58 +++++------
 .../integrationplatform_controller.go              |  39 +++----
 pkg/controller/kamelet/kamelet_controller.go       |  39 +++----
 .../kameletbinding/kamelet_binding_controller.go   |  39 +++----
 pkg/event/broadcaster.go                           |  62 ++++++++++++
 pkg/install/cluster.go                             |  19 ++--
 pkg/install/common.go                              |  33 +++---
 pkg/install/kamelets.go                            |  30 +++---
 pkg/install/operator.go                            |   3 +-
 pkg/install/secret.go                              |   7 +-
 pkg/platform/defaults.go                           |  26 ++---
 pkg/trait/deployer.go                              |  23 ++---
 pkg/trait/trait_types.go                           |   7 +-
 pkg/util/knative/knative.go                        |  42 ++++----
 pkg/util/kubernetes/collection.go                  |  18 ++--
 pkg/util/kubernetes/loader.go                      |  17 +++-
 pkg/util/kubernetes/replace.go                     |  33 ++----
 pkg/util/kubernetes/wait.go                        |  15 ++-
 pkg/util/maven/maven_settings.go                   |  15 ++-
 pkg/util/maven/maven_settings_test.go              |   5 +-
 pkg/util/monitoring/controller.go                  |   9 +-
 pkg/util/patch/patch.go                            |   5 +-
 34 files changed, 464 insertions(+), 417 deletions(-)
 create mode 100644 pkg/event/broadcaster.go


[camel-k] 05/05: fix: Events sink is already started by controller runtime

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

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

commit 629c30279e864afd64f25f3b2689274412da8c7a
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Thu Mar 4 19:09:43 2021 +0100

    fix: Events sink is already started by controller runtime
---
 pkg/cmd/operator/operator.go | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go
index 1938d28..b7b8698 100644
--- a/pkg/cmd/operator/operator.go
+++ b/pkg/cmd/operator/operator.go
@@ -28,7 +28,6 @@ import (
 	"time"
 
 	corev1 "k8s.io/api/core/v1"
-	typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
 	"k8s.io/client-go/tools/record"
 
 	ctrl "sigs.k8s.io/controller-runtime"
@@ -126,8 +125,6 @@ func Run(healthPort, monitoringPort int32) {
 		} else if !ok {
 			log.Info("Event broadcasting to Kubernetes is disabled because of missing permissions to create events")
 		}
-	} else {
-		broadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.CoreV1().Events(namespace)})
 	}
 
 	mgr, err := ctrl.NewManager(cfg, ctrl.Options{


[camel-k] 01/05: chore: Upgrade controller-runtime to version 0.7.2

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

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

commit 58b91415ca5745ae2f733d714449ed6ceb634730
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Wed Mar 3 10:25:54 2021 +0100

    chore: Upgrade controller-runtime to version 0.7.2
---
 addons/master/master.go                            |   5 +-
 e2e/common/traits/pdb_test.go                      |   6 +-
 e2e/support/test_support.go                        |  68 ++++++-------
 go.mod                                             |   8 +-
 go.sum                                             |  33 ++++--
 pkg/builder/s2i/publisher.go                       |   8 +-
 pkg/cmd/install.go                                 |   2 +-
 pkg/cmd/operator/operator.go                       |   2 +-
 pkg/cmd/run.go                                     |  18 +---
 pkg/controller/build/build_controller.go           |  21 ++--
 .../integration/integration_controller.go          | 112 +++++++++++----------
 .../integrationkit/integrationkit_controller.go    |  58 +++++------
 .../integrationplatform_controller.go              |  39 +++----
 pkg/controller/kamelet/kamelet_controller.go       |  39 +++----
 .../kameletbinding/kamelet_binding_controller.go   |  39 +++----
 pkg/install/cluster.go                             |  19 ++--
 pkg/install/common.go                              |  33 +++---
 pkg/install/kamelets.go                            |  30 +++---
 pkg/install/operator.go                            |   3 +-
 pkg/install/secret.go                              |   7 +-
 pkg/platform/defaults.go                           |  19 ++--
 pkg/trait/deployer.go                              |  18 ++--
 pkg/trait/trait_types.go                           |   7 +-
 pkg/util/knative/knative.go                        |  42 ++++----
 pkg/util/kubernetes/collection.go                  |  18 ++--
 pkg/util/kubernetes/loader.go                      |  17 +++-
 pkg/util/kubernetes/replace.go                     |  33 ++----
 pkg/util/kubernetes/wait.go                        |  15 ++-
 pkg/util/monitoring/controller.go                  |   9 +-
 pkg/util/patch/patch.go                            |   5 +-
 30 files changed, 351 insertions(+), 382 deletions(-)

diff --git a/addons/master/master.go b/addons/master/master.go
index 01e90e5..5bcdd19 100644
--- a/addons/master/master.go
+++ b/addons/master/master.go
@@ -22,6 +22,8 @@ import (
 	"fmt"
 	"strings"
 
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/metadata"
 	"github.com/apache/camel-k/pkg/resources"
@@ -29,7 +31,6 @@ import (
 	"github.com/apache/camel-k/pkg/util"
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 	"github.com/apache/camel-k/pkg/util/uri"
-	"k8s.io/apimachinery/pkg/runtime"
 )
 
 // The Master trait allows to configure the integration to automatically leverage Kubernetes resources for doing
@@ -256,7 +257,7 @@ func findAdditionalDependencies(e *trait.Environment, meta metadata.IntegrationM
 	return dependencies
 }
 
-func loadResource(e *trait.Environment, name string, params interface{}) (runtime.Object, error) {
+func loadResource(e *trait.Environment, name string, params interface{}) (ctrl.Object, error) {
 	data, err := resources.TemplateResource(fmt.Sprintf("/addons/master/%s", name), params)
 	if err != nil {
 		return nil, err
diff --git a/e2e/common/traits/pdb_test.go b/e2e/common/traits/pdb_test.go
index d154289..591e90f 100644
--- a/e2e/common/traits/pdb_test.go
+++ b/e2e/common/traits/pdb_test.go
@@ -155,11 +155,7 @@ func podDisruptionBudget(ns string, name string) func() *policy.PodDisruptionBud
 				Name:      name,
 			},
 		}
-		key, err := client.ObjectKeyFromObject(&pdb)
-		if err != nil {
-			panic(err)
-		}
-		err = TestClient().Get(TestContext, key, &pdb)
+		err := TestClient().Get(TestContext, client.ObjectKeyFromObject(&pdb), &pdb)
 		if err != nil && errors.IsNotFound(err) {
 			return nil
 		} else if err != nil {
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index f9250ca..4ed9ea5 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -44,9 +44,8 @@ import (
 	rbacv1 "k8s.io/api/rbac/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	eventing "knative.dev/eventing/pkg/apis/eventing/v1beta1"
 	messaging "knative.dev/eventing/pkg/apis/messaging/v1beta1"
@@ -280,8 +279,8 @@ func IntegrationPods(ns string, name string) func() []corev1.Pod {
 			},
 		}
 		err := TestClient().List(TestContext, &lst,
-			k8sclient.InNamespace(ns),
-			k8sclient.MatchingLabels{
+			ctrl.InNamespace(ns),
+			ctrl.MatchingLabels{
 				v1.IntegrationLabel: name,
 			})
 		if err != nil {
@@ -328,7 +327,7 @@ func IntegrationCondition(ns string, name string, conditionType v1.IntegrationCo
 func ConfigMap(ns string, name string) func() *corev1.ConfigMap {
 	return func() *corev1.ConfigMap {
 		cm := corev1.ConfigMap{}
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -345,7 +344,7 @@ func ConfigMap(ns string, name string) func() *corev1.ConfigMap {
 func Service(ns string, name string) func() *corev1.Service {
 	return func() *corev1.Service {
 		svc := corev1.Service{}
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -362,7 +361,7 @@ func Service(ns string, name string) func() *corev1.Service {
 func Route(ns string, name string) func() *routev1.Route {
 	return func() *routev1.Route {
 		route := routev1.Route{}
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -385,8 +384,8 @@ func IntegrationCronJob(ns string, name string) func() *v1beta1.CronJob {
 			},
 		}
 		err := TestClient().List(TestContext, &lst,
-			k8sclient.InNamespace(ns),
-			k8sclient.MatchingLabels{
+			ctrl.InNamespace(ns),
+			ctrl.MatchingLabels{
 				"camel.apache.org/integration": name,
 			})
 		if err != nil {
@@ -402,7 +401,7 @@ func IntegrationCronJob(ns string, name string) func() *v1beta1.CronJob {
 func Integration(ns string, name string) func() *v1.Integration {
 	return func() *v1.Integration {
 		it := v1.NewIntegration(ns, name)
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -495,7 +494,7 @@ func ScaleIntegration(ns string, name string, replicas int32) error {
 func Kits(ns string) func() []v1.IntegrationKit {
 	return func() []v1.IntegrationKit {
 		lst := v1.NewIntegrationKitList()
-		if err := TestClient().List(TestContext, &lst, k8sclient.InNamespace(ns)); err != nil {
+		if err := TestClient().List(TestContext, &lst, ctrl.InNamespace(ns)); err != nil {
 			panic(err)
 		}
 		return lst.Items
@@ -559,7 +558,7 @@ func Configmap(ns string, name string) func() *corev1.ConfigMap {
 				Name:      name,
 			},
 		}
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -585,7 +584,7 @@ func KnativeService(ns string, name string) func() *servingv1.Service {
 				Name:      name,
 			},
 		}
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -611,7 +610,7 @@ func Deployment(ns string, name string) func() *appsv1.Deployment {
 				Name:      name,
 			},
 		}
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -628,7 +627,7 @@ func Deployment(ns string, name string) func() *appsv1.Deployment {
 func Build(ns string, name string) func() *v1.Build {
 	return func() *v1.Build {
 		build := v1.NewBuild(ns, name)
-		key := k8sclient.ObjectKey{
+		key := ctrl.ObjectKey{
 			Namespace: ns,
 			Name:      name,
 		}
@@ -645,7 +644,7 @@ func Build(ns string, name string) func() *v1.Build {
 func Platform(ns string) func() *v1.IntegrationPlatform {
 	return func() *v1.IntegrationPlatform {
 		lst := v1.NewIntegrationPlatformList()
-		if err := TestClient().List(TestContext, &lst, k8sclient.InNamespace(ns)); err != nil {
+		if err := TestClient().List(TestContext, &lst, ctrl.InNamespace(ns)); err != nil {
 			panic(err)
 		}
 		if len(lst.Items) == 0 {
@@ -722,8 +721,8 @@ func OperatorPod(ns string) func() *corev1.Pod {
 			},
 		}
 		err := TestClient().List(TestContext, &lst,
-			k8sclient.InNamespace(ns),
-			k8sclient.MatchingLabels{
+			ctrl.InNamespace(ns),
+			ctrl.MatchingLabels{
 				"camel.apache.org/component": "operator",
 			})
 		if err != nil {
@@ -739,7 +738,7 @@ func OperatorPod(ns string) func() *corev1.Pod {
 func OperatorTryPodForceKill(ns string, timeSeconds int) {
 	pod := OperatorPod(ns)()
 	if pod != nil {
-		if err := TestClient().Delete(TestContext, pod, k8sclient.GracePeriodSeconds(timeSeconds)); err != nil {
+		if err := TestClient().Delete(TestContext, pod, ctrl.GracePeriodSeconds(timeSeconds)); err != nil {
 			log.Error(err, "cannot forcefully kill the pod")
 		}
 	}
@@ -752,7 +751,7 @@ func ScaleOperator(ns string, replicas int32) func() error {
 			return err
 		}
 		operator.Spec.Replicas = &replicas
-		_, err = TestClient().AppsV1().Deployments(ns).Update(TestContext,operator, metav1.UpdateOptions{})
+		_, err = TestClient().AppsV1().Deployments(ns).Update(TestContext, operator, metav1.UpdateOptions{})
 		if err != nil {
 			return err
 		}
@@ -774,8 +773,8 @@ func Role(ns string) func() *rbacv1.Role {
 			},
 		}
 		err := TestClient().List(TestContext, &lst,
-			k8sclient.InNamespace(ns),
-			k8sclient.MatchingLabels{
+			ctrl.InNamespace(ns),
+			ctrl.MatchingLabels{
 				"app": "camel-k",
 			})
 		if err != nil {
@@ -797,8 +796,8 @@ func RoleBinding(ns string) func() *rbacv1.RoleBinding {
 			},
 		}
 		err := TestClient().List(TestContext, &lst,
-			k8sclient.InNamespace(ns),
-			k8sclient.MatchingLabels{
+			ctrl.InNamespace(ns),
+			ctrl.MatchingLabels{
 				"app": "camel-k",
 			})
 		if err != nil {
@@ -820,8 +819,8 @@ func ServiceAccount(ns, name string) func() *corev1.ServiceAccount {
 			},
 		}
 		err := TestClient().List(TestContext, &lst,
-			k8sclient.InNamespace(ns),
-			k8sclient.MatchingLabels{
+			ctrl.InNamespace(ns),
+			ctrl.MatchingLabels{
 				"app": "camel-k",
 			})
 		if err != nil {
@@ -1035,7 +1034,7 @@ func NumPods(ns string) func() int {
 				APIVersion: v1.SchemeGroupVersion.String(),
 			},
 		}
-		if err := TestClient().List(TestContext, &lst, k8sclient.InNamespace(ns)); err != nil && k8serrors.IsUnauthorized(err) {
+		if err := TestClient().List(TestContext, &lst, ctrl.InNamespace(ns)); err != nil && k8serrors.IsUnauthorized(err) {
 			return 0
 		} else if err != nil {
 			log.Error(err, "Error while listing the pods")
@@ -1101,10 +1100,7 @@ func DeleteKnativeBroker(ns metav1.Object) {
 			Name: ns.GetName(),
 		},
 	}
-	nsKey, err := k8sclient.ObjectKeyFromObject(&nsRef)
-	if err != nil {
-		panic(err)
-	}
+	nsKey := ctrl.ObjectKeyFromObject(&nsRef)
 	if err := TestClient().Get(TestContext, nsKey, &nsRef); err != nil {
 		panic(err)
 	}
@@ -1128,7 +1124,7 @@ func DeleteKnativeBroker(ns metav1.Object) {
 	}
 }
 
-func DeleteTestNamespace(t *testing.T, ns metav1.Object) {
+func DeleteTestNamespace(t *testing.T, ns ctrl.Object) {
 	var oc bool
 	var err error
 	if oc, err = openshift.IsOpenShift(TestClient()); err != nil {
@@ -1147,7 +1143,7 @@ func DeleteTestNamespace(t *testing.T, ns metav1.Object) {
 			t.Logf("Warning: cannot delete test project %q", prj.Name)
 		}
 	} else {
-		if err := TestClient().Delete(TestContext, ns.(runtime.Object)); err != nil {
+		if err := TestClient().Delete(TestContext, ns); err != nil {
 			t.Logf("Warning: cannot delete test namespace %q", ns.GetName())
 		}
 	}
@@ -1163,10 +1159,10 @@ func DeleteTestNamespace(t *testing.T, ns metav1.Object) {
 	}
 }
 
-func NewTestNamespace(injectKnativeBroker bool) metav1.Object {
+func NewTestNamespace(injectKnativeBroker bool) ctrl.Object {
 	var err error
 	var oc bool
-	var obj runtime.Object
+	var obj ctrl.Object
 
 	brokerLabel := "eventing.knative.dev/injection"
 	name := "test-" + uuid.New().String()
@@ -1222,5 +1218,5 @@ func NewTestNamespace(injectKnativeBroker bool) metav1.Object {
 			}
 		}
 	}
-	return obj.(metav1.Object)
+	return obj
 }
diff --git a/go.mod b/go.mod
index d2c31e8..a8ded7a 100644
--- a/go.mod
+++ b/go.mod
@@ -37,7 +37,7 @@ require (
 	github.com/spf13/cobra v1.0.0
 	github.com/spf13/pflag v1.0.5
 	github.com/spf13/viper v1.6.2
-	github.com/stoewer/go-strcase v1.0.2
+	github.com/stoewer/go-strcase v1.2.0
 	github.com/stretchr/testify v1.6.1
 	go.uber.org/multierr v1.5.0
 	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
@@ -51,13 +51,9 @@ require (
 	knative.dev/eventing v0.18.0
 	knative.dev/pkg v0.0.0-20200922164940-4bf40ad82aab
 	knative.dev/serving v0.18.0
-	sigs.k8s.io/controller-runtime v0.6.4
+	sigs.k8s.io/controller-runtime v0.7.2
 )
 
-// To be removed when upgrading to controller-runtime 0.7+
-// See: https://github.com/kubernetes-sigs/controller-runtime/pull/1238
-replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.6.3
-
 replace (
 	github.com/Azure/go-autorest => github.com/Azure/go-autorest v13.3.2+incompatible // Required by client-go Azure plugin
 	k8s.io/client-go => k8s.io/client-go v0.19.8
diff --git a/go.sum b/go.sum
index f398a4a..899c3e1 100644
--- a/go.sum
+++ b/go.sum
@@ -259,8 +259,6 @@ github.com/cloudevents/sdk-go/v2 v2.0.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoa
 github.com/cloudevents/sdk-go/v2 v2.2.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
-github.com/container-tools/spectrum v0.3.2 h1:KQz70RWAzITzaPx+qPsiGkrF0uGmFJfKak2yOqJyPKQ=
-github.com/container-tools/spectrum v0.3.2/go.mod h1:hsogRHNfGQLysCyDiGT4SAioTS8LGLbyC4b0Ep2Iw+o=
 github.com/container-tools/spectrum v0.3.4 h1:ykSzjjIbmwy/dQKyaTRNf69gqSx5rB/XwjuYhOspJSY=
 github.com/container-tools/spectrum v0.3.4/go.mod h1:hsogRHNfGQLysCyDiGT4SAioTS8LGLbyC4b0Ep2Iw+o=
 github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
@@ -415,6 +413,7 @@ github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
 github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
 github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE=
 github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
+github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU=
 github.com/go-logr/zapr v0.3.0 h1:iyiCRZ29uPmbO7mWIjOEiYMXrTxZWTyK4tCatLyGpUY=
 github.com/go-logr/zapr v0.3.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU=
 github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
@@ -511,6 +510,7 @@ github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hz
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 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-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -626,6 +626,8 @@ github.com/googleapis/gnostic v0.4.0 h1:BXDUo8p/DaxC+4FJY/SSx3gvnx9C1VdHNgaUkiEL
 github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
 github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM=
+github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -693,6 +695,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
 github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
 github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
@@ -1122,6 +1125,7 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@@ -1133,8 +1137,8 @@ github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E=
 github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
 github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A=
 github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
-github.com/stoewer/go-strcase v1.0.2 h1:l3iQ2FPu8+36ars/7syO1dQAkjwMCb1IE3J+Th0ohfE=
-github.com/stoewer/go-strcase v1.0.2/go.mod h1:eLfe5bL3qbL7ep/KafHzthxejrOF5J3xmt03uL5tzek=
+github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
+github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
 github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
 github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -1232,6 +1236,8 @@ go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA=
+go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
+go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
@@ -1441,6 +1447,7 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1539,6 +1546,7 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112005509-a3f652f18032/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1816,6 +1824,8 @@ gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d h1:LCPbGQ34PMrwad11aMZ+dbz5S
 gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
@@ -1934,6 +1944,7 @@ k8s.io/component-base v0.18.4/go.mod h1:7jr/Ef5PGmKwQhyAz/pjByxJbC58mhKAhiaDu0vX
 k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14=
 k8s.io/component-base v0.18.8/go.mod h1:00frPRDas29rx58pPCxNkhUfPbwajlyyvu8ruNgSErU=
 k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo=
+k8s.io/component-base v0.19.8 h1:z5NvhzEjdjTwXWF2qMdozKXbUCEm9HXGGNp51buf4HA=
 k8s.io/component-base v0.19.8/go.mod h1:cvHAT4oGxKsfcnnm0hMp3JkEMxAt5s6le943V796FXM=
 k8s.io/csi-translation-lib v0.17.0/go.mod h1:HEF7MEz7pOLJCnxabi45IPkhSsE/KmxPQksuCrHKWls=
 k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo=
@@ -1951,6 +1962,7 @@ k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
+k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
@@ -1994,6 +2006,8 @@ k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7Mpm
 k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20200912215256-4140de9c8800 h1:9ZNvfPvVIEsp/T1ez4GQuzCcCTEQWhovSofhqR73A6g=
+k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
 knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
 knative.dev/caching v0.0.0-20200922173540-a6b8bbd6999a/go.mod h1:P624eQ2AZLjwPBRuSqlnkWjRYoVeGdZ/uGXPrYP/USk=
@@ -2038,8 +2052,14 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQb
 sigs.k8s.io/boskos v0.0.0-20200526191642-45fc818e2d00/go.mod h1:L1ubP7d1CCMSQSjKiZv6dGbh7b4kfoG+dFPj8cfYDnI=
 sigs.k8s.io/boskos v0.0.0-20200617235605-f289ba6555ba/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE=
 sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE=
-sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE=
-sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY=
+sigs.k8s.io/controller-runtime v0.3.0/go.mod h1:Cw6PkEg0Sa7dAYovGT4R0tRkGhHXpYijwNxYhAnAZZk=
+sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8=
+sigs.k8s.io/controller-runtime v0.5.4/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A=
+sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo=
+sigs.k8s.io/controller-runtime v0.6.1/go.mod h1:XRYBPdbf5XJu9kpS84VJiZ7h/u1hF3gEORz0efEja7A=
+sigs.k8s.io/controller-runtime v0.6.4/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY=
+sigs.k8s.io/controller-runtime v0.7.2 h1:gD2JZp0bBLLuvSRYVNvox+bRCz1UUUxKDjPUCb56Ukk=
+sigs.k8s.io/controller-runtime v0.7.2/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU=
 sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI=
 sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
 sigs.k8s.io/structured-merge-diff v0.0.0-20190302045857-e85c7b244fd2/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
@@ -2056,6 +2076,7 @@ sigs.k8s.io/structured-merge-diff/v3 v3.0.1-0.20200706213357-43c19bbb7fba h1:AAb
 sigs.k8s.io/structured-merge-diff/v3 v3.0.1-0.20200706213357-43c19bbb7fba/go.mod h1:V06abazjHneE37ZdSY/UUwPVgcJMKI/jU5XGUjgIKoc=
 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/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U=
 sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
diff --git a/pkg/builder/s2i/publisher.go b/pkg/builder/s2i/publisher.go
index d6a40a3..cdeda0d 100644
--- a/pkg/builder/s2i/publisher.go
+++ b/pkg/builder/s2i/publisher.go
@@ -29,7 +29,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/json"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	buildv1 "github.com/openshift/api/build/v1"
 	imagev1 "github.com/openshift/api/image/v1"
@@ -175,11 +175,7 @@ func publisher(ctx *builder.Context) error {
 		return err
 	}
 
-	key, err := k8sclient.ObjectKeyFromObject(&is)
-	if err != nil {
-		return err
-	}
-	err = ctx.Client.Get(ctx.C, key, &is)
+	err = ctx.Client.Get(ctx.C, ctrl.ObjectKeyFromObject(&is), &is)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index 4252c75..9728ffc 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -370,7 +370,7 @@ func (o *installCmdOptions) install(cobraCmd *cobra.Command, _ []string) error {
 		}
 
 		// Always create a platform in the namespace where the operator is located
-		err = install.RuntimeObjectOrCollect(o.Context, c, namespace, collection, o.Force, platform)
+		err = install.ObjectOrCollect(o.Context, c, namespace, collection, o.Force, platform)
 		if err != nil {
 			return err
 		}
diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go
index fb4a7c2..39253a0 100644
--- a/pkg/cmd/operator/operator.go
+++ b/pkg/cmd/operator/operator.go
@@ -27,7 +27,6 @@ import (
 	"strconv"
 	"time"
 
-	"github.com/apache/camel-k/pkg/platform"
 	corev1 "k8s.io/api/core/v1"
 	typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
 	"k8s.io/client-go/tools/record"
@@ -45,6 +44,7 @@ import (
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/controller"
 	"github.com/apache/camel-k/pkg/install"
+	"github.com/apache/camel-k/pkg/platform"
 	"github.com/apache/camel-k/pkg/util/defaults"
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 )
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index 87e3ac8..bf6ad39 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -39,7 +39,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/client"
@@ -302,12 +302,7 @@ func (o *runCmdOptions) run(cmd *cobra.Command, args []string) error {
 
 			// The integration watch timed out so recreate it using the latest integration resource version
 			clone := integration.DeepCopy()
-			var key k8sclient.ObjectKey
-			key, err = k8sclient.ObjectKeyFromObject(clone)
-			if err != nil {
-				return err
-			}
-			err = c.Get(o.Context, key, clone)
+			err = c.Get(o.Context, ctrl.ObjectKeyFromObject(clone), clone)
 			if err != nil {
 				return err
 			}
@@ -429,7 +424,7 @@ func (o *runCmdOptions) createIntegration(c client.Client, sources []string, cat
 	return o.updateIntegrationCode(c, sources, catalog)
 }
 
-//nolint: gocyclo
+// nolint: gocyclo
 func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string, catalog *trait.Catalog) (*v1.Integration, error) {
 	namespace := o.Namespace
 
@@ -590,12 +585,7 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 	if err != nil && k8serrors.IsAlreadyExists(err) {
 		existed = true
 		clone := integration.DeepCopy()
-		var key k8sclient.ObjectKey
-		key, err = k8sclient.ObjectKeyFromObject(clone)
-		if err != nil {
-			return nil, err
-		}
-		err = c.Get(o.Context, key, clone)
+		err = c.Get(o.Context, ctrl.ObjectKeyFromObject(clone), clone)
 		if err != nil {
 			return nil, err
 		}
diff --git a/pkg/controller/build/build_controller.go b/pkg/controller/build/build_controller.go
index b77e23c..341c909 100644
--- a/pkg/controller/build/build_controller.go
+++ b/pkg/controller/build/build_controller.go
@@ -25,10 +25,10 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/client-go/tools/record"
 
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -82,7 +82,8 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch for changes to primary resource Build
-	err = c.Watch(&source.Kind{Type: &v1.Build{}}, &handler.EnqueueRequestForObject{},
+	err = c.Watch(&source.Kind{Type: &v1.Build{}},
+		&handler.EnqueueRequestForObject{},
 		predicate.Funcs{
 			UpdateFunc: func(e event.UpdateEvent) bool {
 				oldBuild := e.ObjectOld.(*v1.Build)
@@ -93,7 +94,8 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 				return oldBuild.Generation != newBuild.Generation ||
 					oldBuild.Status.Phase != newBuild.Status.Phase
 			},
-		})
+		},
+	)
 	if err != nil {
 		return err
 	}
@@ -112,7 +114,8 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 				// as it's used to transition the builds from one phase to another
 				return oldPod.Status.Phase != newPod.Status.Phase
 			},
-		})
+		},
+	)
 	if err != nil {
 		return err
 	}
@@ -129,7 +132,7 @@ type reconcileBuild struct {
 	client client.Client
 	// Non-caching client to be used whenever caching may cause race conditions,
 	// like in the builds scheduling critical section
-	reader   k8sclient.Reader
+	reader   ctrl.Reader
 	scheme   *runtime.Scheme
 	builder  builder.Builder
 	routines sync.Map
@@ -141,12 +144,10 @@ type reconcileBuild struct {
 // Note:
 // The Controller will requeue the Request to be processed again if the returned error is non-nil or
 // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *reconcileBuild) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *reconcileBuild) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
 	rlog.Info("Reconciling Build")
 
-	ctx := context.TODO()
-
 	// Make sure the operator is allowed to act on namespace
 	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
 		return reconcile.Result{}, err
@@ -265,7 +266,7 @@ func (r *reconcileBuild) Reconcile(request reconcile.Request) (reconcile.Result,
 }
 
 func (r *reconcileBuild) update(ctx context.Context, base *v1.Build, target *v1.Build) (reconcile.Result, error) {
-	err := r.client.Status().Patch(ctx, target, k8sclient.MergeFrom(base))
+	err := r.client.Status().Patch(ctx, target, ctrl.MergeFrom(base))
 
 	return reconcile.Result{}, err
 }
diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go
index abe0d90..ff8c8ed 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/record"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -76,29 +76,32 @@ func newReconciler(mgr manager.Manager, c client.Client) reconcile.Reconciler {
 }
 
 // add adds a new Controller to mgr with r as the reconcile.Reconciler
-func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
+func add(mgr manager.Manager, r reconcile.Reconciler, cl client.Client) error {
 	// Create a new controller
-	ctrl, err := controller.New("integration-controller", mgr, controller.Options{Reconciler: r})
+	c, err := controller.New("integration-controller", mgr, controller.Options{Reconciler: r})
 	if err != nil {
 		return err
 	}
 
 	// Watch for changes to primary resource Integration
-	err = ctrl.Watch(&source.Kind{Type: &v1.Integration{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
-		UpdateFunc: func(e event.UpdateEvent) bool {
-			oldIntegration := e.ObjectOld.(*v1.Integration)
-			newIntegration := e.ObjectNew.(*v1.Integration)
-			// Ignore updates to the integration status in which case metadata.Generation does not change,
-			// or except when the integration phase changes as it's used to transition from one phase
-			// to another
-			return oldIntegration.Generation != newIntegration.Generation ||
-				oldIntegration.Status.Phase != newIntegration.Status.Phase
+	err = c.Watch(&source.Kind{Type: &v1.Integration{}},
+		&handler.EnqueueRequestForObject{},
+		predicate.Funcs{
+			UpdateFunc: func(e event.UpdateEvent) bool {
+				oldIntegration := e.ObjectOld.(*v1.Integration)
+				newIntegration := e.ObjectNew.(*v1.Integration)
+				// Ignore updates to the integration status in which case metadata.Generation does not change,
+				// or except when the integration phase changes as it's used to transition from one phase
+				// to another
+				return oldIntegration.Generation != newIntegration.Generation ||
+					oldIntegration.Status.Phase != newIntegration.Status.Phase
+			},
+			DeleteFunc: func(e event.DeleteEvent) bool {
+				// Evaluates to false if the object has been confirmed deleted
+				return !e.DeleteStateUnknown
+			},
 		},
-		DeleteFunc: func(e event.DeleteEvent) bool {
-			// Evaluates to false if the object has been confirmed deleted
-			return !e.DeleteStateUnknown
-		},
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -106,18 +109,18 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 	// Watch for IntegrationKit phase transitioning to ready or error and
 	// enqueue requests for any integrations that are in phase waiting for
 	// kit
-	err = ctrl.Watch(&source.Kind{Type: &v1.IntegrationKit{}}, &handler.EnqueueRequestsFromMapFunc{
-		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
-			kit := a.Object.(*v1.IntegrationKit)
+	err = c.Watch(&source.Kind{Type: &v1.IntegrationKit{}},
+		handler.EnqueueRequestsFromMapFunc(func(a ctrl.Object) []reconcile.Request {
+			kit := a.(*v1.IntegrationKit)
 			var requests []reconcile.Request
 
 			if kit.Status.Phase == v1.IntegrationKitPhaseReady || kit.Status.Phase == v1.IntegrationKitPhaseError {
 				list := &v1.IntegrationList{}
 
 				// Do global search in case of global operator (it may be using a global platform)
-				var opts []k8sclient.ListOption
+				var opts []ctrl.ListOption
 				if !platform.IsCurrentOperatorGlobal() {
-					opts = append(opts, k8sclient.InNamespace(kit.Namespace))
+					opts = append(opts, ctrl.InNamespace(kit.Namespace))
 				}
 
 				if err := mgr.GetClient().List(context.TODO(), list, opts...); err != nil {
@@ -141,35 +144,35 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 
 			return requests
 		}),
-	})
+	)
 	if err != nil {
 		return err
 	}
 
 	// Watch for IntegrationPlatform phase transitioning to ready and enqueue
 	// requests for any integrations that are in phase waiting for platform
-	err = ctrl.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}}, &handler.EnqueueRequestsFromMapFunc{
-		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
-			pl := a.Object.(*v1.IntegrationPlatform)
+	err = c.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}},
+		handler.EnqueueRequestsFromMapFunc(func(a ctrl.Object) []reconcile.Request {
+			p := a.(*v1.IntegrationPlatform)
 			var requests []reconcile.Request
 
-			if pl.Status.Phase == v1.IntegrationPlatformPhaseReady {
+			if p.Status.Phase == v1.IntegrationPlatformPhaseReady {
 				list := &v1.IntegrationList{}
 
 				// Do global search in case of global operator (it may be using a global platform)
-				var opts []k8sclient.ListOption
+				var opts []ctrl.ListOption
 				if !platform.IsCurrentOperatorGlobal() {
-					opts = append(opts, k8sclient.InNamespace(pl.Namespace))
+					opts = append(opts, ctrl.InNamespace(p.Namespace))
 				}
 
 				if err := mgr.GetClient().List(context.TODO(), list, opts...); err != nil {
-					log.Error(err, "Failed to retrieve integration list")
+					log.Error(err, "Failed to list integrations")
 					return requests
 				}
 
 				for _, integration := range list.Items {
 					if integration.Status.Phase == v1.IntegrationPhaseWaitingForPlatform {
-						log.Infof("Platform %s ready, wake-up integration: %s", pl.Name, integration.Name)
+						log.Infof("Platform %s ready, wake-up integration: %s", p.Name, integration.Name)
 						requests = append(requests, reconcile.Request{
 							NamespacedName: types.NamespacedName{
 								Namespace: integration.Namespace,
@@ -182,7 +185,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 
 			return requests
 		}),
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -191,9 +194,9 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 	// the EnqueueRequestForOwner handler as the owner depends on the deployment strategy,
 	// either regular deployment or Knative service. In any case, the integration is not the
 	// direct owner of the ReplicaSet.
-	err = ctrl.Watch(&source.Kind{Type: &appsv1.ReplicaSet{}}, &handler.EnqueueRequestsFromMapFunc{
-		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
-			rs := a.Object.(*appsv1.ReplicaSet)
+	err = c.Watch(&source.Kind{Type: &appsv1.ReplicaSet{}},
+		handler.EnqueueRequestsFromMapFunc(func(a ctrl.Object) []reconcile.Request {
+			rs := a.(*appsv1.ReplicaSet)
 			var requests []reconcile.Request
 
 			labels := rs.GetLabels()
@@ -209,23 +212,24 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 
 			return requests
 		}),
-	}, predicate.Funcs{
-		UpdateFunc: func(e event.UpdateEvent) bool {
-			oldReplicaSet := e.ObjectOld.(*appsv1.ReplicaSet)
-			newReplicaSet := e.ObjectNew.(*appsv1.ReplicaSet)
-			// Ignore updates to the ReplicaSet other than the replicas ones,
-			// that are used to reconcile the integration replicas.
-			return oldReplicaSet.Status.Replicas != newReplicaSet.Status.Replicas ||
-				oldReplicaSet.Status.ReadyReplicas != newReplicaSet.Status.ReadyReplicas ||
-				oldReplicaSet.Status.AvailableReplicas != newReplicaSet.Status.AvailableReplicas
+		predicate.Funcs{
+			UpdateFunc: func(e event.UpdateEvent) bool {
+				oldReplicaSet := e.ObjectOld.(*appsv1.ReplicaSet)
+				newReplicaSet := e.ObjectNew.(*appsv1.ReplicaSet)
+				// Ignore updates to the ReplicaSet other than the replicas ones,
+				// that are used to reconcile the integration replicas.
+				return oldReplicaSet.Status.Replicas != newReplicaSet.Status.Replicas ||
+					oldReplicaSet.Status.ReadyReplicas != newReplicaSet.Status.ReadyReplicas ||
+					oldReplicaSet.Status.AvailableReplicas != newReplicaSet.Status.AvailableReplicas
+			},
 		},
-	})
+	)
 	if err != nil {
 		return err
 	}
 
 	// Watch cronjob to update the ready condition
-	err = ctrl.Watch(&source.Kind{Type: &v1beta1.CronJob{}}, &handler.EnqueueRequestForOwner{
+	err = c.Watch(&source.Kind{Type: &v1beta1.CronJob{}}, &handler.EnqueueRequestForOwner{
 		OwnerType:    &v1.Integration{},
 		IsController: false,
 	})
@@ -234,17 +238,17 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 	}
 
 	// Check the ServiceBinding CRD is present
-	if ok, err := kubernetes.IsAPIResourceInstalled(c, sb.GroupVersion.String(), sb.GroupVersionKind.Kind); err != nil {
+	if ok, err := kubernetes.IsAPIResourceInstalled(cl, sb.GroupVersion.String(), sb.GroupVersionKind.Kind); err != nil {
 		return err
 	} else if !ok {
 		log.Info("Service binding is disabled, install the Service Binding Operator if needed")
-	} else if ok, err := kubernetes.CheckPermission(context.TODO(), c, sb.GroupVersion.Group, sb.GroupVersionResource.Resource, platform.GetOperatorWatchNamespace(), "", "create"); err != nil {
+	} else if ok, err := kubernetes.CheckPermission(context.TODO(), cl, sb.GroupVersion.Group, sb.GroupVersionResource.Resource, platform.GetOperatorWatchNamespace(), "", "create"); err != nil {
 		return err
 	} else if !ok {
 		log.Info("Service binding is disabled, the operator is not granted permission to create ServiceBindings!")
 	} else {
 		// Watch ServiceBindings and enqueue owning Integrations
-		err = ctrl.Watch(&source.Kind{Type: &sb.ServiceBinding{}}, &handler.EnqueueRequestForOwner{
+		err = c.Watch(&source.Kind{Type: &sb.ServiceBinding{}}, &handler.EnqueueRequestForOwner{
 			OwnerType:    &v1.Integration{},
 			IsController: true,
 		})
@@ -271,12 +275,10 @@ type reconcileIntegration struct {
 // Note:
 // The Controller will requeue the Request to be processed again if the returned error is non-nil or
 // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *reconcileIntegration) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *reconcileIntegration) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
 	rlog.Info("Reconciling Integration")
 
-	ctx := context.TODO()
-
 	// Make sure the operator is allowed to act on namespace
 	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
 		return reconcile.Result{}, err
@@ -352,14 +354,14 @@ func (r *reconcileIntegration) Reconcile(request reconcile.Request) (reconcile.R
 }
 
 func (r *reconcileIntegration) update(ctx context.Context, base *v1.Integration, target *v1.Integration) (reconcile.Result, error) {
-	dgst, err := digest.ComputeForIntegration(target)
+	d, err := digest.ComputeForIntegration(target)
 	if err != nil {
 		return reconcile.Result{}, err
 	}
 
-	target.Status.Digest = dgst
+	target.Status.Digest = d
 
-	err = r.client.Status().Patch(ctx, target, k8sclient.MergeFrom(base))
+	err = r.client.Status().Patch(ctx, target, ctrl.MergeFrom(base))
 
 	return reconcile.Result{}, err
 }
diff --git a/pkg/controller/integrationkit/integrationkit_controller.go b/pkg/controller/integrationkit/integrationkit_controller.go
index ac38555..3714c52 100644
--- a/pkg/controller/integrationkit/integrationkit_controller.go
+++ b/pkg/controller/integrationkit/integrationkit_controller.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/record"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -79,21 +79,24 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch for changes to primary resource IntegrationKit
-	err = c.Watch(&source.Kind{Type: &v1.IntegrationKit{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
-		UpdateFunc: func(e event.UpdateEvent) bool {
-			oldIntegrationKit := e.ObjectOld.(*v1.IntegrationKit)
-			newIntegrationKit := e.ObjectNew.(*v1.IntegrationKit)
-			// Ignore updates to the integration kit status in which case metadata.Generation
-			// does not change, or except when the integration kit phase changes as it's used
-			// to transition from one phase to another
-			return oldIntegrationKit.Generation != newIntegrationKit.Generation ||
-				oldIntegrationKit.Status.Phase != newIntegrationKit.Status.Phase
-		},
-		DeleteFunc: func(e event.DeleteEvent) bool {
-			// Evaluates to false if the object has been confirmed deleted
-			return !e.DeleteStateUnknown
+	err = c.Watch(&source.Kind{Type: &v1.IntegrationKit{}},
+		&handler.EnqueueRequestForObject{},
+		predicate.Funcs{
+			UpdateFunc: func(e event.UpdateEvent) bool {
+				oldIntegrationKit := e.ObjectOld.(*v1.IntegrationKit)
+				newIntegrationKit := e.ObjectNew.(*v1.IntegrationKit)
+				// Ignore updates to the integration kit status in which case metadata.Generation
+				// does not change, or except when the integration kit phase changes as it's used
+				// to transition from one phase to another
+				return oldIntegrationKit.Generation != newIntegrationKit.Generation ||
+					oldIntegrationKit.Status.Phase != newIntegrationKit.Status.Phase
+			},
+			DeleteFunc: func(e event.DeleteEvent) bool {
+				// Evaluates to false if the object has been confirmed deleted
+				return !e.DeleteStateUnknown
+			},
 		},
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -113,29 +116,30 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 				// to another during the image build
 				return oldBuild.Status.Phase != newBuild.Status.Phase
 			},
-		})
+		},
+	)
 	if err != nil {
 		return err
 	}
 
 	// Watch for IntegrationPlatform phase transitioning to ready and enqueue
 	// requests for any integration kits that are in phase waiting for platform
-	err = c.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}}, &handler.EnqueueRequestsFromMapFunc{
-		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
-			platform := a.Object.(*v1.IntegrationPlatform)
+	err = c.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}},
+		handler.EnqueueRequestsFromMapFunc(func(a ctrl.Object) []reconcile.Request {
+			p := a.(*v1.IntegrationPlatform)
 			var requests []reconcile.Request
 
-			if platform.Status.Phase == v1.IntegrationPlatformPhaseReady {
+			if p.Status.Phase == v1.IntegrationPlatformPhaseReady {
 				list := &v1.IntegrationKitList{}
 
-				if err := mgr.GetClient().List(context.TODO(), list, k8sclient.InNamespace(platform.Namespace)); err != nil {
-					log.Error(err, "Failed to retrieve integrationkit list")
+				if err := mgr.GetClient().List(context.TODO(), list, ctrl.InNamespace(p.Namespace)); err != nil {
+					log.Error(err, "Failed to list integration kits")
 					return requests
 				}
 
 				for _, kit := range list.Items {
 					if kit.Status.Phase == v1.IntegrationKitPhaseWaitingForPlatform {
-						log.Infof("Platform %s ready, wake-up integrationkit: %s", platform.Name, kit.Name)
+						log.Infof("Platform %s ready, wake-up integration kit: %s", p.Name, kit.Name)
 						requests = append(requests, reconcile.Request{
 							NamespacedName: types.NamespacedName{
 								Namespace: kit.Namespace,
@@ -148,7 +152,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 
 			return requests
 		}),
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -172,12 +176,10 @@ type reconcileIntegrationKit struct {
 // Note:
 // The Controller will requeue the Request to be processed again if the returned error is non-nil or
 // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *reconcileIntegrationKit) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *reconcileIntegrationKit) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
 	rlog.Info("Reconciling IntegrationKit")
 
-	ctx := context.TODO()
-
 	// Make sure the operator is allowed to act on namespace
 	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
 		return reconcile.Result{}, err
@@ -284,7 +286,7 @@ func (r *reconcileIntegrationKit) update(ctx context.Context, base *v1.Integrati
 
 	target.Status.Digest = dgst
 
-	err = r.client.Status().Patch(ctx, target, k8sclient.MergeFrom(base))
+	err = r.client.Status().Patch(ctx, target, ctrl.MergeFrom(base))
 
 	return reconcile.Result{}, err
 }
diff --git a/pkg/controller/integrationplatform/integrationplatform_controller.go b/pkg/controller/integrationplatform/integrationplatform_controller.go
index 71a8711..5fa590e 100644
--- a/pkg/controller/integrationplatform/integrationplatform_controller.go
+++ b/pkg/controller/integrationplatform/integrationplatform_controller.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/client-go/tools/record"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -77,21 +77,24 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch for changes to primary resource IntegrationPlatform
-	err = c.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
-		UpdateFunc: func(e event.UpdateEvent) bool {
-			oldIntegrationPlatform := e.ObjectOld.(*v1.IntegrationPlatform)
-			newIntegrationPlatform := e.ObjectNew.(*v1.IntegrationPlatform)
-			// Ignore updates to the integration platform status in which case metadata.Generation
-			// does not change, or except when the integration platform phase changes as it's used
-			// to transition from one phase to another
-			return oldIntegrationPlatform.Generation != newIntegrationPlatform.Generation ||
-				oldIntegrationPlatform.Status.Phase != newIntegrationPlatform.Status.Phase
+	err = c.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}},
+		&handler.EnqueueRequestForObject{},
+		predicate.Funcs{
+			UpdateFunc: func(e event.UpdateEvent) bool {
+				oldIntegrationPlatform := e.ObjectOld.(*v1.IntegrationPlatform)
+				newIntegrationPlatform := e.ObjectNew.(*v1.IntegrationPlatform)
+				// Ignore updates to the integration platform status in which case metadata.Generation
+				// does not change, or except when the integration platform phase changes as it's used
+				// to transition from one phase to another
+				return oldIntegrationPlatform.Generation != newIntegrationPlatform.Generation ||
+					oldIntegrationPlatform.Status.Phase != newIntegrationPlatform.Status.Phase
+			},
+			DeleteFunc: func(e event.DeleteEvent) bool {
+				// Evaluates to false if the object has been confirmed deleted
+				return !e.DeleteStateUnknown
+			},
 		},
-		DeleteFunc: func(e event.DeleteEvent) bool {
-			// Evaluates to false if the object has been confirmed deleted
-			return !e.DeleteStateUnknown
-		},
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -115,12 +118,10 @@ type reconcileIntegrationPlatform struct {
 // Note:
 // The Controller will requeue the Request to be processed again if the returned error is non-nil or
 // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *reconcileIntegrationPlatform) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *reconcileIntegrationPlatform) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
 	rlog.Info("Reconciling IntegrationPlatform")
 
-	ctx := context.TODO()
-
 	// Make sure the operator is allowed to act on namespace
 	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
 		return reconcile.Result{}, err
@@ -174,7 +175,7 @@ func (r *reconcileIntegrationPlatform) Reconcile(request reconcile.Request) (rec
 			}
 
 			if target != nil {
-				if err := r.client.Status().Patch(ctx, target, k8sclient.MergeFrom(&instance)); err != nil {
+				if err := r.client.Status().Patch(ctx, target, ctrl.MergeFrom(&instance)); err != nil {
 					camelevent.NotifyIntegrationPlatformError(ctx, r.client, r.recorder, &instance, target, err)
 					return reconcile.Result{}, err
 				}
diff --git a/pkg/controller/kamelet/kamelet_controller.go b/pkg/controller/kamelet/kamelet_controller.go
index a9acf50..84729df 100644
--- a/pkg/controller/kamelet/kamelet_controller.go
+++ b/pkg/controller/kamelet/kamelet_controller.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/client-go/tools/record"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -77,21 +77,24 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch for changes to primary resource Kamelet
-	err = c.Watch(&source.Kind{Type: &v1alpha1.Kamelet{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
-		UpdateFunc: func(e event.UpdateEvent) bool {
-			oldKamelet := e.ObjectOld.(*v1alpha1.Kamelet)
-			newKamelet := e.ObjectNew.(*v1alpha1.Kamelet)
-			// Ignore updates to the kamelet status in which case metadata.Generation
-			// does not change, or except when the kamelet phase changes as it's used
-			// to transition from one phase to another
-			return oldKamelet.Generation != newKamelet.Generation ||
-				oldKamelet.Status.Phase != newKamelet.Status.Phase
+	err = c.Watch(&source.Kind{Type: &v1alpha1.Kamelet{}},
+		&handler.EnqueueRequestForObject{},
+		predicate.Funcs{
+			UpdateFunc: func(e event.UpdateEvent) bool {
+				oldKamelet := e.ObjectOld.(*v1alpha1.Kamelet)
+				newKamelet := e.ObjectNew.(*v1alpha1.Kamelet)
+				// Ignore updates to the kamelet status in which case metadata.Generation
+				// does not change, or except when the kamelet phase changes as it's used
+				// to transition from one phase to another
+				return oldKamelet.Generation != newKamelet.Generation ||
+					oldKamelet.Status.Phase != newKamelet.Status.Phase
+			},
+			DeleteFunc: func(e event.DeleteEvent) bool {
+				// Evaluates to false if the object has been confirmed deleted
+				return !e.DeleteStateUnknown
+			},
 		},
-		DeleteFunc: func(e event.DeleteEvent) bool {
-			// Evaluates to false if the object has been confirmed deleted
-			return !e.DeleteStateUnknown
-		},
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -115,12 +118,10 @@ type reconcileKamelet struct {
 // Note:
 // The Controller will requeue the Request to be processed again if the returned error is non-nil or
 // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *reconcileKamelet) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *reconcileKamelet) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
 	rlog.Info("Reconciling Kamelet")
 
-	ctx := context.TODO()
-
 	// Make sure the operator is allowed to act on namespace
 	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
 		return reconcile.Result{}, err
@@ -172,7 +173,7 @@ func (r *reconcileKamelet) Reconcile(request reconcile.Request) (reconcile.Resul
 			}
 
 			if target != nil {
-				if err := r.client.Status().Patch(ctx, target, k8sclient.MergeFrom(&instance)); err != nil {
+				if err := r.client.Status().Patch(ctx, target, ctrl.MergeFrom(&instance)); err != nil {
 					camelevent.NotifyKameletError(ctx, r.client, r.recorder, &instance, target, err)
 					return reconcile.Result{}, err
 				}
diff --git a/pkg/controller/kameletbinding/kamelet_binding_controller.go b/pkg/controller/kameletbinding/kamelet_binding_controller.go
index ffde023..ff23f65 100644
--- a/pkg/controller/kameletbinding/kamelet_binding_controller.go
+++ b/pkg/controller/kameletbinding/kamelet_binding_controller.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/client-go/tools/record"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -76,21 +76,24 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch for changes to primary resource KameletBinding
-	err = c.Watch(&source.Kind{Type: &v1alpha1.KameletBinding{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
-		UpdateFunc: func(e event.UpdateEvent) bool {
-			oldKameletBinding := e.ObjectOld.(*v1alpha1.KameletBinding)
-			newKameletBinding := e.ObjectNew.(*v1alpha1.KameletBinding)
-			// Ignore updates to the kameletBinding status in which case metadata.Generation
-			// does not change, or except when the kameletBinding phase changes as it's used
-			// to transition from one phase to another
-			return oldKameletBinding.Generation != newKameletBinding.Generation ||
-				oldKameletBinding.Status.Phase != newKameletBinding.Status.Phase
+	err = c.Watch(&source.Kind{Type: &v1alpha1.KameletBinding{}},
+		&handler.EnqueueRequestForObject{},
+		predicate.Funcs{
+			UpdateFunc: func(e event.UpdateEvent) bool {
+				oldKameletBinding := e.ObjectOld.(*v1alpha1.KameletBinding)
+				newKameletBinding := e.ObjectNew.(*v1alpha1.KameletBinding)
+				// Ignore updates to the kameletBinding status in which case metadata.Generation
+				// does not change, or except when the kameletBinding phase changes as it's used
+				// to transition from one phase to another
+				return oldKameletBinding.Generation != newKameletBinding.Generation ||
+					oldKameletBinding.Status.Phase != newKameletBinding.Status.Phase
+			},
+			DeleteFunc: func(e event.DeleteEvent) bool {
+				// Evaluates to false if the object has been confirmed deleted
+				return !e.DeleteStateUnknown
+			},
 		},
-		DeleteFunc: func(e event.DeleteEvent) bool {
-			// Evaluates to false if the object has been confirmed deleted
-			return !e.DeleteStateUnknown
-		},
-	})
+	)
 	if err != nil {
 		return err
 	}
@@ -123,12 +126,10 @@ type ReconcileKameletBinding struct {
 // Note:
 // The Controller will requeue the Request to be processed again if the returned error is non-nil or
 // Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *ReconcileKameletBinding) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *ReconcileKameletBinding) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
 	rlog.Info("Reconciling KameletBinding")
 
-	ctx := context.TODO()
-
 	// Make sure the operator is allowed to act on namespace
 	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
 		return reconcile.Result{}, err
@@ -180,7 +181,7 @@ func (r *ReconcileKameletBinding) Reconcile(request reconcile.Request) (reconcil
 			}
 
 			if target != nil {
-				if err := r.client.Status().Patch(ctx, target, k8sclient.MergeFrom(&instance)); err != nil {
+				if err := r.client.Status().Patch(ctx, target, ctrl.MergeFrom(&instance)); err != nil {
 					camelevent.NotifyKameletBindingError(ctx, r.client, r.recorder, &instance, target, err)
 					return reconcile.Result{}, err
 				}
diff --git a/pkg/install/cluster.go b/pkg/install/cluster.go
index 401ff8f..442877c 100644
--- a/pkg/install/cluster.go
+++ b/pkg/install/cluster.go
@@ -25,14 +25,13 @@ import (
 	"time"
 
 	rbacv1 "k8s.io/api/rbac/v1"
-	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
-
 	"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
 	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/resources"
@@ -68,7 +67,7 @@ func SetupClusterWideResourcesOrCollect(ctx context.Context, clientProvider clie
 			return err
 		}
 	}
-	downgradeToCRDv1beta1 := func(object runtime.Object) runtime.Object {
+	downgradeToCRDv1beta1 := func(object ctrl.Object) ctrl.Object {
 		if !isApiExtensionsV1 {
 			v1Crd := object.(*apiextensionsv1.CustomResourceDefinition)
 			v1beta1Crd := &apiextensionsv1beta1.CustomResourceDefinition{}
@@ -284,12 +283,8 @@ func isClusterRoleInstalled(ctx context.Context, c client.Client, name string) (
 	return isResourceInstalled(ctx, c, &clusterRole)
 }
 
-func isResourceInstalled(ctx context.Context, c client.Client, object runtime.Object) (bool, error) {
-	key, err := k8sclient.ObjectKeyFromObject(object)
-	if err != nil {
-		return false, err
-	}
-	err = c.Get(ctx, key, object)
+func isResourceInstalled(ctx context.Context, c client.Client, object ctrl.Object) (bool, error) {
+	err := c.Get(ctx, ctrl.ObjectKeyFromObject(object), object)
 	if err != nil && k8serrors.IsNotFound(err) {
 		return false, nil
 	} else if err != nil {
diff --git a/pkg/install/common.go b/pkg/install/common.go
index 2abcda6..345d112 100644
--- a/pkg/install/common.go
+++ b/pkg/install/common.go
@@ -21,23 +21,23 @@ import (
 	"context"
 	"strings"
 
-	"github.com/apache/camel-k/pkg/resources"
+	"k8s.io/apimachinery/pkg/api/errors"
+	k8s "k8s.io/client-go/kubernetes"
+
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/client"
+	"github.com/apache/camel-k/pkg/resources"
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 	"github.com/apache/camel-k/pkg/util/openshift"
-	kube "k8s.io/client-go/kubernetes"
-
-	"k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
 )
 
 // ResourceCustomizer can be used to inject code that changes the objects before they are created
-type ResourceCustomizer func(object runtime.Object) runtime.Object
+type ResourceCustomizer func(object ctrl.Object) ctrl.Object
 
 // IdentityResourceCustomizer is a ResourceCustomizer that does nothing
-var IdentityResourceCustomizer = func(object runtime.Object) runtime.Object {
+var IdentityResourceCustomizer = func(object ctrl.Object) ctrl.Object {
 	return object
 }
 
@@ -62,7 +62,6 @@ func Resource(ctx context.Context, c client.Client, namespace string, force bool
 	return ResourceOrCollect(ctx, c, namespace, nil, force, customizer, name)
 }
 
-// ResourceOrCollect --
 func ResourceOrCollect(ctx context.Context, c client.Client, namespace string, collection *kubernetes.Collection,
 	force bool, customizer ResourceCustomizer, name string) error {
 	obj, err := kubernetes.LoadResourceFromYaml(c.GetScheme(), resources.ResourceAsString(name))
@@ -70,25 +69,17 @@ func ResourceOrCollect(ctx context.Context, c client.Client, namespace string, c
 		return err
 	}
 
-	return RuntimeObjectOrCollect(ctx, c, namespace, collection, force, customizer(obj))
+	return ObjectOrCollect(ctx, c, namespace, collection, force, customizer(obj))
 }
 
-// RuntimeObject installs a single runtime object
-func RuntimeObject(ctx context.Context, c client.Client, namespace string, force bool, obj runtime.Object) error {
-	return RuntimeObjectOrCollect(ctx, c, namespace, nil, force, obj)
-}
-
-// RuntimeObjectOrCollect --
-func RuntimeObjectOrCollect(ctx context.Context, c client.Client, namespace string, collection *kubernetes.Collection, force bool, obj runtime.Object) error {
+func ObjectOrCollect(ctx context.Context, c client.Client, namespace string, collection *kubernetes.Collection, force bool, obj ctrl.Object) error {
 	if collection != nil {
 		// Adding to the collection before setting the namespace
 		collection.Add(obj)
 		return nil
 	}
 
-	if metaObject, ok := obj.(metav1.Object); ok {
-		metaObject.SetNamespace(namespace)
-	}
+	obj.SetNamespace(namespace)
 
 	if obj.GetObjectKind().GroupVersionKind().Kind == "PersistentVolumeClaim" {
 		if err := c.Create(ctx, obj); err != nil && !errors.IsAlreadyExists(err) {
@@ -115,7 +106,7 @@ func RuntimeObjectOrCollect(ctx context.Context, c client.Client, namespace stri
 	return c.Create(ctx, obj)
 }
 
-func isOpenShift(c kube.Interface, clusterType string) (bool, error) {
+func isOpenShift(c k8s.Interface, clusterType string) (bool, error) {
 	var res bool
 	var err error
 	if clusterType != "" {
diff --git a/pkg/install/kamelets.go b/pkg/install/kamelets.go
index d6871a7..9825836 100644
--- a/pkg/install/kamelets.go
+++ b/pkg/install/kamelets.go
@@ -23,11 +23,12 @@ import (
 	"strings"
 
 	"github.com/pkg/errors"
+
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
 
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/resources"
@@ -66,27 +67,24 @@ func KameletCatalog(ctx context.Context, c client.Client, namespace string) erro
 			}
 
 			if existing == nil || existing.Annotations[kamelVersionAnnotation] != defaults.Version {
-				err := Resource(ctx, c, namespace, true, func(object runtime.Object) runtime.Object {
-					if o, ok := object.(metav1.Object); ok {
-						if o.GetAnnotations() == nil {
-							o.SetAnnotations(make(map[string]string))
-						}
-						o.GetAnnotations()[kamelVersionAnnotation] = defaults.Version
-
-						if o.GetLabels() == nil {
-							o.SetLabels(make(map[string]string))
-						}
-						o.GetLabels()[kameletBundledLabel] = "true"
-						o.GetLabels()[kameletReadOnlyLabel] = "true"
+				err := Resource(ctx, c, namespace, true, func(o ctrl.Object) ctrl.Object {
+					if o.GetAnnotations() == nil {
+						o.SetAnnotations(make(map[string]string))
 					}
-					return object
+					o.GetAnnotations()[kamelVersionAnnotation] = defaults.Version
+
+					if o.GetLabels() == nil {
+						o.SetLabels(make(map[string]string))
+					}
+					o.GetLabels()[kameletBundledLabel] = "true"
+					o.GetLabels()[kameletReadOnlyLabel] = "true"
+					return o
 				}, path.Join(kameletDir, res))
 
 				if err != nil {
 					return errors.Wrapf(err, "could not create resource %q", res)
 				}
 			}
-
 		}
 	}
 
diff --git a/pkg/install/operator.go b/pkg/install/operator.go
index 1187332..145c310 100644
--- a/pkg/install/operator.go
+++ b/pkg/install/operator.go
@@ -31,7 +31,6 @@ import (
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/api/meta"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/util/intstr"
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
@@ -70,7 +69,7 @@ type OperatorMonitoringConfiguration struct {
 
 // OperatorOrCollect installs the operator resources or adds them to the collector if present
 func OperatorOrCollect(ctx context.Context, c client.Client, cfg OperatorConfiguration, collection *kubernetes.Collection, force bool) error {
-	customizer := func(o runtime.Object) runtime.Object {
+	customizer := func(o ctrl.Object) ctrl.Object {
 		if cfg.CustomImage != "" {
 			if d, ok := o.(*appsv1.Deployment); ok {
 				if d.Labels["camel.apache.org/component"] == "operator" {
diff --git a/pkg/install/secret.go b/pkg/install/secret.go
index 1020ad7..6d403bf 100644
--- a/pkg/install/secret.go
+++ b/pkg/install/secret.go
@@ -21,11 +21,12 @@ import (
 	"context"
 	"io/ioutil"
 
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 	"github.com/apache/camel-k/pkg/util/registry"
-	v1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 const registrySecretName = "camel-k-registry-secret"
@@ -70,7 +71,7 @@ func registrySecretFromDataOrCollect(ctx context.Context, c client.Client, names
 		},
 	}
 
-	if err := RuntimeObjectOrCollect(ctx, c, namespace, collection, force, &registrySecret); err != nil {
+	if err := ObjectOrCollect(ctx, c, namespace, collection, force, &registrySecret); err != nil {
 		return "", err
 	}
 	return registrySecretName, nil
diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go
index c4f1382..22cab53 100644
--- a/pkg/platform/defaults.go
+++ b/pkg/platform/defaults.go
@@ -23,8 +23,6 @@ import (
 	"strings"
 	"time"
 
-	"github.com/apache/camel-k/pkg/kamelet/repository"
-	"github.com/apache/camel-k/pkg/util/patch"
 	"github.com/pkg/errors"
 
 	corev1 "k8s.io/api/core/v1"
@@ -33,15 +31,17 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/install"
+	"github.com/apache/camel-k/pkg/kamelet/repository"
 	"github.com/apache/camel-k/pkg/util/defaults"
 	"github.com/apache/camel-k/pkg/util/log"
 	"github.com/apache/camel-k/pkg/util/maven"
 	"github.com/apache/camel-k/pkg/util/openshift"
+	"github.com/apache/camel-k/pkg/util/patch"
 )
 
 // BuilderServiceAccount --
@@ -293,13 +293,8 @@ func createDefaultMavenSettingsConfigMap(ctx context.Context, client client.Clie
 	if err != nil && !k8serrors.IsAlreadyExists(err) {
 		return err
 	} else if k8serrors.IsAlreadyExists(err) {
-		key, err := k8sclient.ObjectKeyFromObject(cm)
-		if err != nil {
-			return err
-		}
-
-		cmCopy := cm.DeepCopyObject()
-		err = client.Get(ctx, key, cmCopy)
+		cmCopy := cm.DeepCopyObject().(ctrl.Object)
+		err = client.Get(ctx, ctrl.ObjectKeyFromObject(cm), cmCopy)
 		if err != nil {
 			return err
 		}
@@ -308,7 +303,7 @@ func createDefaultMavenSettingsConfigMap(ctx context.Context, client client.Clie
 		if err != nil {
 			return err
 		} else if len(p) != 0 {
-			err = client.Patch(ctx, cm, k8sclient.RawPatch(types.MergePatchType, p))
+			err = client.Patch(ctx, cm, ctrl.RawPatch(types.MergePatchType, p))
 			if err != nil {
 				return errors.Wrap(err, "error during patch resource")
 			}
@@ -339,7 +334,7 @@ func createServiceCaBundleConfigMap(ctx context.Context, client client.Client, p
 
 func createBuilderServiceAccount(ctx context.Context, client client.Client, p *v1.IntegrationPlatform) error {
 	sa := corev1.ServiceAccount{}
-	key := k8sclient.ObjectKey{
+	key := ctrl.ObjectKey{
 		Name:      BuilderServiceAccount,
 		Namespace: p.Namespace,
 	}
diff --git a/pkg/trait/deployer.go b/pkg/trait/deployer.go
index a9a11d7..f8a895a 100644
--- a/pkg/trait/deployer.go
+++ b/pkg/trait/deployer.go
@@ -23,10 +23,9 @@ import (
 	"github.com/pkg/errors"
 
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
 
-	"sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/util/patch"
@@ -109,30 +108,27 @@ func (t *deployerTrait) Apply(e *Environment) error {
 	return nil
 }
 
-func (t *deployerTrait) serverSideApply(env *Environment, resource runtime.Object) error {
+func (t *deployerTrait) serverSideApply(env *Environment, resource ctrl.Object) error {
 	target, err := patch.PositiveApplyPatch(resource)
 	if err != nil {
 		return err
 	}
-	err = env.Client.Patch(env.C, target, client.Apply, client.ForceOwnership, client.FieldOwner("camel-k-operator"))
+	err = env.Client.Patch(env.C, target, ctrl.Apply, ctrl.ForceOwnership, ctrl.FieldOwner("camel-k-operator"))
 	if err != nil {
 		return errors.Wrapf(err, "error during apply resource: %v", resource)
 	}
 	return nil
 }
 
-func (t *deployerTrait) clientSideApply(env *Environment, resource runtime.Object) error {
+func (t *deployerTrait) clientSideApply(env *Environment, resource ctrl.Object) error {
 	err := env.Client.Create(env.C, resource)
 	if err == nil {
 		return nil
 	} else if !k8serrors.IsAlreadyExists(err) {
 		return errors.Wrapf(err, "error during create resource: %v", resource)
 	}
-	key, err := client.ObjectKeyFromObject(resource)
-	if err != nil {
-		return err
-	}
-	object := resource.DeepCopyObject()
+	key := ctrl.ObjectKeyFromObject(resource)
+	object := resource.DeepCopyObject().(ctrl.Object)
 	err = env.Client.Get(env.C, key, object)
 	if err != nil {
 		return err
@@ -144,7 +140,7 @@ func (t *deployerTrait) clientSideApply(env *Environment, resource runtime.Objec
 		// Avoid triggering a patch request for nothing
 		return nil
 	}
-	err = env.Client.Patch(env.C, resource, client.RawPatch(types.MergePatchType, p))
+	err = env.Client.Patch(env.C, resource, ctrl.RawPatch(types.MergePatchType, p))
 	if err != nil {
 		return errors.Wrapf(err, "error during patch resource: %v", resource)
 	}
diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go
index 29a7914..89c205f 100644
--- a/pkg/trait/trait_types.go
+++ b/pkg/trait/trait_types.go
@@ -29,9 +29,10 @@ import (
 	"k8s.io/api/batch/v1beta1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
 	serving "knative.dev/serving/pkg/apis/serving/v1"
 
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/platform"
@@ -393,9 +394,9 @@ func (e *Environment) computeApplicationProperties() *corev1.ConfigMap {
 	return nil
 }
 
-func (e *Environment) computeConfigMaps() []runtime.Object {
+func (e *Environment) computeConfigMaps() []ctrl.Object {
 	sources := e.Integration.Sources()
-	maps := make([]runtime.Object, 0, len(sources)+1)
+	maps := make([]ctrl.Object, 0, len(sources)+1)
 
 	// combine properties of integration with kit, integration
 	// properties have the priority
diff --git a/pkg/util/knative/knative.go b/pkg/util/knative/knative.go
index 4f506ea..182f566 100644
--- a/pkg/util/knative/knative.go
+++ b/pkg/util/knative/knative.go
@@ -22,14 +22,14 @@ import (
 	"fmt"
 	"net/url"
 
-	"github.com/apache/camel-k/pkg/client"
-	kubernetesutils "github.com/apache/camel-k/pkg/util/kubernetes"
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
 	eventing "knative.dev/eventing/pkg/apis/eventing/v1beta1"
 	messaging "knative.dev/eventing/pkg/apis/messaging/v1beta1"
 	sources "knative.dev/eventing/pkg/apis/sources/v1alpha2"
@@ -38,12 +38,14 @@ import (
 	duckv1alpha1 "knative.dev/pkg/apis/duck/v1alpha1"
 	"knative.dev/pkg/tracker"
 	serving "knative.dev/serving/pkg/apis/serving/v1"
-	controller "sigs.k8s.io/controller-runtime/pkg/client"
+
+	"github.com/apache/camel-k/pkg/client"
+	util "github.com/apache/camel-k/pkg/util/kubernetes"
 )
 
 // CreateSubscription ---
-func CreateSubscription(channelReference corev1.ObjectReference, serviceName string) runtime.Object {
-	subs := messaging.Subscription{
+func CreateSubscription(channelReference corev1.ObjectReference, serviceName string) *messaging.Subscription {
+	return &messaging.Subscription{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: messaging.SchemeGroupVersion.String(),
 			Kind:       "Subscription",
@@ -67,20 +69,18 @@ func CreateSubscription(channelReference corev1.ObjectReference, serviceName str
 			},
 		},
 	}
-
-	return &subs
 }
 
 // CreateTrigger ---
-func CreateTrigger(brokerReference corev1.ObjectReference, serviceName string, eventType string) runtime.Object {
-	subs := eventing.Trigger{
+func CreateTrigger(brokerReference corev1.ObjectReference, serviceName string, eventType string) *eventing.Trigger {
+	return &eventing.Trigger{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: eventing.SchemeGroupVersion.String(),
 			Kind:       "Trigger",
 		},
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: brokerReference.Namespace,
-			Name:      brokerReference.Name + "-" + serviceName + "-" + kubernetesutils.SanitizeLabel(eventType),
+			Name:      brokerReference.Name + "-" + serviceName + "-" + util.SanitizeLabel(eventType),
 		},
 		Spec: eventing.TriggerSpec{
 			Filter: &eventing.TriggerFilter{
@@ -98,12 +98,11 @@ func CreateTrigger(brokerReference corev1.ObjectReference, serviceName string, e
 			},
 		},
 	}
-	return &subs
 }
 
 // CreateSinkBinding ---
-func CreateSinkBinding(source corev1.ObjectReference, target corev1.ObjectReference) runtime.Object {
-	binding := sources.SinkBinding{
+func CreateSinkBinding(source corev1.ObjectReference, target corev1.ObjectReference) *sources.SinkBinding {
+	return &sources.SinkBinding{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: sources.SchemeGroupVersion.String(),
 			Kind:       "SinkBinding",
@@ -131,8 +130,6 @@ func CreateSinkBinding(source corev1.ObjectReference, target corev1.ObjectRefere
 			},
 		},
 	}
-
-	return &binding
 }
 
 // GetAddressableReference looks up the resource among all given types and returns an object reference to it
@@ -142,8 +139,8 @@ func GetAddressableReference(ctx context.Context, c client.Client,
 	for _, ref := range possibleReferences {
 		sink := ref.DeepCopy()
 		sink.Namespace = namespace
-		_, err := GetSinkURI(ctx, c, sink, namespace)
-		if err != nil && (k8serrors.IsNotFound(err) || kubernetesutils.IsUnknownAPIError(err)) {
+		_, err := getSinkURI(ctx, c, sink, namespace)
+		if err != nil && (k8serrors.IsNotFound(err) || util.IsUnknownAPIError(err)) {
 			continue
 		} else if err != nil {
 			return nil, err
@@ -156,25 +153,24 @@ func GetAddressableReference(ctx context.Context, c client.Client,
 
 // GetSinkURL returns the sink as *url.URL
 func GetSinkURL(ctx context.Context, c client.Client, sink *corev1.ObjectReference, namespace string) (*url.URL, error) {
-	res, err := GetSinkURI(ctx, c, sink, namespace)
+	res, err := getSinkURI(ctx, c, sink, namespace)
 	if err != nil {
 		return nil, err
 	}
 	return url.Parse(res)
 }
 
-// GetSinkURI retrieves the sink URI from the object referenced by the given
-// ObjectReference.
+// getSinkURI retrieves the sink URI from the object referenced by the given ObjectReference.
 //
 // Method taken from https://github.com/knative/eventing-contrib/blob/master/pkg/controller/sinks/sinks.go
-func GetSinkURI(ctx context.Context, c client.Client, sink *corev1.ObjectReference, namespace string) (string, error) {
+func getSinkURI(ctx context.Context, c client.Client, sink *corev1.ObjectReference, namespace string) (string, error) {
 	if sink == nil {
 		return "", fmt.Errorf("sink ref is nil")
 	}
 
 	u := &unstructured.Unstructured{}
 	u.SetGroupVersionKind(sink.GroupVersionKind())
-	err := c.Get(ctx, controller.ObjectKey{Namespace: namespace, Name: sink.Name}, u)
+	err := c.Get(ctx, ctrl.ObjectKey{Namespace: namespace, Name: sink.Name}, u)
 	if err != nil {
 		return "", err
 	}
diff --git a/pkg/util/kubernetes/collection.go b/pkg/util/kubernetes/collection.go
index 4643e2f..9442e6c 100644
--- a/pkg/util/kubernetes/collection.go
+++ b/pkg/util/kubernetes/collection.go
@@ -24,6 +24,8 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
 	eventing "knative.dev/eventing/pkg/apis/eventing/v1beta1"
 	serving "knative.dev/serving/pkg/apis/serving/v1"
 
@@ -36,13 +38,13 @@ import (
 
 // A Collection is a container of Kubernetes resources
 type Collection struct {
-	items []runtime.Object
+	items []ctrl.Object
 }
 
 // NewCollection creates a new empty collection
-func NewCollection(objects ...runtime.Object) *Collection {
+func NewCollection(objects ...ctrl.Object) *Collection {
 	collection := Collection{
-		items: make([]runtime.Object, 0, len(objects)),
+		items: make([]ctrl.Object, 0, len(objects)),
 	}
 
 	collection.items = append(collection.items, objects...)
@@ -56,7 +58,7 @@ func (c *Collection) Size() int {
 }
 
 // Items returns all resources belonging to the collection
-func (c *Collection) Items() []runtime.Object {
+func (c *Collection) Items() []ctrl.Object {
 	return c.items
 }
 
@@ -79,21 +81,21 @@ func (c *Collection) AsKubernetesList() *corev1.List {
 }
 
 // Add adds a resource to the collection
-func (c *Collection) Add(resource runtime.Object) {
+func (c *Collection) Add(resource ctrl.Object) {
 	if resource != nil {
 		c.items = append(c.items, resource)
 	}
 }
 
 // AddFirst adds a resource to the head of the collection
-func (c *Collection) AddFirst(resource runtime.Object) {
+func (c *Collection) AddFirst(resource ctrl.Object) {
 	if resource != nil {
-		c.items = append([]runtime.Object{resource}, c.items...)
+		c.items = append([]ctrl.Object{resource}, c.items...)
 	}
 }
 
 // AddAll adds all resources to the collection
-func (c *Collection) AddAll(resource []runtime.Object) {
+func (c *Collection) AddAll(resource []ctrl.Object) {
 	c.items = append(c.items, resource...)
 }
 
diff --git a/pkg/util/kubernetes/loader.go b/pkg/util/kubernetes/loader.go
index aba9700..3221849 100644
--- a/pkg/util/kubernetes/loader.go
+++ b/pkg/util/kubernetes/loader.go
@@ -25,10 +25,12 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/serializer"
 	"k8s.io/apimachinery/pkg/util/yaml"
+
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
 // LoadResourceFromYaml loads a k8s resource from a yaml definition
-func LoadResourceFromYaml(scheme *runtime.Scheme, data string) (runtime.Object, error) {
+func LoadResourceFromYaml(scheme *runtime.Scheme, data string) (ctrl.Object, error) {
 	source := []byte(data)
 	jsonSource, err := yaml.ToJSON(source)
 	if err != nil {
@@ -39,7 +41,15 @@ func LoadResourceFromYaml(scheme *runtime.Scheme, data string) (runtime.Object,
 	if err != nil {
 		return nil, err
 	}
-	return RuntimeObjectFromUnstructured(scheme, &u)
+	ro, err := runtimeObjectFromUnstructured(scheme, &u)
+	if err != nil {
+		return nil, err
+	}
+	if o, ok := ro.(ctrl.Object); !ok {
+		return nil, err
+	} else {
+		return o, nil
+	}
 }
 
 // LoadRawResourceFromYaml loads a k8s resource from a yaml definition without making assumptions on the underlying type
@@ -58,8 +68,7 @@ func LoadRawResourceFromYaml(data string) (runtime.Object, error) {
 	}, nil
 }
 
-// RuntimeObjectFromUnstructured converts an unstructured to a runtime object
-func RuntimeObjectFromUnstructured(scheme *runtime.Scheme, u *unstructured.Unstructured) (runtime.Object, error) {
+func runtimeObjectFromUnstructured(scheme *runtime.Scheme, u *unstructured.Unstructured) (runtime.Object, error) {
 	gvk := u.GroupVersionKind()
 	codecs := serializer.NewCodecFactory(scheme)
 	decoder := codecs.UniversalDecoder(gvk.GroupVersion())
diff --git a/pkg/util/kubernetes/replace.go b/pkg/util/kubernetes/replace.go
index a9f045d..45ea33f 100644
--- a/pkg/util/kubernetes/replace.go
+++ b/pkg/util/kubernetes/replace.go
@@ -24,10 +24,9 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	serving "knative.dev/serving/pkg/apis/serving/v1"
 
@@ -37,16 +36,11 @@ import (
 )
 
 // ReplaceResource allows to completely replace a resource on Kubernetes, taking care of immutable fields and resource versions
-func ReplaceResource(ctx context.Context, c client.Client, res runtime.Object) error {
+func ReplaceResource(ctx context.Context, c client.Client, res ctrl.Object) error {
 	err := c.Create(ctx, res)
 	if err != nil && k8serrors.IsAlreadyExists(err) {
-		existing := res.DeepCopyObject()
-		var key k8sclient.ObjectKey
-		key, err = k8sclient.ObjectKeyFromObject(existing)
-		if err != nil {
-			return err
-		}
-		err = c.Get(ctx, key, existing)
+		existing := res.DeepCopyObject().(ctrl.Object)
+		err = c.Get(ctx, ctrl.ObjectKeyFromObject(existing), existing)
 		if err != nil {
 			return err
 		}
@@ -63,12 +57,8 @@ func ReplaceResource(ctx context.Context, c client.Client, res runtime.Object) e
 	return nil
 }
 
-func mapRequiredMeta(from runtime.Object, to runtime.Object) {
-	if fromC, ok := from.(metav1.Object); ok {
-		if toC, ok := to.(metav1.Object); ok {
-			toC.SetResourceVersion(fromC.GetResourceVersion())
-		}
-	}
+func mapRequiredMeta(from ctrl.Object, to ctrl.Object) {
+	to.SetResourceVersion(from.GetResourceVersion())
 }
 
 func mapRequiredServiceData(from runtime.Object, to runtime.Object) {
@@ -119,16 +109,9 @@ func mapRequiredKnativeServiceV1Data(from runtime.Object, to runtime.Object) {
 	}
 }
 
-func findResourceDetails(res runtime.Object) string {
+func findResourceDetails(res ctrl.Object) string {
 	if res == nil {
 		return "nil resource"
 	}
-	if meta, ok := res.(metav1.Object); ok {
-		name := meta.GetName()
-		if ty, ok := res.(metav1.Type); ok {
-			return ty.GetKind() + " " + name
-		}
-		return "resource " + name
-	}
-	return "unnamed resource"
+	return res.GetObjectKind().GroupVersionKind().String() + " " + res.GetName()
 }
diff --git a/pkg/util/kubernetes/wait.go b/pkg/util/kubernetes/wait.go
index 5c6129b..b5a49f8 100644
--- a/pkg/util/kubernetes/wait.go
+++ b/pkg/util/kubernetes/wait.go
@@ -21,12 +21,13 @@ import (
 	"context"
 	"time"
 
-	"github.com/apache/camel-k/pkg/client"
 	"github.com/pkg/errors"
-	"k8s.io/apimachinery/pkg/runtime"
 
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+
+	"github.com/apache/camel-k/pkg/client"
 )
 
 // ResourceRetrieveFunction --
@@ -39,13 +40,9 @@ const (
 	sleepTime = 400 * time.Millisecond
 )
 
-// WaitCondition --
-func WaitCondition(ctx context.Context, c client.Client, obj runtime.Object, condition ResourceCheckFunction, maxDuration time.Duration) error {
+func WaitCondition(ctx context.Context, c client.Client, obj ctrl.Object, condition ResourceCheckFunction, maxDuration time.Duration) error {
 	start := time.Now()
-	key, err := k8sclient.ObjectKeyFromObject(obj)
-	if err != nil {
-		return err
-	}
+	key := ctrl.ObjectKeyFromObject(obj)
 	for start.Add(maxDuration).After(time.Now()) {
 		err := c.Get(ctx, key, obj)
 		if err != nil {
diff --git a/pkg/util/monitoring/controller.go b/pkg/util/monitoring/controller.go
index c9c3136..c488478 100644
--- a/pkg/util/monitoring/controller.go
+++ b/pkg/util/monitoring/controller.go
@@ -18,6 +18,7 @@ limitations under the License.
 package monitoring
 
 import (
+	"context"
 	"time"
 
 	"k8s.io/apimachinery/pkg/runtime/schema"
@@ -57,17 +58,17 @@ type instrumentedReconciler struct {
 
 var _ reconcile.Reconciler = &instrumentedReconciler{}
 
-func NewInstrumentedReconciler(reconciler reconcile.Reconciler, gvk schema.GroupVersionKind) reconcile.Reconciler {
+func NewInstrumentedReconciler(rec reconcile.Reconciler, gvk schema.GroupVersionKind) reconcile.Reconciler {
 	return &instrumentedReconciler{
-		reconciler: reconciler,
+		reconciler: rec,
 		gvk:        gvk,
 	}
 }
 
-func (r *instrumentedReconciler) Reconcile(request reconcile.Request) (reconcile.Result, error) {
+func (r *instrumentedReconciler) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
 	timer := NewTimer()
 
-	res, err := r.reconciler.Reconcile(request)
+	res, err := r.reconciler.Reconcile(ctx, request)
 
 	labels := prometheus.Labels{
 		namespaceLabel: request.Namespace,
diff --git a/pkg/util/patch/patch.go b/pkg/util/patch/patch.go
index 09c4265..76d1cec 100644
--- a/pkg/util/patch/patch.go
+++ b/pkg/util/patch/patch.go
@@ -23,9 +23,10 @@ import (
 	jsonpatch "github.com/evanphx/json-patch"
 
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/util/json"
+
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
 func PositiveMergePatch(source runtime.Object, target runtime.Object) ([]byte, error) {
@@ -64,7 +65,7 @@ func PositiveMergePatch(source runtime.Object, target runtime.Object) ([]byte, e
 	return json.Marshal(positivePatch)
 }
 
-func PositiveApplyPatch(source runtime.Object) (runtime.Object, error) {
+func PositiveApplyPatch(source runtime.Object) (ctrl.Object, error) {
 	sourceJSON, err := json.Marshal(source)
 	if err != nil {
 		return nil, err


[camel-k] 04/05: fix: Do not sink events when the operator lacks Event permissions

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

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

commit 3a3b0bcf227130c57d17704edc65e56bd908a10b
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Thu Mar 4 18:47:31 2021 +0100

    fix: Do not sink events when the operator lacks Event permissions
---
 go.mod                       |  1 +
 pkg/cmd/operator/operator.go | 23 +++++++++-------
 pkg/event/broadcaster.go     | 62 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 10 deletions(-)

diff --git a/go.mod b/go.mod
index a8ded7a..69f7bea 100644
--- a/go.mod
+++ b/go.mod
@@ -48,6 +48,7 @@ require (
 	k8s.io/apimachinery v0.19.8
 	k8s.io/client-go v12.0.0+incompatible
 	k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14
+	k8s.io/klog/v2 v2.2.0
 	knative.dev/eventing v0.18.0
 	knative.dev/pkg v0.0.0-20200922164940-4bf40ad82aab
 	knative.dev/serving v0.18.0
diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go
index 7b07ef6..1938d28 100644
--- a/pkg/cmd/operator/operator.go
+++ b/pkg/cmd/operator/operator.go
@@ -43,6 +43,7 @@ import (
 	"github.com/apache/camel-k/pkg/apis"
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/controller"
+	"github.com/apache/camel-k/pkg/event"
 	"github.com/apache/camel-k/pkg/install"
 	"github.com/apache/camel-k/pkg/platform"
 	"github.com/apache/camel-k/pkg/util/defaults"
@@ -115,20 +116,23 @@ func Run(healthPort, monitoringPort int32) {
 	// so that we can check the operator has been granted permission to create
 	// Events. This is required for the operator to be installable by standard
 	// admin users, that are not granted create permission on Events by default.
-	eventBroadcaster := record.NewBroadcaster()
+	broadcaster := record.NewBroadcaster()
 	// nolint: gocritic
-	if ok, err := kubernetes.CheckPermission(context.TODO(), c, corev1.GroupName, "events", namespace, "", "create"); err != nil {
-		log.Error(err, "cannot check permissions for configuring event broadcaster")
-	} else if !ok {
-		log.Info("Event broadcasting to Kubernetes is disabled because of missing permissions to create events")
+	if ok, err := kubernetes.CheckPermission(context.TODO(), c, corev1.GroupName, "events", namespace, "", "create"); err != nil || !ok {
+		// Do not sink Events to the server as they'll be rejected
+		broadcaster = event.NewSinkLessBroadcaster(broadcaster)
+		if err != nil {
+			log.Error(err, "cannot check permissions for configuring event broadcaster")
+		} else if !ok {
+			log.Info("Event broadcasting to Kubernetes is disabled because of missing permissions to create events")
+		}
 	} else {
-		eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.CoreV1().Events(namespace)})
+		broadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.CoreV1().Events(namespace)})
 	}
 
-	// Create a new Cmd to provide shared dependencies and start components
 	mgr, err := ctrl.NewManager(cfg, ctrl.Options{
 		Namespace:              namespace,
-		EventBroadcaster:       eventBroadcaster,
+		EventBroadcaster:       broadcaster,
 		HealthProbeBindAddress: ":" + strconv.Itoa(int(healthPort)),
 		MetricsBindAddress:     ":" + strconv.Itoa(int(monitoringPort)),
 	})
@@ -165,13 +169,12 @@ func Run(healthPort, monitoringPort int32) {
 
 	log.Info("Starting the Cmd.")
 
-	// Start the Cmd
 	if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
 		log.Error(err, "manager exited non-zero")
 		os.Exit(1)
 	}
 
-	eventBroadcaster.Shutdown()
+	broadcaster.Shutdown()
 }
 
 // getWatchNamespace returns the Namespace the operator should be watching for changes
diff --git a/pkg/event/broadcaster.go b/pkg/event/broadcaster.go
new file mode 100644
index 0000000..fd8f5be
--- /dev/null
+++ b/pkg/event/broadcaster.go
@@ -0,0 +1,62 @@
+/*
+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.
+*/
+
+package event
+
+import (
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/client-go/tools/record"
+	"k8s.io/klog/v2"
+)
+
+type sinkLessBroadcaster struct {
+	broadcaster record.EventBroadcaster
+}
+
+func (s sinkLessBroadcaster) StartEventWatcher(eventHandler func(*corev1.Event)) watch.Interface {
+	return s.broadcaster.StartEventWatcher(eventHandler)
+}
+
+func (s sinkLessBroadcaster) StartRecordingToSink(sink record.EventSink) watch.Interface {
+	return watch.NewEmptyWatch()
+}
+
+func (s sinkLessBroadcaster) StartLogging(logf func(format string, args ...interface{})) watch.Interface {
+	return s.broadcaster.StartLogging(logf)
+}
+
+func (s sinkLessBroadcaster) StartStructuredLogging(verbosity klog.Level) watch.Interface {
+	return s.broadcaster.StartStructuredLogging(verbosity)
+}
+
+func (s sinkLessBroadcaster) NewRecorder(scheme *runtime.Scheme, source corev1.EventSource) record.EventRecorder {
+	return s.broadcaster.NewRecorder(scheme, source)
+}
+
+func (s sinkLessBroadcaster) Shutdown() {
+	s.broadcaster.Shutdown()
+}
+
+var _ record.EventBroadcaster = &sinkLessBroadcaster{}
+
+func NewSinkLessBroadcaster(broadcaster record.EventBroadcaster) record.EventBroadcaster {
+	return &sinkLessBroadcaster{
+		broadcaster: broadcaster,
+	}
+}


[camel-k] 02/05: chore: Remove uneeded DeepCopyObject calls before Update/Patch

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

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

commit 0c24b3f717a345cfe51848a09846f051be9e32d8
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Wed Mar 3 16:16:22 2021 +0100

    chore: Remove uneeded DeepCopyObject calls before Update/Patch
---
 pkg/cmd/kit_create.go                 |  7 +++----
 pkg/cmd/run.go                        | 22 ++++++++++++++--------
 pkg/platform/defaults.go              | 13 +++++++++----
 pkg/trait/deployer.go                 |  9 ++++++---
 pkg/util/maven/maven_settings.go      | 15 ++++++---------
 pkg/util/maven/maven_settings_test.go |  5 +++--
 6 files changed, 41 insertions(+), 30 deletions(-)

diff --git a/pkg/cmd/kit_create.go b/pkg/cmd/kit_create.go
index e757fe7..0d26e1d 100644
--- a/pkg/cmd/kit_create.go
+++ b/pkg/cmd/kit_create.go
@@ -23,7 +23,6 @@ import (
 	"strings"
 
 	"github.com/spf13/cobra"
-
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 
@@ -171,13 +170,13 @@ func (command *kitCreateCommandOptions) run(_ *cobra.Command, args []string) err
 	err = c.Create(command.Context, &kit)
 	if err != nil && k8serrors.IsAlreadyExists(err) {
 		existed = true
-		clone := kit.DeepCopy()
-		err = c.Get(command.Context, key, clone)
+		existing := v1.NewIntegrationKit(kit.Namespace, kit.Name)
+		err = c.Get(command.Context, key, &existing)
 		if err != nil {
 			fmt.Print(err.Error())
 			return nil
 		}
-		kit.ResourceVersion = clone.ResourceVersion
+		kit.ResourceVersion = existing.ResourceVersion
 		err = c.Update(command.Context, &kit)
 	}
 
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index bf6ad39..a77afa5 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -39,6 +39,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
@@ -301,13 +302,13 @@ func (o *runCmdOptions) run(cmd *cobra.Command, args []string) error {
 			}
 
 			// The integration watch timed out so recreate it using the latest integration resource version
-			clone := integration.DeepCopy()
-			err = c.Get(o.Context, ctrl.ObjectKeyFromObject(clone), clone)
+			existing := v1.NewIntegration(integration.Namespace, integration.Name)
+			err = c.Get(o.Context, ctrl.ObjectKeyFromObject(&existing), &existing)
 			if err != nil {
 				return err
 			}
 
-			integration.ObjectMeta.ResourceVersion = clone.ObjectMeta.ResourceVersion
+			integration.ObjectMeta.ResourceVersion = existing.ObjectMeta.ResourceVersion
 		}
 	}
 	if o.Logs || o.Dev {
@@ -584,19 +585,24 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 	err = c.Create(o.Context, &integration)
 	if err != nil && k8serrors.IsAlreadyExists(err) {
 		existed = true
-		clone := integration.DeepCopy()
-		err = c.Get(o.Context, ctrl.ObjectKeyFromObject(clone), clone)
+		existing := &v1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: integration.Namespace,
+				Name:      integration.Name,
+			},
+		}
+		err = c.Get(o.Context, ctrl.ObjectKeyFromObject(existing), existing)
 		if err != nil {
 			return nil, err
 		}
 		// Hold the resource from the operator controller
-		clone.Status.Phase = v1.IntegrationPhaseUpdating
-		err = c.Status().Update(o.Context, clone)
+		existing.Status.Phase = v1.IntegrationPhaseUpdating
+		err = c.Status().Update(o.Context, existing)
 		if err != nil {
 			return nil, err
 		}
 		// Update the spec
-		integration.ResourceVersion = clone.ResourceVersion
+		integration.ResourceVersion = existing.ResourceVersion
 		err = c.Update(o.Context, &integration)
 		if err != nil {
 			return nil, err
diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go
index 22cab53..9e344f0 100644
--- a/pkg/platform/defaults.go
+++ b/pkg/platform/defaults.go
@@ -284,7 +284,7 @@ func setPlatformDefaults(ctx context.Context, c client.Client, p *v1.Integration
 }
 
 func createDefaultMavenSettingsConfigMap(ctx context.Context, client client.Client, p *v1.IntegrationPlatform, settings maven.Settings) error {
-	cm, err := maven.CreateSettingsConfigMap(p.Namespace, p.Name, settings)
+	cm, err := maven.SettingsConfigMap(p.Namespace, p.Name, settings)
 	if err != nil {
 		return err
 	}
@@ -293,13 +293,18 @@ func createDefaultMavenSettingsConfigMap(ctx context.Context, client client.Clie
 	if err != nil && !k8serrors.IsAlreadyExists(err) {
 		return err
 	} else if k8serrors.IsAlreadyExists(err) {
-		cmCopy := cm.DeepCopyObject().(ctrl.Object)
-		err = client.Get(ctx, ctrl.ObjectKeyFromObject(cm), cmCopy)
+		existing := &corev1.ConfigMap{
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: cm.Namespace,
+				Name:      cm.Name,
+			},
+		}
+		err = client.Get(ctx, ctrl.ObjectKeyFromObject(existing), existing)
 		if err != nil {
 			return err
 		}
 
-		p, err := patch.PositiveMergePatch(cmCopy, cm)
+		p, err := patch.PositiveMergePatch(existing, cm)
 		if err != nil {
 			return err
 		} else if len(p) != 0 {
diff --git a/pkg/trait/deployer.go b/pkg/trait/deployer.go
index f8a895a..7c7dc96 100644
--- a/pkg/trait/deployer.go
+++ b/pkg/trait/deployer.go
@@ -23,6 +23,7 @@ import (
 	"github.com/pkg/errors"
 
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/types"
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
@@ -127,9 +128,11 @@ func (t *deployerTrait) clientSideApply(env *Environment, resource ctrl.Object)
 	} else if !k8serrors.IsAlreadyExists(err) {
 		return errors.Wrapf(err, "error during create resource: %v", resource)
 	}
-	key := ctrl.ObjectKeyFromObject(resource)
-	object := resource.DeepCopyObject().(ctrl.Object)
-	err = env.Client.Get(env.C, key, object)
+	object := &unstructured.Unstructured{}
+	object.SetNamespace(resource.GetNamespace())
+	object.SetName(resource.GetName())
+	object.SetGroupVersionKind(resource.GetObjectKind().GroupVersionKind())
+	err = env.Client.Get(env.C, ctrl.ObjectKeyFromObject(object), object)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/util/maven/maven_settings.go b/pkg/util/maven/maven_settings.go
index 206b3ed..a1bac60 100644
--- a/pkg/util/maven/maven_settings.go
+++ b/pkg/util/maven/maven_settings.go
@@ -21,17 +21,16 @@ import (
 	"encoding/xml"
 	"strings"
 
-	"github.com/apache/camel-k/pkg/util"
-
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"github.com/apache/camel-k/pkg/util"
 )
 
 // DefaultMavenRepositories is a comma separated list of default maven repositories
 // This variable can be overridden at build time
 var DefaultMavenRepositories = "https://repo.maven.apache.org/maven2@id=central"
 
-// NewSettings --
 func NewSettings() Settings {
 	return Settings{
 		XMLName:           xml.Name{Local: "settings"},
@@ -41,12 +40,11 @@ func NewSettings() Settings {
 	}
 }
 
-// NewDefaultSettings --
 func NewDefaultSettings(repositories []Repository, mirrors []Mirror) Settings {
 	settings := NewSettings()
 
 	var additionalRepos []Repository
-	for _, defaultRepo := range getDefaultMavenRepositories() {
+	for _, defaultRepo := range defaultMavenRepositories() {
 		if !containsRepo(repositories, defaultRepo.ID) {
 			additionalRepos = append(additionalRepos, defaultRepo)
 		}
@@ -71,8 +69,7 @@ func NewDefaultSettings(repositories []Repository, mirrors []Mirror) Settings {
 	return settings
 }
 
-// CreateSettingsConfigMap --
-func CreateSettingsConfigMap(namespace string, name string, settings Settings) (*corev1.ConfigMap, error) {
+func SettingsConfigMap(namespace string, name string, settings Settings) (*corev1.ConfigMap, error) {
 	data, err := util.EncodeXML(settings)
 	if err != nil {
 		return nil, err
@@ -81,7 +78,7 @@ func CreateSettingsConfigMap(namespace string, name string, settings Settings) (
 	cm := &corev1.ConfigMap{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       "ConfigMap",
-			APIVersion: "v1",
+			APIVersion: corev1.SchemeGroupVersion.String(),
 		},
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      name + "-maven-settings",
@@ -98,7 +95,7 @@ func CreateSettingsConfigMap(namespace string, name string, settings Settings) (
 	return cm, nil
 }
 
-func getDefaultMavenRepositories() (repos []Repository) {
+func defaultMavenRepositories() (repos []Repository) {
 	for _, repoDesc := range strings.Split(DefaultMavenRepositories, ",") {
 		repos = append(repos, NewRepository(repoDesc))
 	}
diff --git a/pkg/util/maven/maven_settings_test.go b/pkg/util/maven/maven_settings_test.go
index cebada9..aa8b010 100644
--- a/pkg/util/maven/maven_settings_test.go
+++ b/pkg/util/maven/maven_settings_test.go
@@ -20,8 +20,9 @@ package maven
 import (
 	"testing"
 
-	"github.com/apache/camel-k/pkg/util"
 	"github.com/stretchr/testify/assert"
+
+	"github.com/apache/camel-k/pkg/util"
 )
 
 const expectedSettings = `<?xml version="1.0" encoding="UTF-8"?>
@@ -238,7 +239,7 @@ func TestDefaultSettingsGenerationWithAdditionalRepo(t *testing.T) {
 func TestCreateSettingsConfigMap(t *testing.T) {
 	settings := NewDefaultSettings([]Repository{}, []Mirror{})
 
-	configMap, err := CreateSettingsConfigMap("foo", "bar", settings)
+	configMap, err := SettingsConfigMap("foo", "bar", settings)
 	assert.Nil(t, err)
 	assert.NotNil(t, configMap)
 


[camel-k] 03/05: fix: Do not rely on default controller-runtime EventBroadcaster

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

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

commit 2b06b9a579d47e4617a229aaa486b833c445cc76
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Thu Mar 4 15:32:52 2021 +0100

    fix: Do not rely on default controller-runtime EventBroadcaster
---
 pkg/cmd/operator/operator.go | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go
index 39253a0..7b07ef6 100644
--- a/pkg/cmd/operator/operator.go
+++ b/pkg/cmd/operator/operator.go
@@ -111,15 +111,17 @@ func Run(healthPort, monitoringPort int32) {
 		os.Exit(1)
 	}
 
-	// Configure event broadcaster
-	var eventBroadcaster record.EventBroadcaster
+	// We do not rely on the event broadcaster managed by controller runtime,
+	// so that we can check the operator has been granted permission to create
+	// Events. This is required for the operator to be installable by standard
+	// admin users, that are not granted create permission on Events by default.
+	eventBroadcaster := record.NewBroadcaster()
 	// nolint: gocritic
 	if ok, err := kubernetes.CheckPermission(context.TODO(), c, corev1.GroupName, "events", namespace, "", "create"); err != nil {
 		log.Error(err, "cannot check permissions for configuring event broadcaster")
 	} else if !ok {
 		log.Info("Event broadcasting to Kubernetes is disabled because of missing permissions to create events")
 	} else {
-		eventBroadcaster = record.NewBroadcaster()
 		eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.CoreV1().Events(namespace)})
 	}
 
@@ -168,6 +170,8 @@ func Run(healthPort, monitoringPort int32) {
 		log.Error(err, "manager exited non-zero")
 		os.Exit(1)
 	}
+
+	eventBroadcaster.Shutdown()
 }
 
 // getWatchNamespace returns the Namespace the operator should be watching for changes