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

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

commit 735f0161f05e2324776527ef7c0562208bfecf07
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Wed Jul 27 11:59:38 2022 +0200

    fix(trait): camel to use a single properties file
    
    Closes #3458
---
 e2e/global/common/kamelet_binding_test.go | 151 ++++++++++++++++++++----------
 pkg/trait/camel.go                        |  50 ++--------
 2 files changed, 111 insertions(+), 90 deletions(-)

diff --git a/e2e/global/common/kamelet_binding_test.go 
b/e2e/global/common/kamelet_binding_test.go
index 2c88d4e2c..ab290295b 100644
--- a/e2e/global/common/kamelet_binding_test.go
+++ b/e2e/global/common/kamelet_binding_test.go
@@ -33,62 +33,91 @@ import (
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 )
 
-func TestErrorHandler(t *testing.T) {
+func TestKameletBinding(t *testing.T) {
        WithNewTestNamespace(t, func(ns string) {
-               operatorID := "camel-k-kamelet-errorhandler"
+               operatorID := "camel-k-kameletbinding"
                Expect(KamelInstallWithID(operatorID, 
ns).Execute()).To(Succeed())
 
-               Expect(createErrorProducerKamelet(ns, 
"my-own-error-producer-source")()).To(Succeed())
-               Expect(createLogKamelet(ns, "my-own-log-sink")()).To(Succeed())
-               from := corev1.ObjectReference{
-                       Kind:       "Kamelet",
-                       Name:       "my-own-error-producer-source",
-                       APIVersion: v1alpha1.SchemeGroupVersion.String(),
-               }
-
-               to := corev1.ObjectReference{
-                       Kind:       "Kamelet",
-                       Name:       "my-own-log-sink",
-                       APIVersion: v1alpha1.SchemeGroupVersion.String(),
-               }
-
-               errorHandler := map[string]interface{}{
-                       "sink": map[string]interface{}{
-                               "endpoint": map[string]interface{}{
-                                       "ref": map[string]string{
-                                               "kind":       "Kamelet",
-                                               "apiVersion": 
v1alpha1.SchemeGroupVersion.String(),
-                                               "name":       "my-own-log-sink",
-                                       },
-                                       "properties": map[string]string{
-                                               "loggerName": 
"kameletErrorHandler",
-                                       },
-                               }}}
-
-               t.Run("throw error test", func(t *testing.T) {
+               // Error Handler testing
+               t.Run("test error handler", func(t *testing.T) {
                        RegisterTestingT(t)
-
-                       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"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
-                       Eventually(IntegrationLogs(ns, "throw-error-binding"), 
TestTimeoutShort).Should(ContainSubstring("kameletErrorHandler"))
-                       Eventually(IntegrationLogs(ns, "throw-error-binding"), 
TestTimeoutShort).ShouldNot(ContainSubstring("integrationLogger"))
-
+                       Expect(createErrorProducerKamelet(ns, 
"my-own-error-producer-source")()).To(Succeed())
+                       Expect(createLogKamelet(ns, 
"my-own-log-sink")()).To(Succeed())
+                       from := corev1.ObjectReference{
+                               Kind:       "Kamelet",
+                               Name:       "my-own-error-producer-source",
+                               APIVersion: 
v1alpha1.SchemeGroupVersion.String(),
+                       }
+
+                       to := corev1.ObjectReference{
+                               Kind:       "Kamelet",
+                               Name:       "my-own-log-sink",
+                               APIVersion: 
v1alpha1.SchemeGroupVersion.String(),
+                       }
+
+                       errorHandler := map[string]interface{}{
+                               "sink": map[string]interface{}{
+                                       "endpoint": map[string]interface{}{
+                                               "ref": map[string]string{
+                                                       "kind":       "Kamelet",
+                                                       "apiVersion": 
v1alpha1.SchemeGroupVersion.String(),
+                                                       "name":       
"my-own-log-sink",
+                                               },
+                                               "properties": map[string]string{
+                                                       "loggerName": 
"kameletErrorHandler",
+                                               },
+                                       }}}
+
+                       t.Run("throw error test", func(t *testing.T) {
+                               RegisterTestingT(t)
+
+                               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"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+                               Eventually(IntegrationLogs(ns, 
"throw-error-binding"), 
TestTimeoutShort).Should(ContainSubstring("kameletErrorHandler"))
+                               Eventually(IntegrationLogs(ns, 
"throw-error-binding"), 
TestTimeoutShort).ShouldNot(ContainSubstring("integrationLogger"))
+
+                       })
+
+                       t.Run("don't throw error test", func(t *testing.T) {
+                               RegisterTestingT(t)
+
+                               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"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+                               Eventually(IntegrationLogs(ns, 
"no-error-binding"), 
TestTimeoutShort).ShouldNot(ContainSubstring("kameletErrorHandler"))
+                               Eventually(IntegrationLogs(ns, 
"no-error-binding"), 
TestTimeoutShort).Should(ContainSubstring("integrationLogger"))
+
+                       })
+
+                       // Cleanup
+                       Expect(Kamel("delete", "--all", "-n", 
ns).Execute()).Should(BeNil())
                })
 
-               t.Run("don't throw error test", func(t *testing.T) {
+               // Kamelet binding with traits testing
+               t.Run("test kamelet binding with trait", func(t *testing.T) {
                        RegisterTestingT(t)
-
-                       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"), 
TestTimeoutLong).Should(Equal(corev1.PodRunning))
-                       Eventually(IntegrationLogs(ns, "no-error-binding"), 
TestTimeoutShort).ShouldNot(ContainSubstring("kameletErrorHandler"))
-                       Eventually(IntegrationLogs(ns, "no-error-binding"), 
TestTimeoutShort).Should(ContainSubstring("integrationLogger"))
-
+                       Expect(createTimerKamelet(ns, 
"my-own-timer-source")()).To(Succeed())
+                       // Log sink kamelet exists from previous test
+
+                       from := corev1.ObjectReference{
+                               Kind:       "Kamelet",
+                               Name:       "my-own-timer-source",
+                               APIVersion: 
v1alpha1.SchemeGroupVersion.String(),
+                       }
+
+                       to := corev1.ObjectReference{
+                               Kind:       "Kamelet",
+                               Name:       "my-own-log-sink",
+                               APIVersion: 
v1alpha1.SchemeGroupVersion.String(),
+                       }
+
+                       Expect(BindKameletTo(ns, "kb-with-traits", 
map[string]string{"trait.camel.apache.org/camel.properties": 
"[\"camel.prop1=a\",\"camel.prop2=b\"]"}, from, to, 
map[string]string{"message": "hello from test"}, 
map[string]string{"loggerName": "integrationLogger"})()).To(Succeed())
+
+                       Eventually(IntegrationPodPhase(ns, "kb-with-traits"), 
TestTimeoutLong).Should(Equal(corev1.PodRunning))
+                       Eventually(IntegrationLogs(ns, "kb-with-traits"), 
TestTimeoutShort).Should(ContainSubstring("hello from test"))
+                       Eventually(IntegrationLogs(ns, "kb-with-traits"), 
TestTimeoutShort).Should(ContainSubstring("integrationLogger"))
                })
-
-               // Cleanup
-               Expect(Kamel("delete", "--all", "-n", 
ns).Execute()).Should(BeNil())
        })
 }
 
@@ -143,3 +172,29 @@ func createErrorProducerKamelet(ns string, name string) 
func() error {
 
        return CreateKamelet(ns, name, flow, props, nil)
 }
+
+func createTimerKamelet(ns string, name string) func() error {
+       props := map[string]v1alpha1.JSONSchemaProp{
+               "message": {
+                       Type: "string",
+               },
+       }
+
+       flow := map[string]interface{}{
+               "from": map[string]interface{}{
+                       "uri": "timer:tick",
+                       "steps": []map[string]interface{}{
+                               {
+                                       "set-body": map[string]interface{}{
+                                               "constant": "{{message}}",
+                                       },
+                               },
+                               {
+                                       "to": "kamelet:sink",
+                               },
+                       },
+               },
+       }
+
+       return CreateKamelet(ns, name, flow, props, nil)
+}
diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index 671cee6ba..17f847560 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -79,10 +79,6 @@ func (t *camelTrait) Apply(e *Environment) error {
        if e.IntegrationKitInPhase(v1.IntegrationKitPhaseReady) && 
e.IntegrationInRunningPhases() {
                // Get all resources
                maps := t.computeConfigMaps(e)
-               if t.Properties != nil {
-                       // Only user.properties
-                       maps = append(maps, t.computeUserProperties(e)...)
-               }
                e.Resources.AddAll(maps)
        }
 
@@ -179,6 +175,14 @@ func (t *camelTrait) computeConfigMaps(e *Environment) 
[]ctrl.Object {
                userProperties += fmt.Sprintf("%s=%s\n", prop.Name, prop.Value)
        }
 
+       if t.Properties != nil {
+               // Merge with properties set in the trait
+               for _, prop := range t.Properties {
+                       k, v := property.SplitPropertyFileEntry(prop)
+                       userProperties += fmt.Sprintf("%s=%s\n", k, v)
+               }
+       }
+
        if userProperties != "" {
                maps = append(
                        maps,
@@ -283,41 +287,3 @@ func (t *camelTrait) computeConfigMaps(e *Environment) 
[]ctrl.Object {
 
        return maps
 }
-
-func (t *camelTrait) computeUserProperties(e *Environment) []ctrl.Object {
-       maps := make([]ctrl.Object, 0)
-
-       // combine properties of integration with kit, integration
-       // properties have the priority
-       userProperties := ""
-
-       for _, prop := range t.Properties {
-               k, v := property.SplitPropertyFileEntry(prop)
-               userProperties += fmt.Sprintf("%s=%s\n", k, v)
-       }
-
-       if userProperties != "" {
-               maps = append(
-                       maps,
-                       &corev1.ConfigMap{
-                               TypeMeta: metav1.TypeMeta{
-                                       Kind:       "ConfigMap",
-                                       APIVersion: "v1",
-                               },
-                               ObjectMeta: metav1.ObjectMeta{
-                                       Name:      e.Integration.Name + 
"-user-properties",
-                                       Namespace: e.Integration.Namespace,
-                                       Labels: map[string]string{
-                                               v1.IntegrationLabel:            
    e.Integration.Name,
-                                               
"camel.apache.org/properties.type": "user",
-                                       },
-                               },
-                               Data: map[string]string{
-                                       "application.properties": 
userProperties,
-                               },
-                       },
-               )
-       }
-
-       return maps
-}

Reply via email to