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 2022/03/09 13:33:42 UTC

[camel-k] branch main updated (d178b66 -> 0ce1c47)

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

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


    from d178b66  Fix script name for set version: from set-version to set_version
     new faa9138  fix: The KameletBinding readiness condition should mirror its Integration one
     new 0ce1c47  chore(e2e): Add KameletBinding readiness condition e2e tests

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:
 e2e/common/kamelet_binding_test.go                 |  4 +-
 e2e/common/scale_binding_test.go                   |  8 ++--
 e2e/knative/kamelet_test.go                        | 47 ++++++++++++++++++--
 e2e/support/test_support.go                        | 37 ++++++++++++++--
 .../kameletbinding/{common.go => integration.go}   | 11 +++--
 pkg/controller/kameletbinding/monitor.go           | 50 ++++++++++++++--------
 6 files changed, 122 insertions(+), 35 deletions(-)
 rename pkg/controller/kameletbinding/{common.go => integration.go} (98%)

[camel-k] 01/02: fix: The KameletBinding readiness condition should mirror its Integration one

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

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

commit faa9138ae0ec36d3b05eb3e28079f1e9a71ad044
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Tue Mar 8 16:36:41 2022 +0100

    fix: The KameletBinding readiness condition should mirror its Integration one
---
 .../kameletbinding/{common.go => integration.go}   | 11 +++--
 pkg/controller/kameletbinding/monitor.go           | 50 ++++++++++++++--------
 2 files changed, 40 insertions(+), 21 deletions(-)

diff --git a/pkg/controller/kameletbinding/common.go b/pkg/controller/kameletbinding/integration.go
similarity index 98%
rename from pkg/controller/kameletbinding/common.go
rename to pkg/controller/kameletbinding/integration.go
index cf9ec2b..1f66e5d 100644
--- a/pkg/controller/kameletbinding/common.go
+++ b/pkg/controller/kameletbinding/integration.go
@@ -22,6 +22,11 @@ import (
 	"encoding/json"
 	"sort"
 
+	"github.com/pkg/errors"
+
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	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"
@@ -31,9 +36,6 @@ import (
 	"github.com/apache/camel-k/pkg/util/knative"
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 	"github.com/apache/camel-k/pkg/util/property"
-	"github.com/pkg/errors"
-	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 var (
@@ -45,7 +47,8 @@ func CreateIntegrationFor(ctx context.Context, c client.Client, kameletbinding *
 	controller := true
 	blockOwnerDeletion := true
 	annotations := util.CopyMap(kameletbinding.Annotations)
-	delete(annotations, v1alpha1.AnnotationIcon) // avoid propagating the icon to the integration as it's heavyweight and not needed
+	// avoid propagating the icon to the integration as it's heavyweight and not needed
+	delete(annotations, v1alpha1.AnnotationIcon)
 
 	it := v1.Integration{
 		ObjectMeta: metav1.ObjectMeta{
diff --git a/pkg/controller/kameletbinding/monitor.go b/pkg/controller/kameletbinding/monitor.go
index e92c35a..75cd342 100644
--- a/pkg/controller/kameletbinding/monitor.go
+++ b/pkg/controller/kameletbinding/monitor.go
@@ -19,17 +19,21 @@ package kameletbinding
 
 import (
 	"context"
+	"fmt"
 
-	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/pkg/errors"
+
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/equality"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+
 	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 )
 
-// NewMonitorAction returns an action that monitors the kamelet binding after it's fully initialized.
+// NewMonitorAction returns an action that monitors the KameletBinding after it's fully initialized.
 func NewMonitorAction() Action {
 	return &monitorAction{}
 }
@@ -89,32 +93,26 @@ func (action *monitorAction) Handle(ctx context.Context, kameletbinding *v1alpha
 		return target, nil
 	}
 
-	// Map integration phases to KameletBinding phases
+	// Map integration phase and conditions to KameletBinding
 	target := kameletbinding.DeepCopy()
+
 	switch it.Status.Phase {
+
 	case v1.IntegrationPhaseRunning:
 		target.Status.Phase = v1alpha1.KameletBindingPhaseReady
-		target.Status.SetCondition(
-			v1alpha1.KameletBindingConditionReady,
-			corev1.ConditionTrue,
-			"",
-			"",
-		)
+		setKameletBindingReadyCondition(target, &it)
+
 	case v1.IntegrationPhaseError:
 		target.Status.Phase = v1alpha1.KameletBindingPhaseError
-		target.Status.SetCondition(
-			v1alpha1.KameletBindingConditionReady,
-			corev1.ConditionFalse,
-			string(target.Status.Phase),
-			"",
-		)
+		setKameletBindingReadyCondition(target, &it)
+
 	default:
 		target.Status.Phase = v1alpha1.KameletBindingPhaseCreating
 		target.Status.SetCondition(
 			v1alpha1.KameletBindingConditionReady,
 			corev1.ConditionFalse,
 			string(target.Status.Phase),
-			"",
+			fmt.Sprintf("Integration %q is in %q phase", it.GetName(), target.Status.Phase),
 		)
 	}
 
@@ -124,3 +122,21 @@ func (action *monitorAction) Handle(ctx context.Context, kameletbinding *v1alpha
 
 	return target, nil
 }
+
+func setKameletBindingReadyCondition(kb *v1alpha1.KameletBinding, it *v1.Integration) {
+	if condition := it.Status.GetCondition(v1.IntegrationConditionReady); condition != nil {
+		kb.Status.SetCondition(
+			v1alpha1.KameletBindingConditionReady,
+			condition.Status,
+			condition.Reason,
+			fmt.Sprintf("Integration %q readiness condition is %q", it.GetName(), condition.Status),
+		)
+	} else {
+		kb.Status.SetCondition(
+			v1alpha1.KameletBindingConditionReady,
+			corev1.ConditionUnknown,
+			"",
+			fmt.Sprintf("Integration %q does not have a readiness condition", it.GetName()),
+		)
+	}
+}

[camel-k] 02/02: chore(e2e): Add KameletBinding readiness condition e2e tests

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

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

commit 0ce1c472f34b373990628700b331b1e31150ad4f
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Wed Mar 9 11:41:47 2022 +0100

    chore(e2e): Add KameletBinding readiness condition e2e tests
---
 e2e/common/kamelet_binding_test.go |  4 ++--
 e2e/common/scale_binding_test.go   |  8 +++----
 e2e/knative/kamelet_test.go        | 47 ++++++++++++++++++++++++++++++++++----
 e2e/support/test_support.go        | 37 ++++++++++++++++++++++++++----
 4 files changed, 82 insertions(+), 14 deletions(-)

diff --git a/e2e/common/kamelet_binding_test.go b/e2e/common/kamelet_binding_test.go
index 7d68cb7..bc24f68 100644
--- a/e2e/common/kamelet_binding_test.go
+++ b/e2e/common/kamelet_binding_test.go
@@ -67,7 +67,7 @@ func TestErrorHandler(t *testing.T) {
 		t.Run("throw error test", func(t *testing.T) {
 			RegisterTestingT(t)
 
-			Expect(BindKameletToWithErrorHandler(ns, "throw-error-binding", from, to, map[string]string{"message": "throw Error"}, map[string]string{"loggerName": "integrationLogger"}, errorHandler)()).To(Succeed())
+			Expect(BindKameletToWithErrorHandler(ns, "throw-error-binding", map[string]string{}, from, to, map[string]string{"message": "throw Error"}, map[string]string{"loggerName": "integrationLogger"}, errorHandler)()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, "throw-error-binding"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 			Eventually(IntegrationLogs(ns, "throw-error-binding"), TestTimeoutShort).Should(ContainSubstring("kameletErrorHandler"))
@@ -78,7 +78,7 @@ func TestErrorHandler(t *testing.T) {
 		t.Run("don't throw error test", func(t *testing.T) {
 			RegisterTestingT(t)
 
-			Expect(BindKameletToWithErrorHandler(ns, "no-error-binding", from, to, map[string]string{"message": "true"}, map[string]string{"loggerName": "integrationLogger"}, errorHandler)()).To(Succeed())
+			Expect(BindKameletToWithErrorHandler(ns, "no-error-binding", map[string]string{}, from, to, map[string]string{"message": "true"}, map[string]string{"loggerName": "integrationLogger"}, errorHandler)()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, "no-error-binding"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 			Eventually(IntegrationLogs(ns, "no-error-binding"), TestTimeoutShort).ShouldNot(ContainSubstring("kameletErrorHandler"))
diff --git a/e2e/common/scale_binding_test.go b/e2e/common/scale_binding_test.go
index 3bbc2ee..649220d 100644
--- a/e2e/common/scale_binding_test.go
+++ b/e2e/common/scale_binding_test.go
@@ -54,7 +54,7 @@ func TestKameletBindingScale(t *testing.T) {
 		Expect(Kamel("bind", "timer-source?message=HelloBinding", "log-sink", "-n", ns, "--name", name).Execute()).To(Succeed())
 		Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
 		Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
-		Eventually(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
 		Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("HelloBinding"))
 
 		t.Run("Update binding scale spec", func(t *testing.T) {
@@ -71,7 +71,7 @@ func TestKameletBindingScale(t *testing.T) {
 			// Check the readiness condition becomes truthy back
 			Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutMedium).Should(Equal(corev1.ConditionTrue))
 			// Finally check the readiness condition becomes truthy back on kamelet binding
-			Eventually(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutMedium).Should(Equal(corev1.ConditionTrue))
+			Eventually(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutMedium).Should(Equal(corev1.ConditionTrue))
 		})
 
 		t.Run("Scale kamelet binding with polymorphic client", func(t *testing.T) {
@@ -85,7 +85,7 @@ func TestKameletBindingScale(t *testing.T) {
 			Expect(err).To(BeNil())
 
 			// Check the readiness condition is still truthy as down-scaling
-			Expect(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady)()).To(Equal(corev1.ConditionTrue))
+			Expect(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady)()).To(Equal(corev1.ConditionTrue))
 			// Check the Integration scale subresource Spec field
 			Eventually(IntegrationSpecReplicas(ns, name), TestTimeoutShort).
 				Should(gstruct.PointTo(BeNumerically("==", 2)))
@@ -116,7 +116,7 @@ func TestKameletBindingScale(t *testing.T) {
 			Expect(err).To(BeNil())
 
 			// Check the readiness condition is still truthy as down-scaling in kamelet binding
-			Expect(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady)()).To(Equal(corev1.ConditionTrue))
+			Expect(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady)()).To(Equal(corev1.ConditionTrue))
 			// Check the KameletBinding scale subresource Spec field
 			Eventually(KameletBindingSpecReplicas(ns, name), TestTimeoutShort).
 				Should(gstruct.PointTo(BeNumerically("==", 1)))
diff --git a/e2e/knative/kamelet_test.go b/e2e/knative/kamelet_test.go
index 7a68f6d..a0d8e33 100644
--- a/e2e/knative/kamelet_test.go
+++ b/e2e/knative/kamelet_test.go
@@ -23,6 +23,7 @@ limitations under the License.
 package knative
 
 import (
+	"fmt"
 	"testing"
 
 	. "github.com/onsi/gomega"
@@ -36,13 +37,15 @@ import (
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 )
 
-// Test that kamelet binding can be changed and changes propagated to integrations
+// Test that a KameletBinding can be changed and the changes are propagated to the Integration
 func TestKameletChange(t *testing.T) {
 	WithNewTestNamespace(t, func(ns string) {
 		Expect(Kamel("install", "-n", ns).Execute()).To(Succeed())
 		Expect(CreateTimerKamelet(ns, "timer-source")()).To(Succeed())
 		Expect(CreateKnativeChannel(ns, "messages")()).To(Succeed())
+
 		Expect(Kamel("run", "-n", ns, "files/display.groovy", "-w").Execute()).To(Succeed())
+
 		from := corev1.ObjectReference{
 			Kind:       "Kamelet",
 			APIVersion: v1alpha1.SchemeGroupVersion.String(),
@@ -54,15 +57,51 @@ func TestKameletChange(t *testing.T) {
 			Name:       "messages",
 			APIVersion: messaging.SchemeGroupVersion.String(),
 		}
-		Expect(BindKameletTo(ns, "timer-binding", from, to, map[string]string{"message": "message is Hello"}, map[string]string{})()).To(Succeed())
-		Eventually(IntegrationPodPhase(ns, "timer-binding"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+
+		name := "timer-binding"
+		annotations := map[string]string{
+			"trait.camel.apache.org/health.enabled":                 "true",
+			"trait.camel.apache.org/health.readiness-initial-delay": "10",
+		}
+
+		Expect(BindKameletTo(ns, name, annotations, from, to, map[string]string{"message": "message is Hello"}, map[string]string{})()).To(Succeed())
+
+		Eventually(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionFalse))
+		Eventually(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutMedium).Should(And(
+			WithTransform(KameletBindingConditionReason, Equal(v1.IntegrationConditionDeploymentProgressingReason)),
+			WithTransform(KameletBindingConditionMessage, Equal(fmt.Sprintf("Integration %q readiness condition is %q", name, corev1.ConditionFalse))),
+		))
+
+		Eventually(IntegrationPodPhase(ns, name), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 		Eventually(IntegrationConditionStatus(ns, "timer-binding", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
 		Eventually(IntegrationLogs(ns, "display"), TestTimeoutShort).Should(ContainSubstring("message is Hello"))
 
-		Expect(BindKameletTo(ns, "timer-binding", from, to, map[string]string{"message": "message is Hi"}, map[string]string{})()).To(Succeed())
+		Eventually(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutMedium).Should(And(
+			WithTransform(KameletBindingConditionReason, Equal(v1.IntegrationConditionDeploymentReadyReason)),
+			WithTransform(KameletBindingConditionMessage, Equal(fmt.Sprintf("Integration %q readiness condition is %q", name, corev1.ConditionTrue))),
+		))
+
+		// Update the KameletBinding
+		Expect(BindKameletTo(ns, "timer-binding", annotations, from, to, map[string]string{"message": "message is Hi"}, map[string]string{})()).To(Succeed())
+
+		Eventually(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionFalse))
+		Eventually(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutMedium).Should(And(
+			WithTransform(KameletBindingConditionReason, Equal(v1.IntegrationConditionDeploymentProgressingReason)),
+			WithTransform(KameletBindingConditionMessage, Equal(fmt.Sprintf("Integration %q readiness condition is %q", name, corev1.ConditionFalse))),
+		))
+
 		Eventually(IntegrationPodPhase(ns, "timer-binding"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 		Eventually(IntegrationConditionStatus(ns, "timer-binding", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
 		Eventually(IntegrationLogs(ns, "display"), TestTimeoutShort).Should(ContainSubstring("message is Hi"))
+
+		Eventually(KameletBindingConditionStatus(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(KameletBindingCondition(ns, name, v1alpha1.KameletBindingConditionReady), TestTimeoutMedium).
+			Should(And(
+				WithTransform(KameletBindingConditionReason, Equal(v1.IntegrationConditionDeploymentReadyReason)),
+				WithTransform(KameletBindingConditionMessage, Equal(fmt.Sprintf("Integration %q readiness condition is %q", name, corev1.ConditionTrue))),
+			))
+
 		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
 	})
 }
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index 81d3d8b..c57c081 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -758,7 +758,35 @@ func KameletBindingStatusReplicas(ns string, name string) func() *int32 {
 	}
 }
 
-func KameletBindingCondition(ns string, name string, conditionType v1alpha1.KameletBindingConditionType) func() corev1.ConditionStatus {
+func KameletBindingCondition(ns string, name string, conditionType v1alpha1.KameletBindingConditionType) func() *v1alpha1.KameletBindingCondition {
+	return func() *v1alpha1.KameletBindingCondition {
+		kb := KameletBinding(ns, name)()
+		if kb == nil {
+			return nil
+		}
+		c := kb.Status.GetCondition(conditionType)
+		if c == nil {
+			return nil
+		}
+		return c
+	}
+}
+
+func KameletBindingConditionReason(c *v1alpha1.KameletBindingCondition) string {
+	if c == nil {
+		return ""
+	}
+	return c.Reason
+}
+
+func KameletBindingConditionMessage(c *v1alpha1.KameletBindingCondition) string {
+	if c == nil {
+		return ""
+	}
+	return c.Message
+}
+
+func KameletBindingConditionStatus(ns string, name string, conditionType v1alpha1.KameletBindingConditionType) func() corev1.ConditionStatus {
 	return func() corev1.ConditionStatus {
 		klb := KameletBinding(ns, name)()
 		if klb == nil {
@@ -1566,13 +1594,14 @@ func CreateTimerKamelet(ns string, name string) func() error {
 	return CreateKamelet(ns, name, flow, props, nil)
 }
 
-func BindKameletTo(ns string, name string, from corev1.ObjectReference, to corev1.ObjectReference, sourceProperties map[string]string, sinkProperties map[string]string) func() error {
-	return BindKameletToWithErrorHandler(ns, name, from, to, sourceProperties, sinkProperties, nil)
+func BindKameletTo(ns string, name string, annotations map[string]string, from corev1.ObjectReference, to corev1.ObjectReference, sourceProperties map[string]string, sinkProperties map[string]string) func() error {
+	return BindKameletToWithErrorHandler(ns, name, annotations, from, to, sourceProperties, sinkProperties, nil)
 }
 
-func BindKameletToWithErrorHandler(ns string, name string, from corev1.ObjectReference, to corev1.ObjectReference, sourceProperties map[string]string, sinkProperties map[string]string, errorHandler map[string]interface{}) func() error {
+func BindKameletToWithErrorHandler(ns string, name string, annotations map[string]string, from corev1.ObjectReference, to corev1.ObjectReference, sourceProperties map[string]string, sinkProperties map[string]string, errorHandler map[string]interface{}) func() error {
 	return func() error {
 		kb := v1alpha1.NewKameletBinding(ns, name)
+		kb.Annotations = annotations
 		kb.Spec = v1alpha1.KameletBindingSpec{
 			Source: v1alpha1.Endpoint{
 				Ref:        &from,