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 1a009eb225081a287ff06851f734d2d33c6a748e Author: nicolaferraro <[email protected]> AuthorDate: Fri Oct 2 15:46:17 2020 +0200 Fix #1686: add support for strimzi in kamelet binding --- addons/register_strimzi.go | 27 ++++ addons/strimzi/addtoscheme_strimzi_duck_v1beta1.go | 28 ++++ .../v1beta1/client/internalclientset/clientset.go | 98 +++++++++++++ .../duck/v1beta1/client/internalclientset/doc.go | 21 +++ .../internalclientset/fake/clientset_generated.go | 83 +++++++++++ .../v1beta1/client/internalclientset/fake/doc.go | 21 +++ .../client/internalclientset/fake/register.go | 57 ++++++++ .../v1beta1/client/internalclientset/scheme/doc.go | 21 +++ .../client/internalclientset/scheme/register.go | 57 ++++++++ .../internalclientset/typed/duck/v1beta1/doc.go | 21 +++ .../typed/duck/v1beta1/duck_client.go | 95 ++++++++++++ .../typed/duck/v1beta1/fake/doc.go | 21 +++ .../typed/duck/v1beta1/fake/fake_duck_client.go | 45 ++++++ .../typed/duck/v1beta1/fake/fake_kafka.go | 79 ++++++++++ .../typed/duck/v1beta1/fake/fake_kafkatopic.go | 79 ++++++++++ .../typed/duck/v1beta1/generated_expansion.go | 24 ++++ .../internalclientset/typed/duck/v1beta1/kafka.go | 103 +++++++++++++ .../typed/duck/v1beta1/kafkatopic.go | 103 +++++++++++++ addons/strimzi/duck/v1beta1/doc.go | 21 +++ addons/strimzi/duck/v1beta1/duck_types.go | 83 +++++++++++ addons/strimzi/duck/v1beta1/register.go | 52 +++++++ .../strimzi/duck/v1beta1/zz_generated.deepcopy.go | 159 +++++++++++++++++++++ addons/strimzi/strimzi.go | 119 +++++++++++++++ addons/strimzi/strimzi_test.go | 113 +++++++++++++++ ...el-k.v1.2.0-snapshot.clusterserviceversion.yaml | 9 ++ deploy/operator-role-binding-strimzi.yaml | 30 ++++ deploy/operator-role-olm.yaml | 9 ++ deploy/operator-role-strimzi.yaml | 33 +++++ deploy/resources.go | 20 ++- helm/camel-k/templates/operator-role.yaml | 9 ++ pkg/controller/kameletbinding/initialize.go | 10 +- pkg/install/operator.go | 14 ++ pkg/util/bindings/api.go | 10 +- pkg/util/bindings/bindings_test.go | 16 ++- pkg/util/bindings/camel_uri.go | 2 +- pkg/util/bindings/catalog.go | 11 +- pkg/util/bindings/kamelet.go | 2 +- pkg/util/bindings/knative_ref.go | 2 +- pkg/util/bindings/knative_uri.go | 2 +- script/Makefile | 8 +- script/gen_client_strimzi.sh | 39 +++++ 41 files changed, 1740 insertions(+), 16 deletions(-) diff --git a/addons/register_strimzi.go b/addons/register_strimzi.go new file mode 100644 index 0000000..9eac795 --- /dev/null +++ b/addons/register_strimzi.go @@ -0,0 +1,27 @@ +/* +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 addons + +import ( + "github.com/apache/camel-k/addons/strimzi" + "github.com/apache/camel-k/pkg/util/bindings" +) + +func init() { + bindings.RegisterBindingProvider(strimzi.StrimziBindingProvider{}) +} diff --git a/addons/strimzi/addtoscheme_strimzi_duck_v1beta1.go b/addons/strimzi/addtoscheme_strimzi_duck_v1beta1.go new file mode 100644 index 0000000..d4af282 --- /dev/null +++ b/addons/strimzi/addtoscheme_strimzi_duck_v1beta1.go @@ -0,0 +1,28 @@ +/* +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 strimzi + +import ( + "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + "github.com/apache/camel-k/pkg/apis" +) + +func init() { + // Register the types with the Scheme so the components can map objects to GroupVersionKinds and back + apis.AddToSchemes = append(apis.AddToSchemes, v1beta1.SchemeBuilder.AddToScheme) +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/clientset.go b/addons/strimzi/duck/v1beta1/client/internalclientset/clientset.go new file mode 100644 index 0000000..e372c75 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/clientset.go @@ -0,0 +1,98 @@ +/* +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 internalclientset + +import ( + "fmt" + + kafkav1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1" + 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 + KafkaV1beta1() kafkav1beta1.KafkaV1beta1Interface +} + +// Clientset contains the clients for groups. Each group has exactly one +// version included in a Clientset. +type Clientset struct { + *discovery.DiscoveryClient + kafkaV1beta1 *kafkav1beta1.KafkaV1beta1Client +} + +// KafkaV1beta1 retrieves the KafkaV1beta1Client +func (c *Clientset) KafkaV1beta1() kafkav1beta1.KafkaV1beta1Interface { + return c.kafkaV1beta1 +} + +// 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. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfig will generate a rate-limiter in configShallowCopy. +func NewForConfig(c *rest.Config) (*Clientset, error) { + configShallowCopy := *c + if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + if configShallowCopy.Burst <= 0 { + return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + } + configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + } + var cs Clientset + var err error + cs.kafkaV1beta1, err = kafkav1beta1.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.kafkaV1beta1 = kafkav1beta1.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.kafkaV1beta1 = kafkav1beta1.New(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClient(c) + return &cs +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/doc.go b/addons/strimzi/duck/v1beta1/client/internalclientset/doc.go new file mode 100644 index 0000000..0eb96b7 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/doc.go @@ -0,0 +1,21 @@ +/* +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. + +// This package has the automatically generated clientset. +package internalclientset diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/fake/clientset_generated.go b/addons/strimzi/duck/v1beta1/client/internalclientset/fake/clientset_generated.go new file mode 100644 index 0000000..de14238 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/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/addons/strimzi/duck/v1beta1/client/internalclientset" + kafkav1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1" + fakekafkav1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/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{} + +// KafkaV1beta1 retrieves the KafkaV1beta1Client +func (c *Clientset) KafkaV1beta1() kafkav1beta1.KafkaV1beta1Interface { + return &fakekafkav1beta1.FakeKafkaV1beta1{Fake: &c.Fake} +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/fake/doc.go b/addons/strimzi/duck/v1beta1/client/internalclientset/fake/doc.go new file mode 100644 index 0000000..9c6a5fa --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/fake/doc.go @@ -0,0 +1,21 @@ +/* +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. + +// This package has the automatically generated fake clientset. +package fake diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/fake/register.go b/addons/strimzi/duck/v1beta1/client/internalclientset/fake/register.go new file mode 100644 index 0000000..7c48520 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/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 ( + kafkav1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + 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{ + kafkav1beta1.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/addons/strimzi/duck/v1beta1/client/internalclientset/scheme/doc.go b/addons/strimzi/duck/v1beta1/client/internalclientset/scheme/doc.go new file mode 100644 index 0000000..dd7d3b5 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/scheme/doc.go @@ -0,0 +1,21 @@ +/* +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. + +// This package contains the scheme of the automatically generated clientset. +package scheme diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/scheme/register.go b/addons/strimzi/duck/v1beta1/client/internalclientset/scheme/register.go new file mode 100644 index 0000000..4408b11 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/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 ( + kafkav1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + 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{ + kafkav1beta1.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/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/doc.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/doc.go new file mode 100644 index 0000000..69b5e24 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/doc.go @@ -0,0 +1,21 @@ +/* +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. + +// This package has the automatically generated typed clients. +package v1beta1 diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/duck_client.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/duck_client.go new file mode 100644 index 0000000..8608c2a --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/duck_client.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 client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/scheme" + rest "k8s.io/client-go/rest" +) + +type KafkaV1beta1Interface interface { + RESTClient() rest.Interface + KafkasGetter + KafkaTopicsGetter +} + +// KafkaV1beta1Client is used to interact with features provided by the kafka.strimzi.io group. +type KafkaV1beta1Client struct { + restClient rest.Interface +} + +func (c *KafkaV1beta1Client) Kafkas(namespace string) KafkaInterface { + return newKafkas(c, namespace) +} + +func (c *KafkaV1beta1Client) KafkaTopics(namespace string) KafkaTopicInterface { + return newKafkaTopics(c, namespace) +} + +// NewForConfig creates a new KafkaV1beta1Client for the given config. +func NewForConfig(c *rest.Config) (*KafkaV1beta1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &KafkaV1beta1Client{client}, nil +} + +// NewForConfigOrDie creates a new KafkaV1beta1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *KafkaV1beta1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new KafkaV1beta1Client for the given RESTClient. +func New(c rest.Interface) *KafkaV1beta1Client { + return &KafkaV1beta1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1beta1.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 *KafkaV1beta1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/doc.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/doc.go new file mode 100644 index 0000000..5d1c76c --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/doc.go @@ -0,0 +1,21 @@ +/* +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 has the automatically generated clients. +package fake diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_duck_client.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_duck_client.go new file mode 100644 index 0000000..bfeb3b9 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_duck_client.go @@ -0,0 +1,45 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeKafkaV1beta1 struct { + *testing.Fake +} + +func (c *FakeKafkaV1beta1) Kafkas(namespace string) v1beta1.KafkaInterface { + return &FakeKafkas{c, namespace} +} + +func (c *FakeKafkaV1beta1) KafkaTopics(namespace string) v1beta1.KafkaTopicInterface { + return &FakeKafkaTopics{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeKafkaV1beta1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_kafka.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_kafka.go new file mode 100644 index 0000000..09d6e59 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_kafka.go @@ -0,0 +1,79 @@ +/* +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 ( + v1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeKafkas implements KafkaInterface +type FakeKafkas struct { + Fake *FakeKafkaV1beta1 + ns string +} + +var kafkasResource = schema.GroupVersionResource{Group: "kafka.strimzi.io", Version: "v1beta1", Resource: "kafkas"} + +var kafkasKind = schema.GroupVersionKind{Group: "kafka.strimzi.io", Version: "v1beta1", Kind: "Kafka"} + +// Get takes name of the kafka, and returns the corresponding kafka object, and an error if there is any. +func (c *FakeKafkas) Get(name string, options v1.GetOptions) (result *v1beta1.Kafka, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(kafkasResource, c.ns, name), &v1beta1.Kafka{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Kafka), err +} + +// List takes label and field selectors, and returns the list of Kafkas that match those selectors. +func (c *FakeKafkas) List(opts v1.ListOptions) (result *v1beta1.KafkaList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(kafkasResource, kafkasKind, c.ns, opts), &v1beta1.KafkaList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1beta1.KafkaList{ListMeta: obj.(*v1beta1.KafkaList).ListMeta} + for _, item := range obj.(*v1beta1.KafkaList).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 kafkas. +func (c *FakeKafkas) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(kafkasResource, c.ns, opts)) + +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_kafkatopic.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_kafkatopic.go new file mode 100644 index 0000000..4a21468 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/fake/fake_kafkatopic.go @@ -0,0 +1,79 @@ +/* +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 ( + v1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeKafkaTopics implements KafkaTopicInterface +type FakeKafkaTopics struct { + Fake *FakeKafkaV1beta1 + ns string +} + +var kafkatopicsResource = schema.GroupVersionResource{Group: "kafka.strimzi.io", Version: "v1beta1", Resource: "kafkatopics"} + +var kafkatopicsKind = schema.GroupVersionKind{Group: "kafka.strimzi.io", Version: "v1beta1", Kind: "KafkaTopic"} + +// Get takes name of the kafkaTopic, and returns the corresponding kafkaTopic object, and an error if there is any. +func (c *FakeKafkaTopics) Get(name string, options v1.GetOptions) (result *v1beta1.KafkaTopic, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(kafkatopicsResource, c.ns, name), &v1beta1.KafkaTopic{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.KafkaTopic), err +} + +// List takes label and field selectors, and returns the list of KafkaTopics that match those selectors. +func (c *FakeKafkaTopics) List(opts v1.ListOptions) (result *v1beta1.KafkaTopicList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(kafkatopicsResource, kafkatopicsKind, c.ns, opts), &v1beta1.KafkaTopicList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1beta1.KafkaTopicList{ListMeta: obj.(*v1beta1.KafkaTopicList).ListMeta} + for _, item := range obj.(*v1beta1.KafkaTopicList).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 kafkaTopics. +func (c *FakeKafkaTopics) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(kafkatopicsResource, c.ns, opts)) + +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/generated_expansion.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/generated_expansion.go new file mode 100644 index 0000000..218890c --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/generated_expansion.go @@ -0,0 +1,24 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +type KafkaExpansion interface{} + +type KafkaTopicExpansion interface{} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/kafka.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/kafka.go new file mode 100644 index 0000000..8a3e627 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/kafka.go @@ -0,0 +1,103 @@ +/* +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 v1beta1 + +import ( + "time" + + v1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + scheme "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// KafkasGetter has a method to return a KafkaInterface. +// A group's client should implement this interface. +type KafkasGetter interface { + Kafkas(namespace string) KafkaInterface +} + +// KafkaInterface has methods to work with Kafka resources. +type KafkaInterface interface { + Get(name string, options v1.GetOptions) (*v1beta1.Kafka, error) + List(opts v1.ListOptions) (*v1beta1.KafkaList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + KafkaExpansion +} + +// kafkas implements KafkaInterface +type kafkas struct { + client rest.Interface + ns string +} + +// newKafkas returns a Kafkas +func newKafkas(c *KafkaV1beta1Client, namespace string) *kafkas { + return &kafkas{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the kafka, and returns the corresponding kafka object, and an error if there is any. +func (c *kafkas) Get(name string, options v1.GetOptions) (result *v1beta1.Kafka, err error) { + result = &v1beta1.Kafka{} + err = c.client.Get(). + Namespace(c.ns). + Resource("kafkas"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Kafkas that match those selectors. +func (c *kafkas) List(opts v1.ListOptions) (result *v1beta1.KafkaList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.KafkaList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("kafkas"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested kafkas. +func (c *kafkas) 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("kafkas"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} diff --git a/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/kafkatopic.go b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/kafkatopic.go new file mode 100644 index 0000000..4ae4628 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1/kafkatopic.go @@ -0,0 +1,103 @@ +/* +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 v1beta1 + +import ( + "time" + + v1beta1 "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + scheme "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// KafkaTopicsGetter has a method to return a KafkaTopicInterface. +// A group's client should implement this interface. +type KafkaTopicsGetter interface { + KafkaTopics(namespace string) KafkaTopicInterface +} + +// KafkaTopicInterface has methods to work with KafkaTopic resources. +type KafkaTopicInterface interface { + Get(name string, options v1.GetOptions) (*v1beta1.KafkaTopic, error) + List(opts v1.ListOptions) (*v1beta1.KafkaTopicList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + KafkaTopicExpansion +} + +// kafkaTopics implements KafkaTopicInterface +type kafkaTopics struct { + client rest.Interface + ns string +} + +// newKafkaTopics returns a KafkaTopics +func newKafkaTopics(c *KafkaV1beta1Client, namespace string) *kafkaTopics { + return &kafkaTopics{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the kafkaTopic, and returns the corresponding kafkaTopic object, and an error if there is any. +func (c *kafkaTopics) Get(name string, options v1.GetOptions) (result *v1beta1.KafkaTopic, err error) { + result = &v1beta1.KafkaTopic{} + err = c.client.Get(). + Namespace(c.ns). + Resource("kafkatopics"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of KafkaTopics that match those selectors. +func (c *kafkaTopics) List(opts v1.ListOptions) (result *v1beta1.KafkaTopicList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.KafkaTopicList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("kafkatopics"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested kafkaTopics. +func (c *kafkaTopics) 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("kafkatopics"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} diff --git a/addons/strimzi/duck/v1beta1/doc.go b/addons/strimzi/duck/v1beta1/doc.go new file mode 100644 index 0000000..cc460f0 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/doc.go @@ -0,0 +1,21 @@ +/* +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 duck contains a partial schema of the Strimzi APIs +// +k8s:deepcopy-gen=package,register +// +groupName=kafka.strimzi.io +package v1beta1 diff --git a/addons/strimzi/duck/v1beta1/duck_types.go b/addons/strimzi/duck/v1beta1/duck_types.go new file mode 100644 index 0000000..1828175 --- /dev/null +++ b/addons/strimzi/duck/v1beta1/duck_types.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. +*/ + +// Package duck contains duck-types for accessing Strimzi resources +package v1beta1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +const ( + StrimziGroup = "kafka.strimzi.io" + StrimziVersion = "v1beta1" + StrimziKindTopic = "KafkaTopic" + StrimziKindKafkaCluster = "Kafka" + + StrimziKafkaClusterLabel = "strimzi.io/cluster" + + StrimziListenerTypePlain = "plain" +) + +// +kubebuilder:object:root=true +// +genclient +// +genclient:onlyVerbs=get,list,watch +// +genclient:noStatus + +// KafkaTopic is the duck of a KafkaTopic +type KafkaTopic struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// KafkaTopicList contains a list of KafkaTopic +type KafkaTopicList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []KafkaTopic `json:"items"` +} + +// +kubebuilder:object:root=true +// +genclient +// +genclient:onlyVerbs=get,list,watch +// +genclient:noStatus + +// Kafka is the duck of a Kafka +type Kafka struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Status KafkaStatus `json:"status,omitempty"` +} + +// KafkaStatus contains the relevant info of the Kafka status +type KafkaStatus struct { + Listeners []KafkaStatusListener `json:"listeners,omitempty"` +} + +// KafkaStatusListener contains listener information +type KafkaStatusListener struct { + BootstrapServers string `json:"bootstrapServers,omitempty"` + Type string `json:"type,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// KafkaList contains a list of Kafka +type KafkaList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Kafka `json:"items"` +} diff --git a/addons/strimzi/duck/v1beta1/register.go b/addons/strimzi/duck/v1beta1/register.go new file mode 100644 index 0000000..203ddee --- /dev/null +++ b/addons/strimzi/duck/v1beta1/register.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. +*/ + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +var ( + // SchemeGroupVersion is group version used to register these objects + SchemeGroupVersion = schema.GroupVersion{Group: StrimziGroup, Version: StrimziVersion} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + + // 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() +} + +// Adds the list of known types to Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &KafkaTopic{}, + &KafkaTopicList{}, + &Kafka{}, + &KafkaList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/addons/strimzi/duck/v1beta1/zz_generated.deepcopy.go b/addons/strimzi/duck/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 0000000..7b7e8fa --- /dev/null +++ b/addons/strimzi/duck/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,159 @@ +// +build !ignore_autogenerated + +// Code generated by controller-gen. DO NOT EDIT. + +package v1beta1 + +import ( + "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Kafka) DeepCopyInto(out *Kafka) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Kafka. +func (in *Kafka) DeepCopy() *Kafka { + if in == nil { + return nil + } + out := new(Kafka) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Kafka) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KafkaList) DeepCopyInto(out *KafkaList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Kafka, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KafkaList. +func (in *KafkaList) DeepCopy() *KafkaList { + if in == nil { + return nil + } + out := new(KafkaList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *KafkaList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KafkaStatus) DeepCopyInto(out *KafkaStatus) { + *out = *in + if in.Listeners != nil { + in, out := &in.Listeners, &out.Listeners + *out = make([]KafkaStatusListener, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KafkaStatus. +func (in *KafkaStatus) DeepCopy() *KafkaStatus { + if in == nil { + return nil + } + out := new(KafkaStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KafkaStatusListener) DeepCopyInto(out *KafkaStatusListener) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KafkaStatusListener. +func (in *KafkaStatusListener) DeepCopy() *KafkaStatusListener { + if in == nil { + return nil + } + out := new(KafkaStatusListener) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KafkaTopic) DeepCopyInto(out *KafkaTopic) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KafkaTopic. +func (in *KafkaTopic) DeepCopy() *KafkaTopic { + if in == nil { + return nil + } + out := new(KafkaTopic) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *KafkaTopic) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KafkaTopicList) DeepCopyInto(out *KafkaTopicList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]KafkaTopic, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KafkaTopicList. +func (in *KafkaTopicList) DeepCopy() *KafkaTopicList { + if in == nil { + return nil + } + out := new(KafkaTopicList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *KafkaTopicList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} diff --git a/addons/strimzi/strimzi.go b/addons/strimzi/strimzi.go new file mode 100644 index 0000000..0ebf265 --- /dev/null +++ b/addons/strimzi/strimzi.go @@ -0,0 +1,119 @@ +/* +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 strimzi contains integrations with the Strimzi project for running Apache Kafka on Kubernetes +package strimzi + +import ( + "fmt" + + "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset" + typedclient "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/typed/duck/v1beta1" + "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" + "github.com/apache/camel-k/pkg/util/bindings" + "github.com/apache/camel-k/pkg/util/uri" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// StrimziBindingProvider allows to connect to a Kafka topic via KameletBinding +type StrimziBindingProvider struct { + Client typedclient.KafkaV1beta1Interface +} + +func (s StrimziBindingProvider) ID() string { + return "strimzi" +} + +func (s StrimziBindingProvider) Translate(ctx bindings.BindingContext, _ v1alpha1.EndpointType, endpoint v1alpha1.Endpoint) (*bindings.Binding, error) { + if endpoint.Ref == nil { + // React only on refs + return nil, nil + } + gv, err := schema.ParseGroupVersion(endpoint.Ref.APIVersion) + if err != nil { + return nil, err + } + + if gv.Group != v1beta1.StrimziGroup || endpoint.Ref.Kind != v1beta1.StrimziKindTopic { + // Only operates on Strimzi Topics + return nil, nil + } + + props, err := endpoint.Properties.GetPropertyMap() + if err != nil { + return nil, err + } + if props == nil { + props = make(map[string]string) + } + + if props["brokers"] == "" { + // build the client if needed + if s.Client == nil { + kafkaClient, err := internalclientset.NewForConfig(ctx.Client.GetConfig()) + if err != nil { + return nil, err + } + s.Client = kafkaClient.KafkaV1beta1() + } + + // look them up + topic, err := s.Client.KafkaTopics(ctx.Namespace).Get(endpoint.Ref.Name, v1.GetOptions{}) + if err != nil { + return nil, err + } + + clusterName := topic.Labels[v1beta1.StrimziKafkaClusterLabel] + if clusterName == "" { + return nil, fmt.Errorf("no %q label defined on topic %s", v1beta1.StrimziKafkaClusterLabel, endpoint.Ref.Name) + } + + cluster, err := s.Client.Kafkas(ctx.Namespace).Get(clusterName, v1.GetOptions{}) + if err != nil { + return nil, err + } + + var listener *v1beta1.KafkaStatusListener + for _, l := range cluster.Status.Listeners { + if l.Type == v1beta1.StrimziListenerTypePlain { + listener = &l + break + } + } + + if listener == nil { + return nil, fmt.Errorf("cluster %q has no listeners of type %q", clusterName, v1beta1.StrimziListenerTypePlain) + } + if listener.BootstrapServers == "" { + return nil, fmt.Errorf("cluster %q has no bootstrap servers in %q listener", clusterName, v1beta1.StrimziListenerTypePlain) + } + props["brokers"] = listener.BootstrapServers + } + + kafkaURI := fmt.Sprintf("kafka:%s", endpoint.Ref.Name) + kafkaURI = uri.AppendParameters(kafkaURI, props) + + return &bindings.Binding{ + URI: kafkaURI, + }, nil +} + +func (s StrimziBindingProvider) Order() int { + return bindings.OrderStandard +} diff --git a/addons/strimzi/strimzi_test.go b/addons/strimzi/strimzi_test.go new file mode 100644 index 0000000..ad90835 --- /dev/null +++ b/addons/strimzi/strimzi_test.go @@ -0,0 +1,113 @@ +package strimzi + +import ( + "context" + "encoding/json" + "github.com/apache/camel-k/addons/strimzi/duck/v1beta1" + "github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client/internalclientset/fake" + "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" + "github.com/apache/camel-k/pkg/util/bindings" + "github.com/apache/camel-k/pkg/util/test" + "github.com/stretchr/testify/assert" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "testing" +) + +func TestStrimziDirect(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, err := test.NewFakeClient() + assert.NoError(t, err) + + bindingContext := bindings.BindingContext{ + Ctx: ctx, + Client: client, + Namespace: "test", + } + + endpoint := v1alpha1.Endpoint{ + Ref: &v1.ObjectReference{ + Kind: "KafkaTopic", + Name: "mytopic", + APIVersion: "kafka.strimzi.io/v1beta1", + }, + Properties: asEndpointProperties(map[string]string{ + "brokers": "my-cluster-kafka-bootstrap:9092", + }), + } + + binding, err := StrimziBindingProvider{}.Translate(bindingContext, v1alpha1.EndpointTypeSink, endpoint) + assert.NoError(t, err) + assert.NotNil(t, binding) + assert.Equal(t, "kafka:mytopic?brokers=my-cluster-kafka-bootstrap%3A9092", binding.URI) + assert.Nil(t, binding.Traits) +} + +func TestStrimziLookup(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + cluster := v1beta1.Kafka{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "test", + Name: "myclusterx", + }, + Status: v1beta1.KafkaStatus{ + Listeners: []v1beta1.KafkaStatusListener{ + { + Type: "tls", + }, + { + BootstrapServers: "my-clusterx-kafka-bootstrap:9092", + Type: "plain", + }, + }, + }, + } + + topic := v1beta1.KafkaTopic{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "test", + Name: "mytopicy", + Labels: map[string]string{ + v1beta1.StrimziKafkaClusterLabel: "myclusterx", + }, + }, + } + + client := fake.NewSimpleClientset(&cluster, &topic) + provider := StrimziBindingProvider{ + Client: client.KafkaV1beta1(), + } + + bindingContext := bindings.BindingContext{ + Ctx: ctx, + Namespace: "test", + } + + endpoint := v1alpha1.Endpoint{ + Ref: &v1.ObjectReference{ + Kind: "KafkaTopic", + Name: "mytopicy", + APIVersion: "kafka.strimzi.io/v1beta1", + }, + } + + binding, err := provider.Translate(bindingContext, v1alpha1.EndpointTypeSink, endpoint) + assert.NoError(t, err) + assert.NotNil(t, binding) + assert.Equal(t, "kafka:mytopicy?brokers=my-clusterx-kafka-bootstrap%3A9092", binding.URI) + assert.Nil(t, binding.Traits) +} + +func asEndpointProperties(props map[string]string) v1alpha1.EndpointProperties { + serialized, err := json.Marshal(props) + if err != nil { + panic(err) + } + return v1alpha1.EndpointProperties{ + RawMessage: serialized, + } +} diff --git a/deploy/olm-catalog/camel-k-dev/1.2.0-snapshot/camel-k.v1.2.0-snapshot.clusterserviceversion.yaml b/deploy/olm-catalog/camel-k-dev/1.2.0-snapshot/camel-k.v1.2.0-snapshot.clusterserviceversion.yaml index 77cbde0..fb43d7f 100644 --- a/deploy/olm-catalog/camel-k-dev/1.2.0-snapshot/camel-k.v1.2.0-snapshot.clusterserviceversion.yaml +++ b/deploy/olm-catalog/camel-k-dev/1.2.0-snapshot/camel-k.v1.2.0-snapshot.clusterserviceversion.yaml @@ -522,6 +522,15 @@ spec: - patch - update - watch + - apiGroups: + - "kafka.strimzi.io" + resources: + - topics + - kafkas + verbs: + - get + - list + - watch serviceAccountName: camel-k-operator strategy: deployment installModes: diff --git a/deploy/operator-role-binding-strimzi.yaml b/deploy/operator-role-binding-strimzi.yaml new file mode 100644 index 0000000..9a860c0 --- /dev/null +++ b/deploy/operator-role-binding-strimzi.yaml @@ -0,0 +1,30 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: camel-k-operator-strimzi + labels: + app: "camel-k" +subjects: +- kind: ServiceAccount + name: camel-k-operator +roleRef: + kind: Role + name: camel-k-operator-strimzi + apiGroup: rbac.authorization.k8s.io diff --git a/deploy/operator-role-olm.yaml b/deploy/operator-role-olm.yaml index fa6c6f3..53fa59f 100644 --- a/deploy/operator-role-olm.yaml +++ b/deploy/operator-role-olm.yaml @@ -234,3 +234,12 @@ rules: - patch - update - watch +- apiGroups: + - "kafka.strimzi.io" + resources: + - topics + - kafkas + verbs: + - get + - list + - watch diff --git a/deploy/operator-role-strimzi.yaml b/deploy/operator-role-strimzi.yaml new file mode 100644 index 0000000..f0c67a8 --- /dev/null +++ b/deploy/operator-role-strimzi.yaml @@ -0,0 +1,33 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: camel-k-operator-strimzi + labels: + app: "camel-k" +rules: +- apiGroups: + - "kafka.strimzi.io" + resources: + - topics + - kafkas + verbs: + - get + - list + - watch diff --git a/deploy/resources.go b/deploy/resources.go index 76daba7..e92808f 100644 --- a/deploy/resources.go +++ b/deploy/resources.go @@ -186,6 +186,13 @@ var assets = func() http.FileSystem { compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x53\x4d\x8f\xdb\x36\x10\xbd\xf3\x57\x3c\x58\x97\x04\x58\xcb\x6d\x4f\x85\x7b\x52\x36\xeb\x56\x68\x60\x03\x96\xd3\x20\x47\x9a\x1a\x4b\x53\x4b\x1c\x75\x48\xad\xe2\xfe\xfa\x82\xb2\xdd\xdd\xa0\x68\x81\x02\xe1\xcd\xf0\xcc\xfb\x98\xf7\x94\x61\xf9\xed\x9e\xc9\xf0\x81\x1d\xf9\x40\x35\xa2\x20\xb6\x84\x62\xb0\xae\x25\x54\x72\x8a\x93\x55\xc2\x46\x46\x5f\xdb\xc8\xe2\xf1\xa6\xa8\x36\x6f\x31\xfa\x9a\x14\xe2\x09\xa2\xe8\x45\xc9\x [...] }, + "/operator-role-binding-strimzi.yaml": &vfsgen۰CompressedFileInfo{ + name: "operator-role-binding-strimzi.yaml", + modTime: time.Time{}, + uncompressedSize: 1221, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x93\x41\x6f\xfa\x46\x10\xc5\xef\xfb\x29\x9e\xf0\xe5\x1f\x09\x4c\xdb\x53\x45\x4f\x4e\x02\xad\xd5\x08\x24\x4c\x1a\xe5\xb8\xac\x07\x7b\x8a\xbd\xe3\xee\xae\xe3\x90\x4f\x5f\xad\x81\x26\x51\xd5\xea\x7f\xc8\xde\x10\xc3\x9b\xdf\x9b\xf7\x48\x30\xfb\xba\xa7\x12\x3c\xb0\x21\xeb\xa9\x44\x10\x84\x9a\x90\x75\xda\xd4\x84\x42\x0e\x61\xd0\x8e\xb0\x92\xde\x96\x3a\xb0\x58\x7c\xcb\x8a\xd5\x0d\x7a\x5b\x92\x83\x58\x82\x38\xb4\xe2\x48\x [...] + }, "/operator-role-binding.yaml": &vfsgen۰CompressedFileInfo{ name: "operator-role-binding.yaml", modTime: time.Time{}, @@ -224,9 +231,9 @@ var assets = func() http.FileSystem { "/operator-role-olm.yaml": &vfsgen۰CompressedFileInfo{ name: "operator-role-olm.yaml", modTime: time.Time{}, - uncompressedSize: 3851, + uncompressedSize: 3958, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x56\x41\x8f\xdb\x36\x13\xbd\xeb\x57\x0c\xec\x4b\xf2\x61\x2d\x7f\xed\xa9\x70\x4f\x6e\xb2\xdb\x1a\x0d\xbc\xc0\x7a\xd3\x20\xc7\x11\x35\x96\xa6\x4b\x72\x58\x92\xb2\xe3\xfe\xfa\x82\xb4\x9c\xc8\xd1\xba\x49\x81\xa0\xae\x2f\xa6\xc8\xf1\x9b\x37\xef\x8d\xc6\x9c\xc2\xec\xdb\x7d\x8a\x29\xbc\x61\x45\x36\x50\x0d\x51\x20\xb6\x04\x4b\x87\xaa\x25\xd8\xc8\x36\xee\xd1\x13\xdc\x49\x67\x6b\x8c\x2c\x16\x5e\x2c\x37\x77\x2f\xa1\xb3\x35\x [...] + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x56\x41\x8f\xdb\x36\x13\xbd\xeb\x57\x0c\xec\x4b\xf2\x61\x2d\x7f\xed\xa9\x70\x4f\x6e\xb2\xdb\x1a\x0d\xbc\xc0\x7a\xd3\x20\xc7\x31\x35\x96\xa6\x26\x39\x2c\x49\xd9\x71\x7e\x7d\x41\x4a\x4e\xe4\x68\xb7\x49\x81\x00\xae\x2f\xa6\x86\xa3\x99\x37\xef\x0d\x47\x9c\xc2\xec\xfb\xfd\x8a\x29\xbc\x61\x45\x36\x50\x05\x51\x20\x36\x04\x4b\x87\xaa\x21\xd8\xc8\x2e\x1e\xd1\x13\xdc\x49\x6b\x2b\x8c\x2c\x16\x5e\x2c\x37\x77\x2f\xa1\xb5\x15\x [...] }, "/operator-role-openshift.yaml": &vfsgen۰CompressedFileInfo{ name: "operator-role-openshift.yaml", @@ -242,6 +249,13 @@ var assets = func() http.FileSystem { compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x53\xc1\x8e\xdb\x36\x10\xbd\xf3\x2b\x1e\xac\x4b\x02\xac\xe5\xb6\xa7\xc2\x3d\xb9\x9b\xdd\x56\x68\x60\x03\x2b\xa7\x41\x8e\x34\x35\x96\x06\x4b\x71\xd4\x21\xb5\x8a\xfb\xf5\x85\x68\xb9\xd9\x45\xae\xe1\xc5\x63\x72\x66\xde\x7b\xf3\x46\x05\xd6\x3f\xee\x98\x02\x1f\xd9\x51\x88\xd4\x20\x09\x52\x47\xd8\x0d\xd6\x75\x84\x5a\xce\x69\xb2\x4a\x78\x94\x31\x34\x36\xb1\x04\xbc\xdb\xd5\x8f\xef\x31\x86\x86\x14\x12\x08\xa2\xe8\x45\xc9\x [...] }, + "/operator-role-strimzi.yaml": &vfsgen۰CompressedFileInfo{ + name: "operator-role-strimzi.yaml", + modTime: time.Time{}, + uncompressedSize: 1177, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x53\xc1\x6e\xdb\x46\x10\xbd\xef\x57\x3c\x88\x97\x04\xb0\xa8\xb6\xa7\x42\x3d\xa9\x8e\xdd\x12\x0d\x24\xc0\x54\x1a\xe4\x38\x22\x47\xe4\x40\xe4\x0e\x3b\xbb\x34\xe3\x7c\x7d\xb1\x14\xd5\x38\xe8\xd5\x7b\xe1\x10\xfb\xf8\xe6\xbd\x79\xc3\x0c\xeb\xb7\x3b\x2e\xc3\x47\xa9\xd8\x07\xae\x11\x15\xb1\x65\xec\x06\xaa\x5a\x46\xa9\xe7\x38\x91\x31\x1e\x75\xf4\x35\x45\x51\x8f\x77\xbb\xf2\xf1\x3d\x46\x5f\xb3\x41\x3d\x43\x0d\xbd\x1a\xbb\x [...] + }, "/operator-service-account.yaml": &vfsgen۰CompressedFileInfo{ name: "operator-service-account.yaml", modTime: time.Time{}, @@ -344,6 +358,7 @@ var assets = func() http.FileSystem { fs["/operator-role-binding-events.yaml"].(os.FileInfo), fs["/operator-role-binding-knative.yaml"].(os.FileInfo), fs["/operator-role-binding-servicemonitors.yaml"].(os.FileInfo), + fs["/operator-role-binding-strimzi.yaml"].(os.FileInfo), fs["/operator-role-binding.yaml"].(os.FileInfo), fs["/operator-role-events.yaml"].(os.FileInfo), fs["/operator-role-knative.yaml"].(os.FileInfo), @@ -352,6 +367,7 @@ var assets = func() http.FileSystem { fs["/operator-role-olm.yaml"].(os.FileInfo), fs["/operator-role-openshift.yaml"].(os.FileInfo), fs["/operator-role-servicemonitors.yaml"].(os.FileInfo), + fs["/operator-role-strimzi.yaml"].(os.FileInfo), fs["/operator-service-account.yaml"].(os.FileInfo), fs["/platform-cr.yaml"].(os.FileInfo), fs["/prometheus-jmx-exporter.yaml"].(os.FileInfo), diff --git a/helm/camel-k/templates/operator-role.yaml b/helm/camel-k/templates/operator-role.yaml index c54ead2..0a2fcb9 100644 --- a/helm/camel-k/templates/operator-role.yaml +++ b/helm/camel-k/templates/operator-role.yaml @@ -236,3 +236,12 @@ rules: - patch - update - watch +- apiGroups: + - "kafka.strimzi.io" + resources: + - topics + - kafkas + verbs: + - get + - list + - watch diff --git a/pkg/controller/kameletbinding/initialize.go b/pkg/controller/kameletbinding/initialize.go index 1054c3f..2afefcc 100644 --- a/pkg/controller/kameletbinding/initialize.go +++ b/pkg/controller/kameletbinding/initialize.go @@ -58,11 +58,17 @@ func (action *initializeAction) Handle(ctx context.Context, kameletbinding *v1al it.Spec = *kameletbinding.Spec.Integration.DeepCopy() } - from, err := bindings.Translate(v1alpha1.EndpointTypeSource, kameletbinding.Spec.Source) + bindingContext := bindings.BindingContext{ + Ctx: ctx, + Client: action.client, + Namespace: it.Namespace, + } + + from, err := bindings.Translate(bindingContext, v1alpha1.EndpointTypeSource, kameletbinding.Spec.Source) if err != nil { return nil, errors.Wrap(err, "could not determine source URI") } - to, err := bindings.Translate(v1alpha1.EndpointTypeSink, kameletbinding.Spec.Sink) + to, err := bindings.Translate(bindingContext, v1alpha1.EndpointTypeSink, kameletbinding.Spec.Sink) if err != nil { return nil, errors.Wrap(err, "could not determine sink URI") } diff --git a/pkg/install/operator.go b/pkg/install/operator.go index f1ec3f4..bfaa4d3 100644 --- a/pkg/install/operator.go +++ b/pkg/install/operator.go @@ -159,6 +159,13 @@ func OperatorOrCollect(ctx context.Context, c client.Client, cfg OperatorConfigu fmt.Println("Warning: the operator will not be able to create servicemonitors for metrics. Try installing as cluster-admin to allow the creation of servicemonitors.") } + if errmtr := installStrimziBindings(ctx, c, cfg.Namespace, customizer, collection, force); errmtr != nil { + if k8serrors.IsAlreadyExists(errmtr) { + return errmtr + } + fmt.Println("Warning: the operator will not be able to lookup strimzi kafka resources. Try installing as cluster-admin to allow the lookup of strimzi kafka resources.") + } + return nil } @@ -201,6 +208,13 @@ func installServiceMonitors(ctx context.Context, c client.Client, namespace stri ) } +func installStrimziBindings(ctx context.Context, c client.Client, namespace string, customizer ResourceCustomizer, collection *kubernetes.Collection, force bool) error { + return ResourcesOrCollect(ctx, c, namespace, collection, force, customizer, + "operator-role-strimzi.yaml", + "operator-role-binding-strimzi.yaml", + ) +} + // Platform installs the platform custom resource // nolint: lll func Platform(ctx context.Context, c client.Client, clusterType string, namespace string, registry v1.IntegrationPlatformRegistrySpec) (*v1.IntegrationPlatform, error) { diff --git a/pkg/util/bindings/api.go b/pkg/util/bindings/api.go index c9daf72..f07d8cc 100644 --- a/pkg/util/bindings/api.go +++ b/pkg/util/bindings/api.go @@ -19,8 +19,10 @@ limitations under the License. package bindings import ( + "context" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" + "github.com/apache/camel-k/pkg/client" ) const ( @@ -42,7 +44,13 @@ type BindingProvider interface { // ID returns the name of the binding provider ID() string // Translate does the actual mapping - Translate(endpointType v1alpha1.EndpointType, endpoint v1alpha1.Endpoint) (*Binding, error) + Translate(ctx BindingContext, endpointType v1alpha1.EndpointType, endpoint v1alpha1.Endpoint) (*Binding, error) // Order returns the relative order of execution of the binding provider Order() int } + +type BindingContext struct { + Ctx context.Context + Client client.Client + Namespace string +} diff --git a/pkg/util/bindings/bindings_test.go b/pkg/util/bindings/bindings_test.go index 1f7696a..8ad28a2 100644 --- a/pkg/util/bindings/bindings_test.go +++ b/pkg/util/bindings/bindings_test.go @@ -18,8 +18,10 @@ limitations under the License. package bindings import ( + "context" "encoding/json" "fmt" + "github.com/apache/camel-k/pkg/util/test" "net/url" "testing" @@ -166,7 +168,19 @@ func TestBindings(t *testing.T) { for i, tc := range testcases { t.Run(fmt.Sprintf("test-%d-%s", i, tc.uri), func(t *testing.T) { - binding, err := Translate(tc.endpointType, tc.endpoint) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, err := test.NewFakeClient() + assert.NoError(t, err) + + bindingContext := BindingContext{ + Ctx: ctx, + Client: client, + Namespace: "test", + } + + binding, err := Translate(bindingContext, tc.endpointType, tc.endpoint) assert.NoError(t, err) assert.NotNil(t, binding) assert.Equal(t, tc.uri, binding.URI) diff --git a/pkg/util/bindings/camel_uri.go b/pkg/util/bindings/camel_uri.go index 6dfea5f..a264ff7 100644 --- a/pkg/util/bindings/camel_uri.go +++ b/pkg/util/bindings/camel_uri.go @@ -30,7 +30,7 @@ func (k CamelURIBindingProvider) ID() string { return "camel-uri" } -func (k CamelURIBindingProvider) Translate(endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { +func (k CamelURIBindingProvider) Translate(ctx BindingContext, endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { if e.URI == nil { // works only on uris return nil, nil diff --git a/pkg/util/bindings/catalog.go b/pkg/util/bindings/catalog.go index 0fa42ee..dbe3f74 100644 --- a/pkg/util/bindings/catalog.go +++ b/pkg/util/bindings/catalog.go @@ -37,13 +37,13 @@ func RegisterBindingProvider(bp BindingProvider) { } // Translate execute all chained binding providers, returning the first success or the first error -func Translate(endpointType v1alpha1.EndpointType, endpoint v1alpha1.Endpoint) (*Binding, error) { - if err := validateEndpoint(endpoint); err != nil { +func Translate(ctx BindingContext, endpointType v1alpha1.EndpointType, endpoint v1alpha1.Endpoint) (*Binding, error) { + if err := validateEndpoint(ctx, endpoint); err != nil { return nil, err } for _, bp := range bindingProviders { - b, err := bp.Translate(endpointType, endpoint) + b, err := bp.Translate(ctx, endpointType, endpoint) if b != nil || err != nil { return b, err } @@ -51,11 +51,14 @@ func Translate(endpointType v1alpha1.EndpointType, endpoint v1alpha1.Endpoint) ( return nil, nil } -func validateEndpoint(e v1alpha1.Endpoint) error { +func validateEndpoint(ctx BindingContext, e v1alpha1.Endpoint) error { if e.Ref == nil && e.URI == nil { return errors.New("no ref or URI specified in endpoint") } else if e.Ref != nil && e.URI != nil { return errors.New("cannot use both ref and URI to specify an endpoint: only one of them should be used") } + if e.Ref != nil && e.Ref.Namespace != "" && e.Ref.Namespace != ctx.Namespace { + return errors.New("cross-namespace references are not allowed in kamelet binding") + } return nil } diff --git a/pkg/util/bindings/kamelet.go b/pkg/util/bindings/kamelet.go index 7e8d166..48fc456 100644 --- a/pkg/util/bindings/kamelet.go +++ b/pkg/util/bindings/kamelet.go @@ -33,7 +33,7 @@ func (k KameletBindingProvider) ID() string { return "kamelet" } -func (k KameletBindingProvider) Translate(endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { +func (k KameletBindingProvider) Translate(ctx BindingContext, endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { if e.Ref == nil { // works only on refs return nil, nil diff --git a/pkg/util/bindings/knative_ref.go b/pkg/util/bindings/knative_ref.go index bd7f7a3..e3ad420 100644 --- a/pkg/util/bindings/knative_ref.go +++ b/pkg/util/bindings/knative_ref.go @@ -37,7 +37,7 @@ func (k KnativeRefBindingProvider) ID() string { return "knative-ref" } -func (k KnativeRefBindingProvider) Translate(endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { +func (k KnativeRefBindingProvider) Translate(ctx BindingContext, endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { if e.Ref == nil { // works only on refs return nil, nil diff --git a/pkg/util/bindings/knative_uri.go b/pkg/util/bindings/knative_uri.go index 0f43cfa..88bdd0c 100644 --- a/pkg/util/bindings/knative_uri.go +++ b/pkg/util/bindings/knative_uri.go @@ -35,7 +35,7 @@ func (k KnativeURIBindingProvider) ID() string { return "knative-uri" } -func (k KnativeURIBindingProvider) Translate(endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { +func (k KnativeURIBindingProvider) Translate(ctx BindingContext, endpointType v1alpha1.EndpointType, e v1alpha1.Endpoint) (*Binding, error) { if e.URI == nil { // works only on uris return nil, nil diff --git a/script/Makefile b/script/Makefile index 4a2c435..1438292 100644 --- a/script/Makefile +++ b/script/Makefile @@ -120,7 +120,7 @@ codegen: @echo "" >> $(VERSIONFILE) gofmt -w pkg/util/defaults/defaults.go -generate: generate-deepcopy generate-crd generate-client generate-doc +generate: generate-deepcopy generate-crd generate-client generate-doc generate-strimzi generate-client: ./script/gen_client.sh @@ -134,6 +134,10 @@ generate-doc: generate-deepcopy: controller-gen cd pkg/apis/camel && $(CONTROLLER_GEN) paths="./..." object +generate-strimzi: + cd addons/strimzi/duck && $(CONTROLLER_GEN) paths="./..." object + ./script/gen_client_strimzi.sh + build: build-resources build-kamel build-compile-integration-tests build-submodules test: build @@ -276,7 +280,7 @@ get-staging-repo: get-version: @echo $(VERSION) -.PHONY: build build-kamel build-resources build-olm unsnapshot-olm dep codegen images images-dev 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 generate-doc build-resources release-helm release-staging release-nightly get-staging-repo get-version build-submodules set-module-version bundle-kamelets +.PHONY: build build-kamel build-resources build-olm unsnapshot-olm dep codegen images images-dev 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 generate-doc build-resources release-helm release-staging release-nightly get-staging-repo get-version build-submodules set-module-version bundle-kamelets generate-strimzi # find or download controller-gen # download controller-gen if necessary diff --git a/script/gen_client_strimzi.sh b/script/gen_client_strimzi.sh new file mode 100755 index 0000000..f882f78 --- /dev/null +++ b/script/gen_client_strimzi.sh @@ -0,0 +1,39 @@ +#!/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. + +set -e + +location=$(dirname $0) +rootdir=$location/.. + +unset GOPATH +GO111MODULE=on + +echo "Generating Go client code for Strimzi addon..." + +cd $rootdir + +go run k8s.io/code-generator/cmd/client-gen \ + -h script/headers/default.txt \ + --input duck/v1beta1 \ + --input-base=github.com/apache/camel-k/addons/strimzi \ + --output-package=github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client + + +rm -r ./addons/strimzi/duck/v1beta1/client || true +mv github.com/apache/camel-k/addons/strimzi/duck/v1beta1/client ./addons/strimzi/duck/v1beta1/ +rm -r ./github.com
