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

[camel-k] 01/02: Fix #1036: generate k8s client for camel k resources

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

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

commit 890a463018ac6ccc0f6367b338970ecad51a3f4e
Author: Nicola Ferraro <ni...@gmail.com>
AuthorDate: Mon Nov 11 23:10:14 2019 +0100

    Fix #1036: generate k8s client for camel k resources
---
 e2e/client_test.go                                 |  63 +++++++
 go.sum                                             |   5 +
 pkg/apis/camel/v1alpha1/build_types.go             |   3 +-
 pkg/apis/camel/v1alpha1/integration_types.go       |   1 +
 pkg/apis/camel/v1alpha1/integrationkit_types.go    |   4 +-
 .../camel/v1alpha1/integrationplatform_types.go    |   3 +-
 pkg/apis/camel/v1alpha1/register.go                |   8 +
 pkg/client/clientset/versioned/clientset.go        |  91 ++++++++++
 .../clientset/versioned/doc.go}                    |  21 +--
 .../versioned/fake/clientset_generated.go          |  83 +++++++++
 .../clientset/versioned/fake/doc.go}               |  21 +--
 pkg/client/clientset/versioned/fake/register.go    |  57 ++++++
 .../clientset/versioned/scheme/doc.go}             |  21 +--
 pkg/client/clientset/versioned/scheme/register.go  |  57 ++++++
 .../versioned/typed/camel/v1alpha1/build.go        | 192 +++++++++++++++++++++
 .../versioned/typed/camel/v1alpha1/camel_client.go | 105 +++++++++++
 .../versioned/typed/camel/v1alpha1/doc.go}         |  19 +-
 .../versioned/typed/camel/v1alpha1/fake/doc.go}    |  21 +--
 .../typed/camel/v1alpha1/fake/fake_build.go        | 141 +++++++++++++++
 .../typed/camel/v1alpha1/fake/fake_camel_client.go |  53 ++++++
 .../typed/camel/v1alpha1/fake/fake_integration.go  | 141 +++++++++++++++
 .../camel/v1alpha1/fake/fake_integrationkit.go     | 141 +++++++++++++++
 .../v1alpha1/fake/fake_integrationplatform.go      | 141 +++++++++++++++
 .../typed/camel/v1alpha1/generated_expansion.go}   |  20 +--
 .../versioned/typed/camel/v1alpha1/integration.go  | 192 +++++++++++++++++++++
 .../typed/camel/v1alpha1/integrationkit.go         | 192 +++++++++++++++++++++
 .../typed/camel/v1alpha1/integrationplatform.go    | 192 +++++++++++++++++++++
 .../informers/externalversions/camel/interface.go  |  47 +++++
 .../externalversions/camel/v1alpha1/build.go       |  90 ++++++++++
 .../externalversions/camel/v1alpha1/integration.go |  90 ++++++++++
 .../camel/v1alpha1/integrationkit.go               |  90 ++++++++++
 .../camel/v1alpha1/integrationplatform.go          |  90 ++++++++++
 .../externalversions/camel/v1alpha1/interface.go   |  67 +++++++
 pkg/client/informers/externalversions/factory.go   | 181 +++++++++++++++++++
 pkg/client/informers/externalversions/generic.go   |  69 ++++++++
 .../internalinterfaces/factory_interfaces.go       |  41 +++++
 pkg/client/listers/camel/v1alpha1/build.go         |  95 ++++++++++
 .../listers/camel/v1alpha1/expansion_generated.go  |  52 ++++++
 pkg/client/listers/camel/v1alpha1/integration.go   |  95 ++++++++++
 .../listers/camel/v1alpha1/integrationkit.go       |  95 ++++++++++
 .../listers/camel/v1alpha1/integrationplatform.go  |  95 ++++++++++
 script/Makefile                                    |   9 +-
 script/gen_client.sh                               |  50 ++++++
 43 files changed, 3136 insertions(+), 108 deletions(-)

diff --git a/e2e/client_test.go b/e2e/client_test.go
new file mode 100644
index 0000000..070a21e
--- /dev/null
+++ b/e2e/client_test.go
@@ -0,0 +1,63 @@
+// +build integration
+
+// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
+
+/*
+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 e2e
+
+import (
+	"testing"
+
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/client/clientset/versioned"
+	. "github.com/onsi/gomega"
+	"github.com/stretchr/testify/assert"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client/config"
+)
+
+func TestClientFunctionalities(t *testing.T) {
+	withNewTestNamespace(func(ns string) {
+		RegisterTestingT(t)
+
+		cfg, err := config.GetConfig()
+		assert.Nil(t, err)
+		camel, err := versioned.NewForConfig(cfg)
+		assert.Nil(t, err)
+
+		lst, err := camel.CamelV1alpha1().Integrations(ns).List(metav1.ListOptions{})
+		assert.Nil(t, err)
+		assert.Empty(t, lst.Items)
+
+		integration, err := camel.CamelV1alpha1().Integrations(ns).Create(&v1alpha1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: "dummy",
+			},
+		})
+		assert.Nil(t, err)
+
+		lst, err = camel.CamelV1alpha1().Integrations(ns).List(metav1.ListOptions{})
+		assert.Nil(t, err)
+		assert.NotEmpty(t, lst.Items)
+		assert.Equal(t, lst.Items[0].Name, integration.Name)
+
+		err = camel.CamelV1alpha1().Integrations(ns).Delete("dummy", nil)
+		assert.Nil(t, err)
+	})
+}
diff --git a/go.sum b/go.sum
index 7d0ea03..3b69a14 100644
--- a/go.sum
+++ b/go.sum
@@ -647,6 +647,7 @@ golang.org/x/tools v0.0.0-20190320215829-36c10c0a621f/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a h1:UuQ+70Pi/ZdWHuP4v457pkXeOynTdgd/4enxeIO/98k=
 golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -719,6 +720,7 @@ k8s.io/client-go v0.0.0-20190918200256-06eb1244587a h1:huOvPq1vO7dkuw9rZPYsLGpFm
 k8s.io/client-go v0.0.0-20190918200256-06eb1244587a/go.mod h1:3YAcTbI2ArBRmhHns5vlHRX8YQqvkVYpz+U/N5i1mVU=
 k8s.io/cloud-provider v0.0.0-20190918203125-ae665f80358a/go.mod h1:hfxdMPnFjoiVZrbaHkBS0t56GelBDM199c4gOXAwQ/I=
 k8s.io/cluster-bootstrap v0.0.0-20190918202959-c340507a5d48/go.mod h1:JoNzH2HyeimzRZXShJRDmpANOXTTL5RoXNbeCS3D8gY=
+k8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b h1:p+PRuwXWwk5e+UYvicGiavEupapqM5NOxUl3y1GkD6c=
 k8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b/go.mod h1:G8bQwmHm2eafm5bgtX67XDZQ8CWKSGu9DekI+yN4Y5I=
 k8s.io/component-base v0.0.0-20190918200425-ed2f0867c778/go.mod h1:DFWQCXgXVLiWtzFaS17KxHdlUeUymP7FLxZSkmL9/jU=
 k8s.io/cri-api v0.0.0-20190817025403-3ae76f584e79/go.mod h1:MQf3sTYxPlSVy4QhUrDFfHWFxHtwhdpvGBECKGhZULk=
@@ -728,6 +730,7 @@ k8s.io/gengo v0.0.0-20181113154421-fd15ee9cc2f7/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8
 k8s.io/gengo v0.0.0-20190116091435-f8a0810f38af/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20190327210449-e17681d19d3a/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20191010091904-7fa3014cb28f h1:eW/6wVuHNZgQJmFesyAxu0cvj0WAHHUuGaLbPcmNY3Q=
 k8s.io/gengo v0.0.0-20191010091904-7fa3014cb28f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM=
 k8s.io/helm v2.15.0+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI=
@@ -753,7 +756,9 @@ k8s.io/kubelet v0.0.0-20190918202550-958285cf3eef/go.mod h1:y3faEeGRJ9L54/YJWIF0
 k8s.io/kubernetes v1.11.7-beta.0.0.20181219023948-b875d52ea96d/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 k8s.io/kubernetes v1.11.8-beta.0.0.20190124204751-3a10094374f2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 k8s.io/kubernetes v1.14.2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
+k8s.io/kubernetes v1.15.4 h1:ykcH+DoCr9wYjYfHvd2xU0HoSo/Y9m4+/0+zHqkYjbw=
 k8s.io/kubernetes v1.15.4/go.mod h1:4Ggyo4AFgjbIzULOminzUJAvgbzY3j5ysXlW/a0PdcQ=
+k8s.io/kubernetes v1.16.2 h1:k0f/OVp6Yfv+UMTm6VYKhqjRgcvHh4QhN9coanjrito=
 k8s.io/legacy-cloud-providers v0.0.0-20190918203421-225f0541b3ea/go.mod h1:qd7ZEaONgkMZRdUbaoK6ngxjuJz8kLBImMukwL7mOIg=
 k8s.io/metrics v0.0.0-20190918202012-3c1ca76f5bda/go.mod h1:LxAN6ulYLPVQGTtRkXEUyylgseTWArq1iCZ9Zve8edc=
 k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ=
diff --git a/pkg/apis/camel/v1alpha1/build_types.go b/pkg/apis/camel/v1alpha1/build_types.go
index c429fa7..9f13e60 100644
--- a/pkg/apis/camel/v1alpha1/build_types.go
+++ b/pkg/apis/camel/v1alpha1/build_types.go
@@ -100,6 +100,7 @@ const (
 
 // Build is the Schema for the builds API
 // +k8s:openapi-gen=true
+// +genclient
 type Build struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
@@ -117,7 +118,7 @@ type BuildList struct {
 	Items           []Build `json:"items"`
 }
 
-// Condition describes the state of a resource at a certain point.
+// BuildCondition describes the state of a resource at a certain point.
 type BuildCondition struct {
 	// Type of integration condition.
 	Type BuildConditionType `json:"type"`
diff --git a/pkg/apis/camel/v1alpha1/integration_types.go b/pkg/apis/camel/v1alpha1/integration_types.go
index f50c1d0..e93b73e 100644
--- a/pkg/apis/camel/v1alpha1/integration_types.go
+++ b/pkg/apis/camel/v1alpha1/integration_types.go
@@ -61,6 +61,7 @@ type IntegrationStatus struct {
 
 // Integration is the Schema for the integrations API
 // +k8s:openapi-gen=true
+// +genclient
 type Integration struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
diff --git a/pkg/apis/camel/v1alpha1/integrationkit_types.go b/pkg/apis/camel/v1alpha1/integrationkit_types.go
index 43b8173..3e2e11e 100644
--- a/pkg/apis/camel/v1alpha1/integrationkit_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationkit_types.go
@@ -14,6 +14,7 @@ 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 v1alpha1
 
 import (
@@ -53,6 +54,7 @@ type IntegrationKitStatus struct {
 
 // IntegrationKit is the Schema for the integrationkits API
 // +k8s:openapi-gen=true
+// +genclient
 type IntegrationKit struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
@@ -110,7 +112,7 @@ const (
 	IntegrationKitConditionPlatformAvailableReason string = "IntegrationPlatformAvailable"
 )
 
-// Condition describes the state of a resource at a certain point.
+// IntegrationKitCondition describes the state of a resource at a certain point.
 type IntegrationKitCondition struct {
 	// Type of integration condition.
 	Type IntegrationKitConditionType `json:"type"`
diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
index 6626eae..e245458 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
@@ -50,6 +50,7 @@ type IntegrationPlatformStatus struct {
 
 // IntegrationPlatform is the Schema for the integrationplatforms API
 // +k8s:openapi-gen=true
+// +genclient
 type IntegrationPlatform struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
@@ -160,7 +161,7 @@ const (
 	IntegrationPlatformPhaseDuplicate IntegrationPlatformPhase = "Duplicate"
 )
 
-// Condition describes the state of a resource at a certain point.
+// IntegrationPlatformCondition describes the state of a resource at a certain point.
 type IntegrationPlatformCondition struct {
 	// Type of integration condition.
 	Type IntegrationPlatformConditionType `json:"type"`
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/apis/camel/v1alpha1/register.go
index e948772..bd58570 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/apis/camel/v1alpha1/register.go
@@ -33,4 +33,12 @@ var (
 
 	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
 	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
+
+	// AddToScheme is a shortcut to SchemeBuilder.AddToScheme
+	AddToScheme = SchemeBuilder.AddToScheme
 )
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
diff --git a/pkg/client/clientset/versioned/clientset.go b/pkg/client/clientset/versioned/clientset.go
new file mode 100644
index 0000000..c93d6d1
--- /dev/null
+++ b/pkg/client/clientset/versioned/clientset.go
@@ -0,0 +1,91 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package versioned
+
+import (
+	camelv1alpha1 "github.com/apache/camel-k/pkg/client/clientset/versioned/typed/camel/v1alpha1"
+	discovery "k8s.io/client-go/discovery"
+	rest "k8s.io/client-go/rest"
+	flowcontrol "k8s.io/client-go/util/flowcontrol"
+)
+
+type Interface interface {
+	Discovery() discovery.DiscoveryInterface
+	CamelV1alpha1() camelv1alpha1.CamelV1alpha1Interface
+}
+
+// Clientset contains the clients for groups. Each group has exactly one
+// version included in a Clientset.
+type Clientset struct {
+	*discovery.DiscoveryClient
+	camelV1alpha1 *camelv1alpha1.CamelV1alpha1Client
+}
+
+// CamelV1alpha1 retrieves the CamelV1alpha1Client
+func (c *Clientset) CamelV1alpha1() camelv1alpha1.CamelV1alpha1Interface {
+	return c.camelV1alpha1
+}
+
+// Discovery retrieves the DiscoveryClient
+func (c *Clientset) Discovery() discovery.DiscoveryInterface {
+	if c == nil {
+		return nil
+	}
+	return c.DiscoveryClient
+}
+
+// NewForConfig creates a new Clientset for the given config.
+func NewForConfig(c *rest.Config) (*Clientset, error) {
+	configShallowCopy := *c
+	if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
+		configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
+	}
+	var cs Clientset
+	var err error
+	cs.camelV1alpha1, err = camelv1alpha1.NewForConfig(&configShallowCopy)
+	if err != nil {
+		return nil, err
+	}
+
+	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
+	if err != nil {
+		return nil, err
+	}
+	return &cs, nil
+}
+
+// NewForConfigOrDie creates a new Clientset for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *Clientset {
+	var cs Clientset
+	cs.camelV1alpha1 = camelv1alpha1.NewForConfigOrDie(c)
+
+	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
+	return &cs
+}
+
+// New creates a new Clientset for the given RESTClient.
+func New(c rest.Interface) *Clientset {
+	var cs Clientset
+	cs.camelV1alpha1 = camelv1alpha1.New(c)
+
+	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
+	return &cs
+}
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/client/clientset/versioned/doc.go
similarity index 54%
copy from pkg/apis/camel/v1alpha1/register.go
copy to pkg/client/clientset/versioned/doc.go
index e948772..c82aadf 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/client/clientset/versioned/doc.go
@@ -15,22 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// NOTE: Boilerplate only.  Ignore this file.
+// Code generated by client-gen. DO NOT EDIT.
 
-// Package v1alpha1 contains API Schema definitions for the camel v1alpha1 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=camel.apache.org
-package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "camel.apache.org", Version: "v1alpha1"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
+// This package has the automatically generated clientset.
+package versioned
diff --git a/pkg/client/clientset/versioned/fake/clientset_generated.go b/pkg/client/clientset/versioned/fake/clientset_generated.go
new file mode 100644
index 0000000..388c13d
--- /dev/null
+++ b/pkg/client/clientset/versioned/fake/clientset_generated.go
@@ -0,0 +1,83 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	clientset "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	camelv1alpha1 "github.com/apache/camel-k/pkg/client/clientset/versioned/typed/camel/v1alpha1"
+	fakecamelv1alpha1 "github.com/apache/camel-k/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/client-go/discovery"
+	fakediscovery "k8s.io/client-go/discovery/fake"
+	"k8s.io/client-go/testing"
+)
+
+// NewSimpleClientset returns a clientset that will respond with the provided objects.
+// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
+// without applying any validations and/or defaults. It shouldn't be considered a replacement
+// for a real clientset and is mostly useful in simple unit tests.
+func NewSimpleClientset(objects ...runtime.Object) *Clientset {
+	o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
+	for _, obj := range objects {
+		if err := o.Add(obj); err != nil {
+			panic(err)
+		}
+	}
+
+	cs := &Clientset{tracker: o}
+	cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake}
+	cs.AddReactor("*", "*", testing.ObjectReaction(o))
+	cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) {
+		gvr := action.GetResource()
+		ns := action.GetNamespace()
+		watch, err := o.Watch(gvr, ns)
+		if err != nil {
+			return false, nil, err
+		}
+		return true, watch, nil
+	})
+
+	return cs
+}
+
+// Clientset implements clientset.Interface. Meant to be embedded into a
+// struct to get a default implementation. This makes faking out just the method
+// you want to test easier.
+type Clientset struct {
+	testing.Fake
+	discovery *fakediscovery.FakeDiscovery
+	tracker   testing.ObjectTracker
+}
+
+func (c *Clientset) Discovery() discovery.DiscoveryInterface {
+	return c.discovery
+}
+
+func (c *Clientset) Tracker() testing.ObjectTracker {
+	return c.tracker
+}
+
+var _ clientset.Interface = &Clientset{}
+
+// CamelV1alpha1 retrieves the CamelV1alpha1Client
+func (c *Clientset) CamelV1alpha1() camelv1alpha1.CamelV1alpha1Interface {
+	return &fakecamelv1alpha1.FakeCamelV1alpha1{Fake: &c.Fake}
+}
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/client/clientset/versioned/fake/doc.go
similarity index 54%
copy from pkg/apis/camel/v1alpha1/register.go
copy to pkg/client/clientset/versioned/fake/doc.go
index e948772..9c6a5fa 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/client/clientset/versioned/fake/doc.go
@@ -15,22 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// NOTE: Boilerplate only.  Ignore this file.
+// Code generated by client-gen. DO NOT EDIT.
 
-// Package v1alpha1 contains API Schema definitions for the camel v1alpha1 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=camel.apache.org
-package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "camel.apache.org", Version: "v1alpha1"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
+// This package has the automatically generated fake clientset.
+package fake
diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go
new file mode 100644
index 0000000..96d01d3
--- /dev/null
+++ b/pkg/client/clientset/versioned/fake/register.go
@@ -0,0 +1,57 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	camelv1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+)
+
+var scheme = runtime.NewScheme()
+var codecs = serializer.NewCodecFactory(scheme)
+var parameterCodec = runtime.NewParameterCodec(scheme)
+var localSchemeBuilder = runtime.SchemeBuilder{
+	camelv1alpha1.AddToScheme,
+}
+
+// AddToScheme adds all types of this clientset into the given scheme. This allows composition
+// of clientsets, like in:
+//
+//   import (
+//     "k8s.io/client-go/kubernetes"
+//     clientsetscheme "k8s.io/client-go/kubernetes/scheme"
+//     aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
+//   )
+//
+//   kclientset, _ := kubernetes.NewForConfig(c)
+//   _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
+//
+// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
+// correctly.
+var AddToScheme = localSchemeBuilder.AddToScheme
+
+func init() {
+	v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
+	utilruntime.Must(AddToScheme(scheme))
+}
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/client/clientset/versioned/scheme/doc.go
similarity index 54%
copy from pkg/apis/camel/v1alpha1/register.go
copy to pkg/client/clientset/versioned/scheme/doc.go
index e948772..dd7d3b5 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/client/clientset/versioned/scheme/doc.go
@@ -15,22 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// NOTE: Boilerplate only.  Ignore this file.
+// Code generated by client-gen. DO NOT EDIT.
 
-// Package v1alpha1 contains API Schema definitions for the camel v1alpha1 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=camel.apache.org
-package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "camel.apache.org", Version: "v1alpha1"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
+// This package contains the scheme of the automatically generated clientset.
+package scheme
diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go
new file mode 100644
index 0000000..fb6453a
--- /dev/null
+++ b/pkg/client/clientset/versioned/scheme/register.go
@@ -0,0 +1,57 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package scheme
+
+import (
+	camelv1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+)
+
+var Scheme = runtime.NewScheme()
+var Codecs = serializer.NewCodecFactory(Scheme)
+var ParameterCodec = runtime.NewParameterCodec(Scheme)
+var localSchemeBuilder = runtime.SchemeBuilder{
+	camelv1alpha1.AddToScheme,
+}
+
+// AddToScheme adds all types of this clientset into the given scheme. This allows composition
+// of clientsets, like in:
+//
+//   import (
+//     "k8s.io/client-go/kubernetes"
+//     clientsetscheme "k8s.io/client-go/kubernetes/scheme"
+//     aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
+//   )
+//
+//   kclientset, _ := kubernetes.NewForConfig(c)
+//   _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
+//
+// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
+// correctly.
+var AddToScheme = localSchemeBuilder.AddToScheme
+
+func init() {
+	v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
+	utilruntime.Must(AddToScheme(Scheme))
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/build.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/build.go
new file mode 100644
index 0000000..65eacbf
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/build.go
@@ -0,0 +1,192 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	scheme "github.com/apache/camel-k/pkg/client/clientset/versioned/scheme"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+)
+
+// BuildsGetter has a method to return a BuildInterface.
+// A group's client should implement this interface.
+type BuildsGetter interface {
+	Builds(namespace string) BuildInterface
+}
+
+// BuildInterface has methods to work with Build resources.
+type BuildInterface interface {
+	Create(*v1alpha1.Build) (*v1alpha1.Build, error)
+	Update(*v1alpha1.Build) (*v1alpha1.Build, error)
+	UpdateStatus(*v1alpha1.Build) (*v1alpha1.Build, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.Build, error)
+	List(opts v1.ListOptions) (*v1alpha1.BuildList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Build, err error)
+	BuildExpansion
+}
+
+// builds implements BuildInterface
+type builds struct {
+	client rest.Interface
+	ns     string
+}
+
+// newBuilds returns a Builds
+func newBuilds(c *CamelV1alpha1Client, namespace string) *builds {
+	return &builds{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the build, and returns the corresponding build object, and an error if there is any.
+func (c *builds) Get(name string, options v1.GetOptions) (result *v1alpha1.Build, err error) {
+	result = &v1alpha1.Build{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("builds").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of Builds that match those selectors.
+func (c *builds) List(opts v1.ListOptions) (result *v1alpha1.BuildList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.BuildList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("builds").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested builds.
+func (c *builds) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("builds").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a build and creates it.  Returns the server's representation of the build, and an error, if there is any.
+func (c *builds) Create(build *v1alpha1.Build) (result *v1alpha1.Build, err error) {
+	result = &v1alpha1.Build{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("builds").
+		Body(build).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a build and updates it. Returns the server's representation of the build, and an error, if there is any.
+func (c *builds) Update(build *v1alpha1.Build) (result *v1alpha1.Build, err error) {
+	result = &v1alpha1.Build{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("builds").
+		Name(build.Name).
+		Body(build).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *builds) UpdateStatus(build *v1alpha1.Build) (result *v1alpha1.Build, err error) {
+	result = &v1alpha1.Build{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("builds").
+		Name(build.Name).
+		SubResource("status").
+		Body(build).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the build and deletes it. Returns an error if one occurs.
+func (c *builds) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("builds").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *builds) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("builds").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched build.
+func (c *builds) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Build, err error) {
+	result = &v1alpha1.Build{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("builds").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/camel_client.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/camel_client.go
new file mode 100644
index 0000000..389abb5
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/camel_client.go
@@ -0,0 +1,105 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/client/clientset/versioned/scheme"
+	rest "k8s.io/client-go/rest"
+)
+
+type CamelV1alpha1Interface interface {
+	RESTClient() rest.Interface
+	BuildsGetter
+	IntegrationsGetter
+	IntegrationKitsGetter
+	IntegrationPlatformsGetter
+}
+
+// CamelV1alpha1Client is used to interact with features provided by the camel.apache.org group.
+type CamelV1alpha1Client struct {
+	restClient rest.Interface
+}
+
+func (c *CamelV1alpha1Client) Builds(namespace string) BuildInterface {
+	return newBuilds(c, namespace)
+}
+
+func (c *CamelV1alpha1Client) Integrations(namespace string) IntegrationInterface {
+	return newIntegrations(c, namespace)
+}
+
+func (c *CamelV1alpha1Client) IntegrationKits(namespace string) IntegrationKitInterface {
+	return newIntegrationKits(c, namespace)
+}
+
+func (c *CamelV1alpha1Client) IntegrationPlatforms(namespace string) IntegrationPlatformInterface {
+	return newIntegrationPlatforms(c, namespace)
+}
+
+// NewForConfig creates a new CamelV1alpha1Client for the given config.
+func NewForConfig(c *rest.Config) (*CamelV1alpha1Client, error) {
+	config := *c
+	if err := setConfigDefaults(&config); err != nil {
+		return nil, err
+	}
+	client, err := rest.RESTClientFor(&config)
+	if err != nil {
+		return nil, err
+	}
+	return &CamelV1alpha1Client{client}, nil
+}
+
+// NewForConfigOrDie creates a new CamelV1alpha1Client for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *CamelV1alpha1Client {
+	client, err := NewForConfig(c)
+	if err != nil {
+		panic(err)
+	}
+	return client
+}
+
+// New creates a new CamelV1alpha1Client for the given RESTClient.
+func New(c rest.Interface) *CamelV1alpha1Client {
+	return &CamelV1alpha1Client{c}
+}
+
+func setConfigDefaults(config *rest.Config) error {
+	gv := v1alpha1.SchemeGroupVersion
+	config.GroupVersion = &gv
+	config.APIPath = "/apis"
+	config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
+
+	if config.UserAgent == "" {
+		config.UserAgent = rest.DefaultKubernetesUserAgent()
+	}
+
+	return nil
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *CamelV1alpha1Client) RESTClient() rest.Interface {
+	if c == nil {
+		return nil
+	}
+	return c.restClient
+}
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/doc.go
similarity index 56%
copy from pkg/apis/camel/v1alpha1/register.go
copy to pkg/client/clientset/versioned/typed/camel/v1alpha1/doc.go
index e948772..9f77d24 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/doc.go
@@ -15,22 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// NOTE: Boilerplate only.  Ignore this file.
+// Code generated by client-gen. DO NOT EDIT.
 
-// Package v1alpha1 contains API Schema definitions for the camel v1alpha1 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=camel.apache.org
+// This package has the automatically generated typed clients.
 package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "camel.apache.org", Version: "v1alpha1"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/doc.go
similarity index 54%
copy from pkg/apis/camel/v1alpha1/register.go
copy to pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/doc.go
index e948772..5d1c76c 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/doc.go
@@ -15,22 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// NOTE: Boilerplate only.  Ignore this file.
+// Code generated by client-gen. DO NOT EDIT.
 
-// Package v1alpha1 contains API Schema definitions for the camel v1alpha1 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=camel.apache.org
-package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "camel.apache.org", Version: "v1alpha1"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
+// Package fake has the automatically generated clients.
+package fake
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_build.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_build.go
new file mode 100644
index 0000000..8a0e414
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_build.go
@@ -0,0 +1,141 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+)
+
+// FakeBuilds implements BuildInterface
+type FakeBuilds struct {
+	Fake *FakeCamelV1alpha1
+	ns   string
+}
+
+var buildsResource = schema.GroupVersionResource{Group: "camel.apache.org", Version: "v1alpha1", Resource: "builds"}
+
+var buildsKind = schema.GroupVersionKind{Group: "camel.apache.org", Version: "v1alpha1", Kind: "Build"}
+
+// Get takes name of the build, and returns the corresponding build object, and an error if there is any.
+func (c *FakeBuilds) Get(name string, options v1.GetOptions) (result *v1alpha1.Build, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(buildsResource, c.ns, name), &v1alpha1.Build{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Build), err
+}
+
+// List takes label and field selectors, and returns the list of Builds that match those selectors.
+func (c *FakeBuilds) List(opts v1.ListOptions) (result *v1alpha1.BuildList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(buildsResource, buildsKind, c.ns, opts), &v1alpha1.BuildList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.BuildList{ListMeta: obj.(*v1alpha1.BuildList).ListMeta}
+	for _, item := range obj.(*v1alpha1.BuildList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested builds.
+func (c *FakeBuilds) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(buildsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a build and creates it.  Returns the server's representation of the build, and an error, if there is any.
+func (c *FakeBuilds) Create(build *v1alpha1.Build) (result *v1alpha1.Build, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(buildsResource, c.ns, build), &v1alpha1.Build{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Build), err
+}
+
+// Update takes the representation of a build and updates it. Returns the server's representation of the build, and an error, if there is any.
+func (c *FakeBuilds) Update(build *v1alpha1.Build) (result *v1alpha1.Build, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(buildsResource, c.ns, build), &v1alpha1.Build{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Build), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeBuilds) UpdateStatus(build *v1alpha1.Build) (*v1alpha1.Build, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(buildsResource, "status", c.ns, build), &v1alpha1.Build{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Build), err
+}
+
+// Delete takes name of the build and deletes it. Returns an error if one occurs.
+func (c *FakeBuilds) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(buildsResource, c.ns, name), &v1alpha1.Build{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeBuilds) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(buildsResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.BuildList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched build.
+func (c *FakeBuilds) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Build, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(buildsResource, c.ns, name, pt, data, subresources...), &v1alpha1.Build{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Build), err
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_camel_client.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_camel_client.go
new file mode 100644
index 0000000..6596ec7
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_camel_client.go
@@ -0,0 +1,53 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/client/clientset/versioned/typed/camel/v1alpha1"
+	rest "k8s.io/client-go/rest"
+	testing "k8s.io/client-go/testing"
+)
+
+type FakeCamelV1alpha1 struct {
+	*testing.Fake
+}
+
+func (c *FakeCamelV1alpha1) Builds(namespace string) v1alpha1.BuildInterface {
+	return &FakeBuilds{c, namespace}
+}
+
+func (c *FakeCamelV1alpha1) Integrations(namespace string) v1alpha1.IntegrationInterface {
+	return &FakeIntegrations{c, namespace}
+}
+
+func (c *FakeCamelV1alpha1) IntegrationKits(namespace string) v1alpha1.IntegrationKitInterface {
+	return &FakeIntegrationKits{c, namespace}
+}
+
+func (c *FakeCamelV1alpha1) IntegrationPlatforms(namespace string) v1alpha1.IntegrationPlatformInterface {
+	return &FakeIntegrationPlatforms{c, namespace}
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *FakeCamelV1alpha1) RESTClient() rest.Interface {
+	var ret *rest.RESTClient
+	return ret
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integration.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integration.go
new file mode 100644
index 0000000..d44859f
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integration.go
@@ -0,0 +1,141 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+)
+
+// FakeIntegrations implements IntegrationInterface
+type FakeIntegrations struct {
+	Fake *FakeCamelV1alpha1
+	ns   string
+}
+
+var integrationsResource = schema.GroupVersionResource{Group: "camel.apache.org", Version: "v1alpha1", Resource: "integrations"}
+
+var integrationsKind = schema.GroupVersionKind{Group: "camel.apache.org", Version: "v1alpha1", Kind: "Integration"}
+
+// Get takes name of the integration, and returns the corresponding integration object, and an error if there is any.
+func (c *FakeIntegrations) Get(name string, options v1.GetOptions) (result *v1alpha1.Integration, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(integrationsResource, c.ns, name), &v1alpha1.Integration{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Integration), err
+}
+
+// List takes label and field selectors, and returns the list of Integrations that match those selectors.
+func (c *FakeIntegrations) List(opts v1.ListOptions) (result *v1alpha1.IntegrationList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(integrationsResource, integrationsKind, c.ns, opts), &v1alpha1.IntegrationList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.IntegrationList{ListMeta: obj.(*v1alpha1.IntegrationList).ListMeta}
+	for _, item := range obj.(*v1alpha1.IntegrationList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested integrations.
+func (c *FakeIntegrations) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(integrationsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a integration and creates it.  Returns the server's representation of the integration, and an error, if there is any.
+func (c *FakeIntegrations) Create(integration *v1alpha1.Integration) (result *v1alpha1.Integration, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(integrationsResource, c.ns, integration), &v1alpha1.Integration{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Integration), err
+}
+
+// Update takes the representation of a integration and updates it. Returns the server's representation of the integration, and an error, if there is any.
+func (c *FakeIntegrations) Update(integration *v1alpha1.Integration) (result *v1alpha1.Integration, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(integrationsResource, c.ns, integration), &v1alpha1.Integration{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Integration), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeIntegrations) UpdateStatus(integration *v1alpha1.Integration) (*v1alpha1.Integration, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(integrationsResource, "status", c.ns, integration), &v1alpha1.Integration{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Integration), err
+}
+
+// Delete takes name of the integration and deletes it. Returns an error if one occurs.
+func (c *FakeIntegrations) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(integrationsResource, c.ns, name), &v1alpha1.Integration{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeIntegrations) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(integrationsResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.IntegrationList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched integration.
+func (c *FakeIntegrations) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Integration, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(integrationsResource, c.ns, name, pt, data, subresources...), &v1alpha1.Integration{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Integration), err
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integrationkit.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integrationkit.go
new file mode 100644
index 0000000..4fbc8c6
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integrationkit.go
@@ -0,0 +1,141 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+)
+
+// FakeIntegrationKits implements IntegrationKitInterface
+type FakeIntegrationKits struct {
+	Fake *FakeCamelV1alpha1
+	ns   string
+}
+
+var integrationkitsResource = schema.GroupVersionResource{Group: "camel.apache.org", Version: "v1alpha1", Resource: "integrationkits"}
+
+var integrationkitsKind = schema.GroupVersionKind{Group: "camel.apache.org", Version: "v1alpha1", Kind: "IntegrationKit"}
+
+// Get takes name of the integrationKit, and returns the corresponding integrationKit object, and an error if there is any.
+func (c *FakeIntegrationKits) Get(name string, options v1.GetOptions) (result *v1alpha1.IntegrationKit, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(integrationkitsResource, c.ns, name), &v1alpha1.IntegrationKit{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationKit), err
+}
+
+// List takes label and field selectors, and returns the list of IntegrationKits that match those selectors.
+func (c *FakeIntegrationKits) List(opts v1.ListOptions) (result *v1alpha1.IntegrationKitList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(integrationkitsResource, integrationkitsKind, c.ns, opts), &v1alpha1.IntegrationKitList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.IntegrationKitList{ListMeta: obj.(*v1alpha1.IntegrationKitList).ListMeta}
+	for _, item := range obj.(*v1alpha1.IntegrationKitList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested integrationKits.
+func (c *FakeIntegrationKits) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(integrationkitsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a integrationKit and creates it.  Returns the server's representation of the integrationKit, and an error, if there is any.
+func (c *FakeIntegrationKits) Create(integrationKit *v1alpha1.IntegrationKit) (result *v1alpha1.IntegrationKit, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(integrationkitsResource, c.ns, integrationKit), &v1alpha1.IntegrationKit{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationKit), err
+}
+
+// Update takes the representation of a integrationKit and updates it. Returns the server's representation of the integrationKit, and an error, if there is any.
+func (c *FakeIntegrationKits) Update(integrationKit *v1alpha1.IntegrationKit) (result *v1alpha1.IntegrationKit, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(integrationkitsResource, c.ns, integrationKit), &v1alpha1.IntegrationKit{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationKit), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeIntegrationKits) UpdateStatus(integrationKit *v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(integrationkitsResource, "status", c.ns, integrationKit), &v1alpha1.IntegrationKit{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationKit), err
+}
+
+// Delete takes name of the integrationKit and deletes it. Returns an error if one occurs.
+func (c *FakeIntegrationKits) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(integrationkitsResource, c.ns, name), &v1alpha1.IntegrationKit{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeIntegrationKits) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(integrationkitsResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.IntegrationKitList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched integrationKit.
+func (c *FakeIntegrationKits) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.IntegrationKit, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(integrationkitsResource, c.ns, name, pt, data, subresources...), &v1alpha1.IntegrationKit{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationKit), err
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integrationplatform.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integrationplatform.go
new file mode 100644
index 0000000..3fdae46
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/fake/fake_integrationplatform.go
@@ -0,0 +1,141 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+)
+
+// FakeIntegrationPlatforms implements IntegrationPlatformInterface
+type FakeIntegrationPlatforms struct {
+	Fake *FakeCamelV1alpha1
+	ns   string
+}
+
+var integrationplatformsResource = schema.GroupVersionResource{Group: "camel.apache.org", Version: "v1alpha1", Resource: "integrationplatforms"}
+
+var integrationplatformsKind = schema.GroupVersionKind{Group: "camel.apache.org", Version: "v1alpha1", Kind: "IntegrationPlatform"}
+
+// Get takes name of the integrationPlatform, and returns the corresponding integrationPlatform object, and an error if there is any.
+func (c *FakeIntegrationPlatforms) Get(name string, options v1.GetOptions) (result *v1alpha1.IntegrationPlatform, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(integrationplatformsResource, c.ns, name), &v1alpha1.IntegrationPlatform{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationPlatform), err
+}
+
+// List takes label and field selectors, and returns the list of IntegrationPlatforms that match those selectors.
+func (c *FakeIntegrationPlatforms) List(opts v1.ListOptions) (result *v1alpha1.IntegrationPlatformList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(integrationplatformsResource, integrationplatformsKind, c.ns, opts), &v1alpha1.IntegrationPlatformList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.IntegrationPlatformList{ListMeta: obj.(*v1alpha1.IntegrationPlatformList).ListMeta}
+	for _, item := range obj.(*v1alpha1.IntegrationPlatformList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested integrationPlatforms.
+func (c *FakeIntegrationPlatforms) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(integrationplatformsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a integrationPlatform and creates it.  Returns the server's representation of the integrationPlatform, and an error, if there is any.
+func (c *FakeIntegrationPlatforms) Create(integrationPlatform *v1alpha1.IntegrationPlatform) (result *v1alpha1.IntegrationPlatform, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(integrationplatformsResource, c.ns, integrationPlatform), &v1alpha1.IntegrationPlatform{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationPlatform), err
+}
+
+// Update takes the representation of a integrationPlatform and updates it. Returns the server's representation of the integrationPlatform, and an error, if there is any.
+func (c *FakeIntegrationPlatforms) Update(integrationPlatform *v1alpha1.IntegrationPlatform) (result *v1alpha1.IntegrationPlatform, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(integrationplatformsResource, c.ns, integrationPlatform), &v1alpha1.IntegrationPlatform{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationPlatform), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeIntegrationPlatforms) UpdateStatus(integrationPlatform *v1alpha1.IntegrationPlatform) (*v1alpha1.IntegrationPlatform, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(integrationplatformsResource, "status", c.ns, integrationPlatform), &v1alpha1.IntegrationPlatform{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationPlatform), err
+}
+
+// Delete takes name of the integrationPlatform and deletes it. Returns an error if one occurs.
+func (c *FakeIntegrationPlatforms) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(integrationplatformsResource, c.ns, name), &v1alpha1.IntegrationPlatform{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeIntegrationPlatforms) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(integrationplatformsResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.IntegrationPlatformList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched integrationPlatform.
+func (c *FakeIntegrationPlatforms) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.IntegrationPlatform, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(integrationplatformsResource, c.ns, name, pt, data, subresources...), &v1alpha1.IntegrationPlatform{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.IntegrationPlatform), err
+}
diff --git a/pkg/apis/camel/v1alpha1/register.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/generated_expansion.go
similarity index 56%
copy from pkg/apis/camel/v1alpha1/register.go
copy to pkg/client/clientset/versioned/typed/camel/v1alpha1/generated_expansion.go
index e948772..99f3b06 100644
--- a/pkg/apis/camel/v1alpha1/register.go
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/generated_expansion.go
@@ -15,22 +15,14 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// NOTE: Boilerplate only.  Ignore this file.
+// Code generated by client-gen. DO NOT EDIT.
 
-// Package v1alpha1 contains API Schema definitions for the camel v1alpha1 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=camel.apache.org
 package v1alpha1
 
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
+type BuildExpansion interface{}
 
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "camel.apache.org", Version: "v1alpha1"}
+type IntegrationExpansion interface{}
 
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
+type IntegrationKitExpansion interface{}
+
+type IntegrationPlatformExpansion interface{}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/integration.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/integration.go
new file mode 100644
index 0000000..d325dbf
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/integration.go
@@ -0,0 +1,192 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	scheme "github.com/apache/camel-k/pkg/client/clientset/versioned/scheme"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+)
+
+// IntegrationsGetter has a method to return a IntegrationInterface.
+// A group's client should implement this interface.
+type IntegrationsGetter interface {
+	Integrations(namespace string) IntegrationInterface
+}
+
+// IntegrationInterface has methods to work with Integration resources.
+type IntegrationInterface interface {
+	Create(*v1alpha1.Integration) (*v1alpha1.Integration, error)
+	Update(*v1alpha1.Integration) (*v1alpha1.Integration, error)
+	UpdateStatus(*v1alpha1.Integration) (*v1alpha1.Integration, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.Integration, error)
+	List(opts v1.ListOptions) (*v1alpha1.IntegrationList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Integration, err error)
+	IntegrationExpansion
+}
+
+// integrations implements IntegrationInterface
+type integrations struct {
+	client rest.Interface
+	ns     string
+}
+
+// newIntegrations returns a Integrations
+func newIntegrations(c *CamelV1alpha1Client, namespace string) *integrations {
+	return &integrations{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the integration, and returns the corresponding integration object, and an error if there is any.
+func (c *integrations) Get(name string, options v1.GetOptions) (result *v1alpha1.Integration, err error) {
+	result = &v1alpha1.Integration{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("integrations").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of Integrations that match those selectors.
+func (c *integrations) List(opts v1.ListOptions) (result *v1alpha1.IntegrationList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.IntegrationList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("integrations").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested integrations.
+func (c *integrations) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("integrations").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a integration and creates it.  Returns the server's representation of the integration, and an error, if there is any.
+func (c *integrations) Create(integration *v1alpha1.Integration) (result *v1alpha1.Integration, err error) {
+	result = &v1alpha1.Integration{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("integrations").
+		Body(integration).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a integration and updates it. Returns the server's representation of the integration, and an error, if there is any.
+func (c *integrations) Update(integration *v1alpha1.Integration) (result *v1alpha1.Integration, err error) {
+	result = &v1alpha1.Integration{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("integrations").
+		Name(integration.Name).
+		Body(integration).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *integrations) UpdateStatus(integration *v1alpha1.Integration) (result *v1alpha1.Integration, err error) {
+	result = &v1alpha1.Integration{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("integrations").
+		Name(integration.Name).
+		SubResource("status").
+		Body(integration).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the integration and deletes it. Returns an error if one occurs.
+func (c *integrations) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("integrations").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *integrations) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("integrations").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched integration.
+func (c *integrations) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Integration, err error) {
+	result = &v1alpha1.Integration{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("integrations").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/integrationkit.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/integrationkit.go
new file mode 100644
index 0000000..df65f9c
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/integrationkit.go
@@ -0,0 +1,192 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	scheme "github.com/apache/camel-k/pkg/client/clientset/versioned/scheme"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+)
+
+// IntegrationKitsGetter has a method to return a IntegrationKitInterface.
+// A group's client should implement this interface.
+type IntegrationKitsGetter interface {
+	IntegrationKits(namespace string) IntegrationKitInterface
+}
+
+// IntegrationKitInterface has methods to work with IntegrationKit resources.
+type IntegrationKitInterface interface {
+	Create(*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error)
+	Update(*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error)
+	UpdateStatus(*v1alpha1.IntegrationKit) (*v1alpha1.IntegrationKit, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.IntegrationKit, error)
+	List(opts v1.ListOptions) (*v1alpha1.IntegrationKitList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.IntegrationKit, err error)
+	IntegrationKitExpansion
+}
+
+// integrationKits implements IntegrationKitInterface
+type integrationKits struct {
+	client rest.Interface
+	ns     string
+}
+
+// newIntegrationKits returns a IntegrationKits
+func newIntegrationKits(c *CamelV1alpha1Client, namespace string) *integrationKits {
+	return &integrationKits{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the integrationKit, and returns the corresponding integrationKit object, and an error if there is any.
+func (c *integrationKits) Get(name string, options v1.GetOptions) (result *v1alpha1.IntegrationKit, err error) {
+	result = &v1alpha1.IntegrationKit{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of IntegrationKits that match those selectors.
+func (c *integrationKits) List(opts v1.ListOptions) (result *v1alpha1.IntegrationKitList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.IntegrationKitList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested integrationKits.
+func (c *integrationKits) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a integrationKit and creates it.  Returns the server's representation of the integrationKit, and an error, if there is any.
+func (c *integrationKits) Create(integrationKit *v1alpha1.IntegrationKit) (result *v1alpha1.IntegrationKit, err error) {
+	result = &v1alpha1.IntegrationKit{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		Body(integrationKit).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a integrationKit and updates it. Returns the server's representation of the integrationKit, and an error, if there is any.
+func (c *integrationKits) Update(integrationKit *v1alpha1.IntegrationKit) (result *v1alpha1.IntegrationKit, err error) {
+	result = &v1alpha1.IntegrationKit{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		Name(integrationKit.Name).
+		Body(integrationKit).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *integrationKits) UpdateStatus(integrationKit *v1alpha1.IntegrationKit) (result *v1alpha1.IntegrationKit, err error) {
+	result = &v1alpha1.IntegrationKit{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		Name(integrationKit.Name).
+		SubResource("status").
+		Body(integrationKit).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the integrationKit and deletes it. Returns an error if one occurs.
+func (c *integrationKits) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *integrationKits) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("integrationkits").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched integrationKit.
+func (c *integrationKits) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.IntegrationKit, err error) {
+	result = &v1alpha1.IntegrationKit{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("integrationkits").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/pkg/client/clientset/versioned/typed/camel/v1alpha1/integrationplatform.go b/pkg/client/clientset/versioned/typed/camel/v1alpha1/integrationplatform.go
new file mode 100644
index 0000000..586b602
--- /dev/null
+++ b/pkg/client/clientset/versioned/typed/camel/v1alpha1/integrationplatform.go
@@ -0,0 +1,192 @@
+/*
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	scheme "github.com/apache/camel-k/pkg/client/clientset/versioned/scheme"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+)
+
+// IntegrationPlatformsGetter has a method to return a IntegrationPlatformInterface.
+// A group's client should implement this interface.
+type IntegrationPlatformsGetter interface {
+	IntegrationPlatforms(namespace string) IntegrationPlatformInterface
+}
+
+// IntegrationPlatformInterface has methods to work with IntegrationPlatform resources.
+type IntegrationPlatformInterface interface {
+	Create(*v1alpha1.IntegrationPlatform) (*v1alpha1.IntegrationPlatform, error)
+	Update(*v1alpha1.IntegrationPlatform) (*v1alpha1.IntegrationPlatform, error)
+	UpdateStatus(*v1alpha1.IntegrationPlatform) (*v1alpha1.IntegrationPlatform, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.IntegrationPlatform, error)
+	List(opts v1.ListOptions) (*v1alpha1.IntegrationPlatformList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.IntegrationPlatform, err error)
+	IntegrationPlatformExpansion
+}
+
+// integrationPlatforms implements IntegrationPlatformInterface
+type integrationPlatforms struct {
+	client rest.Interface
+	ns     string
+}
+
+// newIntegrationPlatforms returns a IntegrationPlatforms
+func newIntegrationPlatforms(c *CamelV1alpha1Client, namespace string) *integrationPlatforms {
+	return &integrationPlatforms{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the integrationPlatform, and returns the corresponding integrationPlatform object, and an error if there is any.
+func (c *integrationPlatforms) Get(name string, options v1.GetOptions) (result *v1alpha1.IntegrationPlatform, err error) {
+	result = &v1alpha1.IntegrationPlatform{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of IntegrationPlatforms that match those selectors.
+func (c *integrationPlatforms) List(opts v1.ListOptions) (result *v1alpha1.IntegrationPlatformList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.IntegrationPlatformList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested integrationPlatforms.
+func (c *integrationPlatforms) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a integrationPlatform and creates it.  Returns the server's representation of the integrationPlatform, and an error, if there is any.
+func (c *integrationPlatforms) Create(integrationPlatform *v1alpha1.IntegrationPlatform) (result *v1alpha1.IntegrationPlatform, err error) {
+	result = &v1alpha1.IntegrationPlatform{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		Body(integrationPlatform).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a integrationPlatform and updates it. Returns the server's representation of the integrationPlatform, and an error, if there is any.
+func (c *integrationPlatforms) Update(integrationPlatform *v1alpha1.IntegrationPlatform) (result *v1alpha1.IntegrationPlatform, err error) {
+	result = &v1alpha1.IntegrationPlatform{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		Name(integrationPlatform.Name).
+		Body(integrationPlatform).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *integrationPlatforms) UpdateStatus(integrationPlatform *v1alpha1.IntegrationPlatform) (result *v1alpha1.IntegrationPlatform, err error) {
+	result = &v1alpha1.IntegrationPlatform{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		Name(integrationPlatform.Name).
+		SubResource("status").
+		Body(integrationPlatform).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the integrationPlatform and deletes it. Returns an error if one occurs.
+func (c *integrationPlatforms) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *integrationPlatforms) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched integrationPlatform.
+func (c *integrationPlatforms) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.IntegrationPlatform, err error) {
+	result = &v1alpha1.IntegrationPlatform{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("integrationplatforms").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/pkg/client/informers/externalversions/camel/interface.go b/pkg/client/informers/externalversions/camel/interface.go
new file mode 100644
index 0000000..a6992b3
--- /dev/null
+++ b/pkg/client/informers/externalversions/camel/interface.go
@@ -0,0 +1,47 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package camel
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/client/informers/externalversions/camel/v1alpha1"
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+)
+
+// Interface provides access to each of this group's versions.
+type Interface interface {
+	// V1alpha1 provides access to shared informers for resources in V1alpha1.
+	V1alpha1() v1alpha1.Interface
+}
+
+type group struct {
+	factory          internalinterfaces.SharedInformerFactory
+	namespace        string
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// New returns a new Interface.
+func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
+	return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
+}
+
+// V1alpha1 returns a new v1alpha1.Interface.
+func (g *group) V1alpha1() v1alpha1.Interface {
+	return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions)
+}
diff --git a/pkg/client/informers/externalversions/camel/v1alpha1/build.go b/pkg/client/informers/externalversions/camel/v1alpha1/build.go
new file mode 100644
index 0000000..fa2c2f2
--- /dev/null
+++ b/pkg/client/informers/externalversions/camel/v1alpha1/build.go
@@ -0,0 +1,90 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	time "time"
+
+	camelv1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	versioned "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+	v1alpha1 "github.com/apache/camel-k/pkg/client/listers/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// BuildInformer provides access to a shared informer and lister for
+// Builds.
+type BuildInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.BuildLister
+}
+
+type buildInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+	namespace        string
+}
+
+// NewBuildInformer constructs a new informer for Build type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewBuildInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredBuildInformer(client, namespace, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredBuildInformer constructs a new informer for Build type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredBuildInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+	return cache.NewSharedIndexInformer(
+		&cache.ListWatch{
+			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().Builds(namespace).List(options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().Builds(namespace).Watch(options)
+			},
+		},
+		&camelv1alpha1.Build{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *buildInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredBuildInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *buildInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&camelv1alpha1.Build{}, f.defaultInformer)
+}
+
+func (f *buildInformer) Lister() v1alpha1.BuildLister {
+	return v1alpha1.NewBuildLister(f.Informer().GetIndexer())
+}
diff --git a/pkg/client/informers/externalversions/camel/v1alpha1/integration.go b/pkg/client/informers/externalversions/camel/v1alpha1/integration.go
new file mode 100644
index 0000000..6523ad3
--- /dev/null
+++ b/pkg/client/informers/externalversions/camel/v1alpha1/integration.go
@@ -0,0 +1,90 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	time "time"
+
+	camelv1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	versioned "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+	v1alpha1 "github.com/apache/camel-k/pkg/client/listers/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// IntegrationInformer provides access to a shared informer and lister for
+// Integrations.
+type IntegrationInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.IntegrationLister
+}
+
+type integrationInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+	namespace        string
+}
+
+// NewIntegrationInformer constructs a new informer for Integration type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewIntegrationInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredIntegrationInformer(client, namespace, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredIntegrationInformer constructs a new informer for Integration type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredIntegrationInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+	return cache.NewSharedIndexInformer(
+		&cache.ListWatch{
+			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().Integrations(namespace).List(options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().Integrations(namespace).Watch(options)
+			},
+		},
+		&camelv1alpha1.Integration{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *integrationInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredIntegrationInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *integrationInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&camelv1alpha1.Integration{}, f.defaultInformer)
+}
+
+func (f *integrationInformer) Lister() v1alpha1.IntegrationLister {
+	return v1alpha1.NewIntegrationLister(f.Informer().GetIndexer())
+}
diff --git a/pkg/client/informers/externalversions/camel/v1alpha1/integrationkit.go b/pkg/client/informers/externalversions/camel/v1alpha1/integrationkit.go
new file mode 100644
index 0000000..a15951d
--- /dev/null
+++ b/pkg/client/informers/externalversions/camel/v1alpha1/integrationkit.go
@@ -0,0 +1,90 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	time "time"
+
+	camelv1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	versioned "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+	v1alpha1 "github.com/apache/camel-k/pkg/client/listers/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// IntegrationKitInformer provides access to a shared informer and lister for
+// IntegrationKits.
+type IntegrationKitInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.IntegrationKitLister
+}
+
+type integrationKitInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+	namespace        string
+}
+
+// NewIntegrationKitInformer constructs a new informer for IntegrationKit type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewIntegrationKitInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredIntegrationKitInformer(client, namespace, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredIntegrationKitInformer constructs a new informer for IntegrationKit type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredIntegrationKitInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+	return cache.NewSharedIndexInformer(
+		&cache.ListWatch{
+			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().IntegrationKits(namespace).List(options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().IntegrationKits(namespace).Watch(options)
+			},
+		},
+		&camelv1alpha1.IntegrationKit{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *integrationKitInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredIntegrationKitInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *integrationKitInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&camelv1alpha1.IntegrationKit{}, f.defaultInformer)
+}
+
+func (f *integrationKitInformer) Lister() v1alpha1.IntegrationKitLister {
+	return v1alpha1.NewIntegrationKitLister(f.Informer().GetIndexer())
+}
diff --git a/pkg/client/informers/externalversions/camel/v1alpha1/integrationplatform.go b/pkg/client/informers/externalversions/camel/v1alpha1/integrationplatform.go
new file mode 100644
index 0000000..f2ef242
--- /dev/null
+++ b/pkg/client/informers/externalversions/camel/v1alpha1/integrationplatform.go
@@ -0,0 +1,90 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	time "time"
+
+	camelv1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	versioned "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+	v1alpha1 "github.com/apache/camel-k/pkg/client/listers/camel/v1alpha1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// IntegrationPlatformInformer provides access to a shared informer and lister for
+// IntegrationPlatforms.
+type IntegrationPlatformInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.IntegrationPlatformLister
+}
+
+type integrationPlatformInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+	namespace        string
+}
+
+// NewIntegrationPlatformInformer constructs a new informer for IntegrationPlatform type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewIntegrationPlatformInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredIntegrationPlatformInformer(client, namespace, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredIntegrationPlatformInformer constructs a new informer for IntegrationPlatform type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredIntegrationPlatformInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+	return cache.NewSharedIndexInformer(
+		&cache.ListWatch{
+			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().IntegrationPlatforms(namespace).List(options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.CamelV1alpha1().IntegrationPlatforms(namespace).Watch(options)
+			},
+		},
+		&camelv1alpha1.IntegrationPlatform{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *integrationPlatformInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredIntegrationPlatformInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *integrationPlatformInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&camelv1alpha1.IntegrationPlatform{}, f.defaultInformer)
+}
+
+func (f *integrationPlatformInformer) Lister() v1alpha1.IntegrationPlatformLister {
+	return v1alpha1.NewIntegrationPlatformLister(f.Informer().GetIndexer())
+}
diff --git a/pkg/client/informers/externalversions/camel/v1alpha1/interface.go b/pkg/client/informers/externalversions/camel/v1alpha1/interface.go
new file mode 100644
index 0000000..90d9282
--- /dev/null
+++ b/pkg/client/informers/externalversions/camel/v1alpha1/interface.go
@@ -0,0 +1,67 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+)
+
+// Interface provides access to all the informers in this group version.
+type Interface interface {
+	// Builds returns a BuildInformer.
+	Builds() BuildInformer
+	// Integrations returns a IntegrationInformer.
+	Integrations() IntegrationInformer
+	// IntegrationKits returns a IntegrationKitInformer.
+	IntegrationKits() IntegrationKitInformer
+	// IntegrationPlatforms returns a IntegrationPlatformInformer.
+	IntegrationPlatforms() IntegrationPlatformInformer
+}
+
+type version struct {
+	factory          internalinterfaces.SharedInformerFactory
+	namespace        string
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// New returns a new Interface.
+func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
+	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
+}
+
+// Builds returns a BuildInformer.
+func (v *version) Builds() BuildInformer {
+	return &buildInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
+
+// Integrations returns a IntegrationInformer.
+func (v *version) Integrations() IntegrationInformer {
+	return &integrationInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
+
+// IntegrationKits returns a IntegrationKitInformer.
+func (v *version) IntegrationKits() IntegrationKitInformer {
+	return &integrationKitInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
+
+// IntegrationPlatforms returns a IntegrationPlatformInformer.
+func (v *version) IntegrationPlatforms() IntegrationPlatformInformer {
+	return &integrationPlatformInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
diff --git a/pkg/client/informers/externalversions/factory.go b/pkg/client/informers/externalversions/factory.go
new file mode 100644
index 0000000..b6358b1
--- /dev/null
+++ b/pkg/client/informers/externalversions/factory.go
@@ -0,0 +1,181 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package externalversions
+
+import (
+	reflect "reflect"
+	sync "sync"
+	time "time"
+
+	versioned "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	camel "github.com/apache/camel-k/pkg/client/informers/externalversions/camel"
+	internalinterfaces "github.com/apache/camel-k/pkg/client/informers/externalversions/internalinterfaces"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// SharedInformerOption defines the functional option type for SharedInformerFactory.
+type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory
+
+type sharedInformerFactory struct {
+	client           versioned.Interface
+	namespace        string
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+	lock             sync.Mutex
+	defaultResync    time.Duration
+	customResync     map[reflect.Type]time.Duration
+
+	informers map[reflect.Type]cache.SharedIndexInformer
+	// startedInformers is used for tracking which informers have been started.
+	// This allows Start() to be called multiple times safely.
+	startedInformers map[reflect.Type]bool
+}
+
+// WithCustomResyncConfig sets a custom resync period for the specified informer types.
+func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption {
+	return func(factory *sharedInformerFactory) *sharedInformerFactory {
+		for k, v := range resyncConfig {
+			factory.customResync[reflect.TypeOf(k)] = v
+		}
+		return factory
+	}
+}
+
+// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory.
+func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption {
+	return func(factory *sharedInformerFactory) *sharedInformerFactory {
+		factory.tweakListOptions = tweakListOptions
+		return factory
+	}
+}
+
+// WithNamespace limits the SharedInformerFactory to the specified namespace.
+func WithNamespace(namespace string) SharedInformerOption {
+	return func(factory *sharedInformerFactory) *sharedInformerFactory {
+		factory.namespace = namespace
+		return factory
+	}
+}
+
+// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces.
+func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
+	return NewSharedInformerFactoryWithOptions(client, defaultResync)
+}
+
+// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory.
+// Listers obtained via this SharedInformerFactory will be subject to the same filters
+// as specified here.
+// Deprecated: Please use NewSharedInformerFactoryWithOptions instead
+func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
+	return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions))
+}
+
+// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options.
+func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory {
+	factory := &sharedInformerFactory{
+		client:           client,
+		namespace:        v1.NamespaceAll,
+		defaultResync:    defaultResync,
+		informers:        make(map[reflect.Type]cache.SharedIndexInformer),
+		startedInformers: make(map[reflect.Type]bool),
+		customResync:     make(map[reflect.Type]time.Duration),
+	}
+
+	// Apply all options
+	for _, opt := range options {
+		factory = opt(factory)
+	}
+
+	return factory
+}
+
+// Start initializes all requested informers.
+func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
+	f.lock.Lock()
+	defer f.lock.Unlock()
+
+	for informerType, informer := range f.informers {
+		if !f.startedInformers[informerType] {
+			go informer.Run(stopCh)
+			f.startedInformers[informerType] = true
+		}
+	}
+}
+
+// WaitForCacheSync waits for all started informers' cache were synced.
+func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
+	informers := func() map[reflect.Type]cache.SharedIndexInformer {
+		f.lock.Lock()
+		defer f.lock.Unlock()
+
+		informers := map[reflect.Type]cache.SharedIndexInformer{}
+		for informerType, informer := range f.informers {
+			if f.startedInformers[informerType] {
+				informers[informerType] = informer
+			}
+		}
+		return informers
+	}()
+
+	res := map[reflect.Type]bool{}
+	for informType, informer := range informers {
+		res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
+	}
+	return res
+}
+
+// InternalInformerFor returns the SharedIndexInformer for obj using an internal
+// client.
+func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer {
+	f.lock.Lock()
+	defer f.lock.Unlock()
+
+	informerType := reflect.TypeOf(obj)
+	informer, exists := f.informers[informerType]
+	if exists {
+		return informer
+	}
+
+	resyncPeriod, exists := f.customResync[informerType]
+	if !exists {
+		resyncPeriod = f.defaultResync
+	}
+
+	informer = newFunc(f.client, resyncPeriod)
+	f.informers[informerType] = informer
+
+	return informer
+}
+
+// SharedInformerFactory provides shared informers for resources in all known
+// API group versions.
+type SharedInformerFactory interface {
+	internalinterfaces.SharedInformerFactory
+	ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+	WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
+
+	Camel() camel.Interface
+}
+
+func (f *sharedInformerFactory) Camel() camel.Interface {
+	return camel.New(f, f.namespace, f.tweakListOptions)
+}
diff --git a/pkg/client/informers/externalversions/generic.go b/pkg/client/informers/externalversions/generic.go
new file mode 100644
index 0000000..d40015c
--- /dev/null
+++ b/pkg/client/informers/externalversions/generic.go
@@ -0,0 +1,69 @@
+/*
+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.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package externalversions
+
+import (
+	"fmt"
+
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// GenericInformer is type of SharedIndexInformer which will locate and delegate to other
+// sharedInformers based on type
+type GenericInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() cache.GenericLister
+}
+
+type genericInformer struct {
+	informer cache.SharedIndexInformer
+	resource schema.GroupResource
+}
+
+// Informer returns the SharedIndexInformer.
+func (f *genericInformer) Informer() cache.SharedIndexInformer {
+	return f.informer
+}
+
+// Lister returns the GenericLister.
+func (f *genericInformer) Lister() cache.GenericLister {
+	return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource)
+}
+
+// ForResource gives generic access to a shared informer of the matching type
+// TODO extend this to unknown resources with a client pool
+func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
+	switch resource {
+	// Group=camel.apache.org, Version=v1alpha1
+	case v1alpha1.SchemeGroupVersion.WithResource("builds"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Camel().V1alpha1().Builds().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("integrations"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Camel().V1alpha1().Integrations().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("integrationkits"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Camel().V1alpha1().IntegrationKits().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("integrationplatforms"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Camel().V1alpha1().IntegrationPlatforms().Informer()}, nil
+
+	}
+
+	return nil, fmt.Errorf("no informer found for %v", resource)
+}
diff --git a/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
new file mode 100644
index 0000000..b991ea6
--- /dev/null
+++ b/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
@@ -0,0 +1,41 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package internalinterfaces
+
+import (
+	time "time"
+
+	versioned "github.com/apache/camel-k/pkg/client/clientset/versioned"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	cache "k8s.io/client-go/tools/cache"
+)
+
+// NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
+type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer
+
+// SharedInformerFactory a small interface to allow for adding an informer without an import cycle
+type SharedInformerFactory interface {
+	Start(stopCh <-chan struct{})
+	InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
+}
+
+// TweakListOptionsFunc is a function that transforms a v1.ListOptions.
+type TweakListOptionsFunc func(*v1.ListOptions)
diff --git a/pkg/client/listers/camel/v1alpha1/build.go b/pkg/client/listers/camel/v1alpha1/build.go
new file mode 100644
index 0000000..430b744
--- /dev/null
+++ b/pkg/client/listers/camel/v1alpha1/build.go
@@ -0,0 +1,95 @@
+/*
+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.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/client-go/tools/cache"
+)
+
+// BuildLister helps list Builds.
+type BuildLister interface {
+	// List lists all Builds in the indexer.
+	List(selector labels.Selector) (ret []*v1alpha1.Build, err error)
+	// Builds returns an object that can list and get Builds.
+	Builds(namespace string) BuildNamespaceLister
+	BuildListerExpansion
+}
+
+// buildLister implements the BuildLister interface.
+type buildLister struct {
+	indexer cache.Indexer
+}
+
+// NewBuildLister returns a new BuildLister.
+func NewBuildLister(indexer cache.Indexer) BuildLister {
+	return &buildLister{indexer: indexer}
+}
+
+// List lists all Builds in the indexer.
+func (s *buildLister) List(selector labels.Selector) (ret []*v1alpha1.Build, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.Build))
+	})
+	return ret, err
+}
+
+// Builds returns an object that can list and get Builds.
+func (s *buildLister) Builds(namespace string) BuildNamespaceLister {
+	return buildNamespaceLister{indexer: s.indexer, namespace: namespace}
+}
+
+// BuildNamespaceLister helps list and get Builds.
+type BuildNamespaceLister interface {
+	// List lists all Builds in the indexer for a given namespace.
+	List(selector labels.Selector) (ret []*v1alpha1.Build, err error)
+	// Get retrieves the Build from the indexer for a given namespace and name.
+	Get(name string) (*v1alpha1.Build, error)
+	BuildNamespaceListerExpansion
+}
+
+// buildNamespaceLister implements the BuildNamespaceLister
+// interface.
+type buildNamespaceLister struct {
+	indexer   cache.Indexer
+	namespace string
+}
+
+// List lists all Builds in the indexer for a given namespace.
+func (s buildNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.Build, err error) {
+	err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.Build))
+	})
+	return ret, err
+}
+
+// Get retrieves the Build from the indexer for a given namespace and name.
+func (s buildNamespaceLister) Get(name string) (*v1alpha1.Build, error) {
+	obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("build"), name)
+	}
+	return obj.(*v1alpha1.Build), nil
+}
diff --git a/pkg/client/listers/camel/v1alpha1/expansion_generated.go b/pkg/client/listers/camel/v1alpha1/expansion_generated.go
new file mode 100644
index 0000000..cd54414
--- /dev/null
+++ b/pkg/client/listers/camel/v1alpha1/expansion_generated.go
@@ -0,0 +1,52 @@
+/*
+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.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+// BuildListerExpansion allows custom methods to be added to
+// BuildLister.
+type BuildListerExpansion interface{}
+
+// BuildNamespaceListerExpansion allows custom methods to be added to
+// BuildNamespaceLister.
+type BuildNamespaceListerExpansion interface{}
+
+// IntegrationListerExpansion allows custom methods to be added to
+// IntegrationLister.
+type IntegrationListerExpansion interface{}
+
+// IntegrationNamespaceListerExpansion allows custom methods to be added to
+// IntegrationNamespaceLister.
+type IntegrationNamespaceListerExpansion interface{}
+
+// IntegrationKitListerExpansion allows custom methods to be added to
+// IntegrationKitLister.
+type IntegrationKitListerExpansion interface{}
+
+// IntegrationKitNamespaceListerExpansion allows custom methods to be added to
+// IntegrationKitNamespaceLister.
+type IntegrationKitNamespaceListerExpansion interface{}
+
+// IntegrationPlatformListerExpansion allows custom methods to be added to
+// IntegrationPlatformLister.
+type IntegrationPlatformListerExpansion interface{}
+
+// IntegrationPlatformNamespaceListerExpansion allows custom methods to be added to
+// IntegrationPlatformNamespaceLister.
+type IntegrationPlatformNamespaceListerExpansion interface{}
diff --git a/pkg/client/listers/camel/v1alpha1/integration.go b/pkg/client/listers/camel/v1alpha1/integration.go
new file mode 100644
index 0000000..d66e0b3
--- /dev/null
+++ b/pkg/client/listers/camel/v1alpha1/integration.go
@@ -0,0 +1,95 @@
+/*
+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.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/client-go/tools/cache"
+)
+
+// IntegrationLister helps list Integrations.
+type IntegrationLister interface {
+	// List lists all Integrations in the indexer.
+	List(selector labels.Selector) (ret []*v1alpha1.Integration, err error)
+	// Integrations returns an object that can list and get Integrations.
+	Integrations(namespace string) IntegrationNamespaceLister
+	IntegrationListerExpansion
+}
+
+// integrationLister implements the IntegrationLister interface.
+type integrationLister struct {
+	indexer cache.Indexer
+}
+
+// NewIntegrationLister returns a new IntegrationLister.
+func NewIntegrationLister(indexer cache.Indexer) IntegrationLister {
+	return &integrationLister{indexer: indexer}
+}
+
+// List lists all Integrations in the indexer.
+func (s *integrationLister) List(selector labels.Selector) (ret []*v1alpha1.Integration, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.Integration))
+	})
+	return ret, err
+}
+
+// Integrations returns an object that can list and get Integrations.
+func (s *integrationLister) Integrations(namespace string) IntegrationNamespaceLister {
+	return integrationNamespaceLister{indexer: s.indexer, namespace: namespace}
+}
+
+// IntegrationNamespaceLister helps list and get Integrations.
+type IntegrationNamespaceLister interface {
+	// List lists all Integrations in the indexer for a given namespace.
+	List(selector labels.Selector) (ret []*v1alpha1.Integration, err error)
+	// Get retrieves the Integration from the indexer for a given namespace and name.
+	Get(name string) (*v1alpha1.Integration, error)
+	IntegrationNamespaceListerExpansion
+}
+
+// integrationNamespaceLister implements the IntegrationNamespaceLister
+// interface.
+type integrationNamespaceLister struct {
+	indexer   cache.Indexer
+	namespace string
+}
+
+// List lists all Integrations in the indexer for a given namespace.
+func (s integrationNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.Integration, err error) {
+	err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.Integration))
+	})
+	return ret, err
+}
+
+// Get retrieves the Integration from the indexer for a given namespace and name.
+func (s integrationNamespaceLister) Get(name string) (*v1alpha1.Integration, error) {
+	obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("integration"), name)
+	}
+	return obj.(*v1alpha1.Integration), nil
+}
diff --git a/pkg/client/listers/camel/v1alpha1/integrationkit.go b/pkg/client/listers/camel/v1alpha1/integrationkit.go
new file mode 100644
index 0000000..6ca6853
--- /dev/null
+++ b/pkg/client/listers/camel/v1alpha1/integrationkit.go
@@ -0,0 +1,95 @@
+/*
+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.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/client-go/tools/cache"
+)
+
+// IntegrationKitLister helps list IntegrationKits.
+type IntegrationKitLister interface {
+	// List lists all IntegrationKits in the indexer.
+	List(selector labels.Selector) (ret []*v1alpha1.IntegrationKit, err error)
+	// IntegrationKits returns an object that can list and get IntegrationKits.
+	IntegrationKits(namespace string) IntegrationKitNamespaceLister
+	IntegrationKitListerExpansion
+}
+
+// integrationKitLister implements the IntegrationKitLister interface.
+type integrationKitLister struct {
+	indexer cache.Indexer
+}
+
+// NewIntegrationKitLister returns a new IntegrationKitLister.
+func NewIntegrationKitLister(indexer cache.Indexer) IntegrationKitLister {
+	return &integrationKitLister{indexer: indexer}
+}
+
+// List lists all IntegrationKits in the indexer.
+func (s *integrationKitLister) List(selector labels.Selector) (ret []*v1alpha1.IntegrationKit, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.IntegrationKit))
+	})
+	return ret, err
+}
+
+// IntegrationKits returns an object that can list and get IntegrationKits.
+func (s *integrationKitLister) IntegrationKits(namespace string) IntegrationKitNamespaceLister {
+	return integrationKitNamespaceLister{indexer: s.indexer, namespace: namespace}
+}
+
+// IntegrationKitNamespaceLister helps list and get IntegrationKits.
+type IntegrationKitNamespaceLister interface {
+	// List lists all IntegrationKits in the indexer for a given namespace.
+	List(selector labels.Selector) (ret []*v1alpha1.IntegrationKit, err error)
+	// Get retrieves the IntegrationKit from the indexer for a given namespace and name.
+	Get(name string) (*v1alpha1.IntegrationKit, error)
+	IntegrationKitNamespaceListerExpansion
+}
+
+// integrationKitNamespaceLister implements the IntegrationKitNamespaceLister
+// interface.
+type integrationKitNamespaceLister struct {
+	indexer   cache.Indexer
+	namespace string
+}
+
+// List lists all IntegrationKits in the indexer for a given namespace.
+func (s integrationKitNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.IntegrationKit, err error) {
+	err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.IntegrationKit))
+	})
+	return ret, err
+}
+
+// Get retrieves the IntegrationKit from the indexer for a given namespace and name.
+func (s integrationKitNamespaceLister) Get(name string) (*v1alpha1.IntegrationKit, error) {
+	obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("integrationkit"), name)
+	}
+	return obj.(*v1alpha1.IntegrationKit), nil
+}
diff --git a/pkg/client/listers/camel/v1alpha1/integrationplatform.go b/pkg/client/listers/camel/v1alpha1/integrationplatform.go
new file mode 100644
index 0000000..386d651
--- /dev/null
+++ b/pkg/client/listers/camel/v1alpha1/integrationplatform.go
@@ -0,0 +1,95 @@
+/*
+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.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	v1alpha1 "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/client-go/tools/cache"
+)
+
+// IntegrationPlatformLister helps list IntegrationPlatforms.
+type IntegrationPlatformLister interface {
+	// List lists all IntegrationPlatforms in the indexer.
+	List(selector labels.Selector) (ret []*v1alpha1.IntegrationPlatform, err error)
+	// IntegrationPlatforms returns an object that can list and get IntegrationPlatforms.
+	IntegrationPlatforms(namespace string) IntegrationPlatformNamespaceLister
+	IntegrationPlatformListerExpansion
+}
+
+// integrationPlatformLister implements the IntegrationPlatformLister interface.
+type integrationPlatformLister struct {
+	indexer cache.Indexer
+}
+
+// NewIntegrationPlatformLister returns a new IntegrationPlatformLister.
+func NewIntegrationPlatformLister(indexer cache.Indexer) IntegrationPlatformLister {
+	return &integrationPlatformLister{indexer: indexer}
+}
+
+// List lists all IntegrationPlatforms in the indexer.
+func (s *integrationPlatformLister) List(selector labels.Selector) (ret []*v1alpha1.IntegrationPlatform, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.IntegrationPlatform))
+	})
+	return ret, err
+}
+
+// IntegrationPlatforms returns an object that can list and get IntegrationPlatforms.
+func (s *integrationPlatformLister) IntegrationPlatforms(namespace string) IntegrationPlatformNamespaceLister {
+	return integrationPlatformNamespaceLister{indexer: s.indexer, namespace: namespace}
+}
+
+// IntegrationPlatformNamespaceLister helps list and get IntegrationPlatforms.
+type IntegrationPlatformNamespaceLister interface {
+	// List lists all IntegrationPlatforms in the indexer for a given namespace.
+	List(selector labels.Selector) (ret []*v1alpha1.IntegrationPlatform, err error)
+	// Get retrieves the IntegrationPlatform from the indexer for a given namespace and name.
+	Get(name string) (*v1alpha1.IntegrationPlatform, error)
+	IntegrationPlatformNamespaceListerExpansion
+}
+
+// integrationPlatformNamespaceLister implements the IntegrationPlatformNamespaceLister
+// interface.
+type integrationPlatformNamespaceLister struct {
+	indexer   cache.Indexer
+	namespace string
+}
+
+// List lists all IntegrationPlatforms in the indexer for a given namespace.
+func (s integrationPlatformNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.IntegrationPlatform, err error) {
+	err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.IntegrationPlatform))
+	})
+	return ret, err
+}
+
+// Get retrieves the IntegrationPlatform from the indexer for a given namespace and name.
+func (s integrationPlatformNamespaceLister) Get(name string) (*v1alpha1.IntegrationPlatform, error) {
+	obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("integrationplatform"), name)
+	}
+	return obj.(*v1alpha1.IntegrationPlatform), nil
+}
diff --git a/script/Makefile b/script/Makefile
index ff39f9e..ed86f6b 100644
--- a/script/Makefile
+++ b/script/Makefile
@@ -121,7 +121,12 @@ codegen:
 	@echo "" >> $(VERSIONFILE)
 	gofmt -w pkg/util/defaults/defaults.go
 
-generate:
+generate: generate-deepcopy generate-client
+
+generate-client:
+	./script/gen_client.sh
+
+generate-deepcopy:
 	operator-sdk generate k8s
 
 build: build-kamel build-compile-integration-tests
@@ -229,4 +234,4 @@ install-minikube:
 release-notes:
 	./script/gen_release_notes.sh $(LAST_RELEASED_VERSION) $(VERSION)
 
-.PHONY: build build-kamel build-resources build-olm unsnapshot-olm dep codegen images images-dec images-push images-push-staging test check test-integration clean release cross-compile package-examples set-version git-tag release-notes check-licenses
+.PHONY: build build-kamel build-resources build-olm unsnapshot-olm dep codegen images images-dec images-push images-push-staging test check test-integration clean release cross-compile package-examples set-version git-tag release-notes check-licenses generate-deepcopy generate-client
diff --git a/script/gen_client.sh b/script/gen_client.sh
new file mode 100755
index 0000000..fb16528
--- /dev/null
+++ b/script/gen_client.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+location=$(dirname $0)
+rootdir=$location/..
+
+unset GOPATH
+GO111MODULE=on
+
+go run k8s.io/code-generator/cmd/client-gen \
+	--input=camel/v1alpha1 \
+	--go-header-file=$rootdir/script/headers/default.txt \
+	--clientset-name "versioned"  \
+	--input-base=github.com/apache/camel-k/pkg/apis \
+	--output-base=$rootdir \
+	--output-package=github.com/apache/camel-k/pkg/client/clientset
+
+
+go run k8s.io/code-generator/cmd/lister-gen \
+	--input-dirs=github.com/apache/camel-k/pkg/apis/camel/v1alpha1 \
+	--go-header-file=$rootdir/script/headers/default.txt \
+	--output-base=$rootdir \
+	--output-package=github.com/apache/camel-k/pkg/client/listers
+
+go run k8s.io/code-generator/cmd/informer-gen \
+    --versioned-clientset-package=github.com/apache/camel-k/pkg/client/clientset/versioned \
+	--listers-package=github.com/apache/camel-k/pkg/client/listers \
+	--input-dirs=github.com/apache/camel-k/pkg/apis/camel/v1alpha1 \
+	--go-header-file=$rootdir/script/headers/default.txt \
+	--output-base=$rootdir \
+	--output-package=github.com/apache/camel-k/pkg/client/informers
+
+
+# hack to fix non go-module compliance
+cp -R $rootdir/github.com/apache/camel-k/pkg/ $rootdir
+rm -rf $rootdir/github.com