You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2021/02/10 13:34:04 UTC

[camel-k] branch master updated (e49c947 -> cfa0f7f)

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

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


    from e49c947  fix(rbac): Do not create the operator Deployment and ServiceAccount twice
     new c9160df  fix: ServiceBinding SAR check does not guaranty CRD is installed
     new cfa0f7f  chore: Improve ServiceBinding watch error handling

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


Summary of changes:
 .../integration/integration_controller.go          | 38 +++++++++++++---------
 pkg/install/openshift.go                           | 21 ++----------
 .../openshift.go => kubernetes/discovery.go}       | 27 +++++++++------
 3 files changed, 41 insertions(+), 45 deletions(-)
 copy pkg/util/{openshift/openshift.go => kubernetes/discovery.go} (65%)


[camel-k] 01/02: fix: ServiceBinding SAR check does not guaranty CRD is installed

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

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

commit c9160df4fae2015eab6488f5db923963c602f30c
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Wed Feb 10 12:24:55 2021 +0100

    fix: ServiceBinding SAR check does not guaranty CRD is installed
---
 .../integration/integration_controller.go          | 34 ++++++++++--------
 pkg/install/openshift.go                           | 21 ++---------
 pkg/util/kubernetes/discovery.go                   | 41 ++++++++++++++++++++++
 3 files changed, 63 insertions(+), 33 deletions(-)

diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go
index e61ca9e..52cae9d 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -19,6 +19,7 @@ package integration
 
 import (
 	"context"
+	"reflect"
 
 	appsv1 "k8s.io/api/apps/v1"
 	"k8s.io/api/batch/v1beta1"
@@ -37,6 +38,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
+	sb "github.com/redhat-developer/service-binding-operator/pkg/apis/operators/v1alpha1"
+
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/client"
 	camelevent "github.com/apache/camel-k/pkg/event"
@@ -45,7 +48,6 @@ import (
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 	"github.com/apache/camel-k/pkg/util/log"
 	"github.com/apache/camel-k/pkg/util/monitoring"
-	sb "github.com/redhat-developer/service-binding-operator/pkg/apis/operators/v1alpha1"
 )
 
 // Add creates a new Integration Controller and adds it to the Manager. The Manager will set fields on the Controller
@@ -55,7 +57,7 @@ func Add(mgr manager.Manager) error {
 	if err != nil {
 		return err
 	}
-	return add(mgr, newReconciler(mgr, c))
+	return add(mgr, newReconciler(mgr, c), c)
 }
 
 // newReconciler returns a new reconcile.Reconciler
@@ -75,15 +77,15 @@ func newReconciler(mgr manager.Manager, c client.Client) reconcile.Reconciler {
 }
 
 // add adds a new Controller to mgr with r as the reconcile.Reconciler
-func add(mgr manager.Manager, r reconcile.Reconciler) error {
+func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 	// Create a new controller
-	c, err := controller.New("integration-controller", mgr, controller.Options{Reconciler: r})
+	ctrl, err := controller.New("integration-controller", mgr, controller.Options{Reconciler: r})
 	if err != nil {
 		return err
 	}
 
 	// Watch for changes to primary resource Integration
-	err = c.Watch(&source.Kind{Type: &v1.Integration{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
+	err = ctrl.Watch(&source.Kind{Type: &v1.Integration{}}, &handler.EnqueueRequestForObject{}, predicate.Funcs{
 		UpdateFunc: func(e event.UpdateEvent) bool {
 			oldIntegration := e.ObjectOld.(*v1.Integration)
 			newIntegration := e.ObjectNew.(*v1.Integration)
@@ -105,7 +107,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	// Watch for IntegrationKit phase transitioning to ready or error and
 	// enqueue requests for any integrations that are in phase waiting for
 	// kit
-	err = c.Watch(&source.Kind{Type: &v1.IntegrationKit{}}, &handler.EnqueueRequestsFromMapFunc{
+	err = ctrl.Watch(&source.Kind{Type: &v1.IntegrationKit{}}, &handler.EnqueueRequestsFromMapFunc{
 		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
 			kit := a.Object.(*v1.IntegrationKit)
 			var requests []reconcile.Request
@@ -140,7 +142,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 
 	// Watch for IntegrationPlatform phase transitioning to ready and enqueue
 	// requests for any integrations that are in phase waiting for platform
-	err = c.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}}, &handler.EnqueueRequestsFromMapFunc{
+	err = ctrl.Watch(&source.Kind{Type: &v1.IntegrationPlatform{}}, &handler.EnqueueRequestsFromMapFunc{
 		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
 			platform := a.Object.(*v1.IntegrationPlatform)
 			var requests []reconcile.Request
@@ -177,7 +179,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	// the EnqueueRequestForOwner handler as the owner depends on the deployment strategy,
 	// either regular deployment or Knative service. In any case, the integration is not the
 	// direct owner of the ReplicaSet.
-	err = c.Watch(&source.Kind{Type: &appsv1.ReplicaSet{}}, &handler.EnqueueRequestsFromMapFunc{
+	err = ctrl.Watch(&source.Kind{Type: &appsv1.ReplicaSet{}}, &handler.EnqueueRequestsFromMapFunc{
 		ToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {
 			rs := a.Object.(*appsv1.ReplicaSet)
 			var requests []reconcile.Request
@@ -211,7 +213,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch cronjob to update the ready condition
-	err = c.Watch(&source.Kind{Type: &v1beta1.CronJob{}}, &handler.EnqueueRequestForOwner{
+	err = ctrl.Watch(&source.Kind{Type: &v1beta1.CronJob{}}, &handler.EnqueueRequestForOwner{
 		OwnerType:    &v1.Integration{},
 		IsController: false,
 	})
@@ -219,15 +221,19 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 		return err
 	}
 
-	if client, err := client.FromManager(mgr); err != nil {
-		log.Error(err, "cannot check permissions for watching ServiceBindings")
-	} else if ok, err := kubernetes.CheckPermission(context.TODO(), client, "operators.coreos.com", "ServiceBinding", "", "", "create"); err != nil {
+
+	// Check the ServiceBinding CRD is present
+	if ok, err := kubernetes.IsAPIResourceInstalled(c, "operators.coreos.com/v1alpha1", reflect.TypeOf(sb.ServiceBinding{}).Name()); err != nil {
+		return err
+	} else if !ok {
+		log.Info("Service binding is disabled, install the Service Binding Operator if needed")
+	} else if ok, err := kubernetes.CheckPermission(context.TODO(), c, "operators.coreos.com", "ServiceBinding", "", "", "create"); err != nil {
 		log.Error(err, "cannot check permissions for watching ServiceBindings")
 	} else if !ok {
 		log.Info("ServiceBinding monitoring is disabled, install Service Binding Operator before camel-k if needed")
 	} else {
-		// Watch ServiceBindings created
-		err = c.Watch(&source.Kind{Type: &sb.ServiceBinding{}}, &handler.EnqueueRequestForOwner{
+		// Watch ServiceBindings and enqueue owning Integrations
+		err = ctrl.Watch(&source.Kind{Type: &sb.ServiceBinding{}}, &handler.EnqueueRequestForOwner{
 			OwnerType:    &v1.Integration{},
 			IsController: true,
 		})
diff --git a/pkg/install/openshift.go b/pkg/install/openshift.go
index 5d9ea0c..285dc10 100644
--- a/pkg/install/openshift.go
+++ b/pkg/install/openshift.go
@@ -33,6 +33,7 @@ import (
 
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/util/defaults"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
 )
 
 const (
@@ -59,7 +60,7 @@ var (
 func OpenShiftConsoleDownloadLink(ctx context.Context, c client.Client) error {
 	// Check the ConsoleCLIDownload CRD is present, which should be starting OpenShift version 4.2.
 	// That check is also enough to exclude Kubernetes clusters.
-	ok, err := isAPIResourceInstalled(c, "console.openshift.io/v1", reflect.TypeOf(console.ConsoleCLIDownload{}).Name())
+	ok, err := kubernetes.IsAPIResourceInstalled(c, "console.openshift.io/v1", reflect.TypeOf(console.ConsoleCLIDownload{}).Name())
 	if err != nil {
 		return err
 	} else if !ok {
@@ -161,21 +162,3 @@ func OpenShiftConsoleDownloadLink(ctx context.Context, c client.Client) error {
 
 	return nil
 }
-
-func isAPIResourceInstalled(c client.Client, groupVersion string, kind string) (bool, error) {
-	resources, err := c.Discovery().ServerResourcesForGroupVersion(groupVersion)
-	if err != nil {
-		if errors.IsNotFound(err) {
-			return false, nil
-		}
-		return false, err
-	}
-
-	for _, resource := range resources.APIResources {
-		if resource.Kind == kind {
-			return true, nil
-		}
-	}
-
-	return false, nil
-}
diff --git a/pkg/util/kubernetes/discovery.go b/pkg/util/kubernetes/discovery.go
new file mode 100644
index 0000000..4f90696
--- /dev/null
+++ b/pkg/util/kubernetes/discovery.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.
+*/
+
+package kubernetes
+
+import (
+	"k8s.io/apimachinery/pkg/api/errors"
+
+	"github.com/apache/camel-k/pkg/client"
+)
+func IsAPIResourceInstalled(c client.Client, groupVersion string, kind string) (bool, error) {
+	resources, err := c.Discovery().ServerResourcesForGroupVersion(groupVersion)
+	if err != nil {
+		if errors.IsNotFound(err) {
+			return false, nil
+		}
+		return false, err
+	}
+
+	for _, resource := range resources.APIResources {
+		if resource.Kind == kind {
+			return true, nil
+		}
+	}
+
+	return false, nil
+}


[camel-k] 02/02: chore: Improve ServiceBinding watch error handling

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

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

commit cfa0f7fa58ec33d4283cea064665f11f249946b4
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Wed Feb 10 12:38:32 2021 +0100

    chore: Improve ServiceBinding watch error handling
---
 pkg/controller/integration/integration_controller.go | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go
index 52cae9d..4708aa8 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -221,16 +221,16 @@ func add(mgr manager.Manager, r reconcile.Reconciler, c client.Client) error {
 		return err
 	}
 
-
 	// Check the ServiceBinding CRD is present
-	if ok, err := kubernetes.IsAPIResourceInstalled(c, "operators.coreos.com/v1alpha1", reflect.TypeOf(sb.ServiceBinding{}).Name()); err != nil {
+	serviceBindingKind := reflect.TypeOf(sb.ServiceBinding{}).Name()
+	if ok, err := kubernetes.IsAPIResourceInstalled(c, sb.SchemeGroupVersion.String(), serviceBindingKind); err != nil {
 		return err
 	} else if !ok {
 		log.Info("Service binding is disabled, install the Service Binding Operator if needed")
-	} else if ok, err := kubernetes.CheckPermission(context.TODO(), c, "operators.coreos.com", "ServiceBinding", "", "", "create"); err != nil {
-		log.Error(err, "cannot check permissions for watching ServiceBindings")
+	} else if ok, err := kubernetes.CheckPermission(context.TODO(), c, sb.SchemeGroupVersion.Group, serviceBindingKind, "", "", "create"); err != nil {
+		return err
 	} else if !ok {
-		log.Info("ServiceBinding monitoring is disabled, install Service Binding Operator before camel-k if needed")
+		log.Info("Service binding is disabled, the operator is not granted permission to create ServiceBindings!")
 	} else {
 		// Watch ServiceBindings and enqueue owning Integrations
 		err = ctrl.Watch(&source.Kind{Type: &sb.ServiceBinding{}}, &handler.EnqueueRequestForOwner{