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,