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

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

commit 569fa13ed9972421daa66c6f3d374e4c56f9e789
Author: Tadayoshi Sato <[email protected]>
AuthorDate: Tue Jul 26 00:17:36 2022 +0900

    fix(trait): fix kameletbinding traits merge on integration
---
 go.mod                                         |   4 +-
 go.sum                                         |   6 +-
 pkg/apis/camel/go.mod                          |   4 +-
 pkg/apis/camel/go.sum                          |   8 +-
 pkg/apis/camel/v1/common_types_support.go      |  40 ++++++++
 pkg/apis/camel/v1/common_types_support_test.go | 131 +++++++++++++++++++++++++
 pkg/client/camel/go.mod                        |   5 +-
 pkg/client/camel/go.sum                        |   8 +-
 pkg/controller/kameletbinding/integration.go   |   4 +-
 pkg/kamelet/repository/go.mod                  |   5 +-
 pkg/kamelet/repository/go.sum                  |   8 +-
 11 files changed, 208 insertions(+), 15 deletions(-)

diff --git a/go.mod b/go.mod
index df0000a5c..9af171225 100644
--- a/go.mod
+++ b/go.mod
@@ -57,7 +57,7 @@ require (
        k8s.io/gengo v0.0.0-20211129171323-c02415ce4185
        k8s.io/klog/v2 v2.40.1
        k8s.io/kubectl v0.22.5
-       k8s.io/utils v0.0.0-20211208161948-7d6a63dca704
+       k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e
        knative.dev/eventing v0.30.3
        knative.dev/pkg v0.0.0-20220301181942-2fdd5f232e77
        knative.dev/serving v0.30.0
@@ -111,7 +111,7 @@ require (
        github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
        github.com/hashicorp/golang-lru v0.5.4 // indirect
        github.com/hashicorp/hcl v1.0.0 // indirect
-       github.com/imdario/mergo v0.3.12 // indirect
+       github.com/imdario/mergo v0.3.13 // indirect
        github.com/inconshreveable/mousetrap v1.0.0 // indirect
        github.com/json-iterator/go v1.1.12 // indirect
        github.com/kelseyhightower/envconfig v1.4.0 // indirect
diff --git a/go.sum b/go.sum
index 3a4c4fa9f..ea70353e5 100644
--- a/go.sum
+++ b/go.sum
@@ -799,8 +799,9 @@ github.com/imdario/mergo v0.3.8/go.mod 
h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
 github.com/imdario/mergo v0.3.9/go.mod 
h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.10/go.mod 
h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/imdario/mergo v0.3.11/go.mod 
h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/imdario/mergo v0.3.12 
h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 github.com/imdario/mergo v0.3.12/go.mod 
h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/imdario/mergo v0.3.13 
h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
+github.com/imdario/mergo v0.3.13/go.mod 
h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
 github.com/inconshreveable/mousetrap v1.0.0 
h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod 
h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/influxdata/tdigest v0.0.0-20180711151920-a7d76c6f093a/go.mod 
h1:9GkyshztGufsdPQWjH+ifgnIr3xNUL5syI70g2dzU1o=
@@ -2137,8 +2138,9 @@ k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20211208161948-7d6a63dca704 
h1:ZKMMxTvduyf5WUtREOqg5LiXaN1KO/+0oOQPRFrClpo=
 k8s.io/utils v0.0.0-20211208161948-7d6a63dca704/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e 
h1:W1yba+Bpkwb5BatGKZALQ1yylhwnuD6CkYmrTibyLDM=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 knative.dev/caching v0.0.0-20220302153644-5a6403ef2de5/go.mod 
h1:52//2yvw0iO3Nu2duAMI5BzfQKHWiXZuvRvzaypoGkU=
 knative.dev/eventing v0.30.3 h1:phw3Uw/iSQGo3BJokCbfb0+zpbwwbYdg2w+UKE46lk0=
 knative.dev/eventing v0.30.3/go.mod 
h1:JCqC8evTls1WiBTmYhPEGME6OQD8HFnLQjFPImwOEOg=
diff --git a/pkg/apis/camel/go.mod b/pkg/apis/camel/go.mod
index d825b8b33..8b6e3d2a3 100644
--- a/pkg/apis/camel/go.mod
+++ b/pkg/apis/camel/go.mod
@@ -3,9 +3,11 @@ module github.com/apache/camel-k/pkg/apis/camel
 go 1.17
 
 require (
+       github.com/imdario/mergo v0.3.13
        github.com/stretchr/testify v1.7.0
        k8s.io/api v0.22.5
        k8s.io/apimachinery v0.22.5
+       k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e
 )
 
 require (
@@ -22,7 +24,7 @@ require (
        golang.org/x/text v0.3.6 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/yaml.v2 v2.4.0 // indirect
-       gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
+       gopkg.in/yaml.v3 v3.0.0 // indirect
        k8s.io/klog/v2 v2.9.0 // indirect
        sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
 )
diff --git a/pkg/apis/camel/go.sum b/pkg/apis/camel/go.sum
index 4c4d03587..20a0319db 100644
--- a/pkg/apis/camel/go.sum
+++ b/pkg/apis/camel/go.sum
@@ -54,6 +54,8 @@ github.com/googleapis/gnostic v0.5.1/go.mod 
h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2c
 github.com/googleapis/gnostic v0.5.5/go.mod 
h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 github.com/gorilla/websocket v1.4.2/go.mod 
h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/imdario/mergo v0.3.13 
h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
+github.com/imdario/mergo v0.3.13/go.mod 
h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
 github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.11 
h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 github.com/json-iterator/go v1.1.11/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -91,6 +93,7 @@ github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pmezard/go-difflib v1.0.0 
h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/spf13/afero v1.2.2/go.mod 
h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod 
h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
@@ -201,8 +204,9 @@ gopkg.in/yaml.v2 v2.4.0 
h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b 
h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
+gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 k8s.io/api v0.22.5 h1:xk7C+rMjF/EGELiD560jdmwzrB788mfcHiNbMQLIVI8=
@@ -214,6 +218,8 @@ k8s.io/klog/v2 v2.0.0/go.mod 
h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod 
h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e 
h1:W1yba+Bpkwb5BatGKZALQ1yylhwnuD6CkYmrTibyLDM=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod 
h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2 
h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod 
h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
diff --git a/pkg/apis/camel/v1/common_types_support.go 
b/pkg/apis/camel/v1/common_types_support.go
index 7f071a834..1726b5c4b 100644
--- a/pkg/apis/camel/v1/common_types_support.go
+++ b/pkg/apis/camel/v1/common_types_support.go
@@ -24,6 +24,8 @@ import (
        "strings"
 
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+       "github.com/imdario/mergo"
 )
 
 func (in *Artifact) String() string {
@@ -59,6 +61,44 @@ func (p TraitProfile) Equal(other TraitProfile) bool {
        return strings.EqualFold(string(p), string(other))
 }
 
+// Merge merges the given Traits into the receiver.
+func (t *Traits) Merge(other Traits) error {
+       // marshal both
+       data1, err := json.Marshal(t)
+       if err != nil {
+               return err
+       }
+       data2, err := json.Marshal(other)
+       if err != nil {
+               return err
+       }
+
+       // merge them
+       map1 := make(map[string]interface{})
+       if err := json.Unmarshal(data1, &map1); err != nil {
+               return err
+       }
+       map2 := make(map[string]interface{})
+       if err := json.Unmarshal(data2, &map2); err != nil {
+               return err
+       }
+       // values from merged trait take precedence over the original ones
+       if err := mergo.Merge(&map1, map2, mergo.WithOverride); err != nil {
+               return err
+       }
+
+       // unmarshal it
+       data, err := json.Marshal(map1)
+       if err != nil {
+               return err
+       }
+       if err = json.Unmarshal(data, &t); err != nil {
+               return err
+       }
+
+       return nil
+}
+
 // MarshalJSON returns m as the JSON encoding of m.
 func (m RawMessage) MarshalJSON() ([]byte, error) {
        if m == nil {
diff --git a/pkg/apis/camel/v1/common_types_support_test.go 
b/pkg/apis/camel/v1/common_types_support_test.go
new file mode 100644
index 000000000..e46455493
--- /dev/null
+++ b/pkg/apis/camel/v1/common_types_support_test.go
@@ -0,0 +1,131 @@
+/*
+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 v1
+
+import (
+       "encoding/json"
+       "testing"
+
+       "github.com/apache/camel-k/pkg/apis/camel/v1/trait"
+
+       "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
+       "k8s.io/utils/pointer"
+)
+
+func TestTraitsMerge(t *testing.T) {
+       t1 := Traits{
+               Container: &trait.ContainerTrait{
+                       Trait: trait.Trait{
+                               Configuration: configurationFromMap(t, 
map[string]interface{}{
+                                       "name": "test-container",
+                               }),
+                       },
+                       Auto:        pointer.Bool(false),
+                       ServicePort: 81,
+               },
+               Logging: &trait.LoggingTrait{
+                       Color: pointer.Bool(false),
+                       Level: "INFO",
+               },
+               Addons: map[string]AddonTrait{
+                       "master": toAddonTrait(t, map[string]interface{}{
+                               "resourceName": "test-lock",
+                       }),
+                       "tracing": toAddonTrait(t, map[string]interface{}{
+                               "enabled": true,
+                       }),
+               },
+       }
+       t2 := Traits{
+               Container: &trait.ContainerTrait{
+                       Trait: trait.Trait{
+                               Configuration: configurationFromMap(t, 
map[string]interface{}{
+                                       "port": 8081,
+                               }),
+                       },
+                       PortName: "http-8081",
+               },
+               Logging: &trait.LoggingTrait{
+                       Color: pointer.Bool(true),
+                       Level: "DEBUG",
+               },
+               Addons: map[string]AddonTrait{
+                       "tracing": toAddonTrait(t, map[string]interface{}{
+                               "serviceName": "test-integration",
+                       }),
+               },
+       }
+
+       err := t1.Merge(t2)
+
+       require.NoError(t, err)
+
+       assert.NotNil(t, t1.Container)
+       assert.False(t, pointer.BoolDeref(t1.Container.Auto, true))
+       assert.Equal(t, "http-8081", t1.Container.PortName)
+       assert.Equal(t, 81, t1.Container.ServicePort)
+       assert.Equal(t,
+               configurationFromMap(t, map[string]interface{}{
+                       "name": "test-container",
+                       "port": 8081,
+               }),
+               t1.Container.Configuration)
+
+       // values from merged trait take precedence over the original ones
+       assert.NotNil(t, t1.Logging)
+       assert.True(t, pointer.BoolDeref(t1.Logging.Color, false))
+       assert.Equal(t, "DEBUG", t1.Logging.Level)
+
+       assert.NotNil(t, t1.Addons)
+       assert.Equal(t,
+               toAddonTrait(t, map[string]interface{}{
+                       "resourceName": "test-lock",
+               }),
+               t1.Addons["master"])
+       assert.Equal(t,
+               toAddonTrait(t, map[string]interface{}{
+                       "enabled":     true,
+                       "serviceName": "test-integration",
+               }),
+               t1.Addons["tracing"])
+}
+
+func configurationFromMap(t *testing.T, configMap map[string]interface{}) 
*trait.Configuration {
+       t.Helper()
+
+       data, err := json.Marshal(configMap)
+       require.NoError(t, err)
+
+       return &trait.Configuration{
+               RawMessage: data,
+       }
+}
+
+func toAddonTrait(t *testing.T, config map[string]interface{}) AddonTrait {
+       t.Helper()
+
+       data, err := json.Marshal(config)
+       require.NoError(t, err)
+
+       var addon AddonTrait
+       err = json.Unmarshal(data, &addon)
+       require.NoError(t, err)
+
+       return addon
+}
diff --git a/pkg/client/camel/go.mod b/pkg/client/camel/go.mod
index 9e5ed510a..2217e517e 100644
--- a/pkg/client/camel/go.mod
+++ b/pkg/client/camel/go.mod
@@ -18,6 +18,7 @@ require (
        github.com/google/go-cmp v0.5.5 // indirect
        github.com/google/gofuzz v1.1.0 // indirect
        github.com/googleapis/gnostic v0.5.5 // indirect
+       github.com/imdario/mergo v0.3.13 // indirect
        github.com/json-iterator/go v1.1.11 // indirect
        github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // 
indirect
        github.com/modern-go/reflect2 v1.0.1 // indirect
@@ -32,10 +33,10 @@ require (
        google.golang.org/protobuf v1.26.0 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/yaml.v2 v2.4.0 // indirect
-       gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
+       gopkg.in/yaml.v3 v3.0.0 // indirect
        k8s.io/klog/v2 v2.9.0 // indirect
        k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c // indirect
-       k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect
+       k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e // indirect
        sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
        sigs.k8s.io/yaml v1.2.0 // indirect
 )
diff --git a/pkg/client/camel/go.sum b/pkg/client/camel/go.sum
index 5042fd6e3..64887de67 100644
--- a/pkg/client/camel/go.sum
+++ b/pkg/client/camel/go.sum
@@ -125,6 +125,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
 github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod 
h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod 
h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.13 
h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
+github.com/imdario/mergo v0.3.13/go.mod 
h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
 github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.11 
h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 github.com/json-iterator/go v1.1.11/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -419,8 +421,9 @@ gopkg.in/yaml.v2 v2.4.0 
h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b 
h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
+gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -439,8 +442,9 @@ k8s.io/klog/v2 v2.9.0 
h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c 
h1:jvamsI1tn9V0S8jicyX82qaFC0H/NKxv2e5mbqsgR80=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod 
h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a 
h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g=
 k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e 
h1:W1yba+Bpkwb5BatGKZALQ1yylhwnuD6CkYmrTibyLDM=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod 
h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/pkg/controller/kameletbinding/integration.go 
b/pkg/controller/kameletbinding/integration.go
index cde6da195..3f988d595 100644
--- a/pkg/controller/kameletbinding/integration.go
+++ b/pkg/controller/kameletbinding/integration.go
@@ -213,7 +213,9 @@ func configureBinding(integration *v1.Integration, bindings 
...*bindings.Binding
                if b == nil {
                        continue
                }
-               integration.Spec.Traits = b.Traits
+               if err := integration.Spec.Traits.Merge(b.Traits); err != nil {
+                       return err
+               }
                for k, v := range b.ApplicationProperties {
                        entry, err := property.EncodePropertyFileEntry(k, v)
                        if err != nil {
diff --git a/pkg/kamelet/repository/go.mod b/pkg/kamelet/repository/go.mod
index 1c7f75d57..05ff34bed 100644
--- a/pkg/kamelet/repository/go.mod
+++ b/pkg/kamelet/repository/go.mod
@@ -22,6 +22,7 @@ require (
        github.com/google/go-querystring v1.0.0 // indirect
        github.com/google/gofuzz v1.1.0 // indirect
        github.com/googleapis/gnostic v0.5.5 // indirect
+       github.com/imdario/mergo v0.3.13 // indirect
        github.com/json-iterator/go v1.1.11 // indirect
        github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // 
indirect
        github.com/modern-go/reflect2 v1.0.1 // indirect
@@ -37,12 +38,12 @@ require (
        google.golang.org/protobuf v1.26.0 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/yaml.v2 v2.4.0 // indirect
-       gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
+       gopkg.in/yaml.v3 v3.0.0 // indirect
        k8s.io/api v0.22.5 // indirect
        k8s.io/client-go v0.22.5 // indirect
        k8s.io/klog/v2 v2.9.0 // indirect
        k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c // indirect
-       k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect
+       k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e // indirect
        sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
        sigs.k8s.io/yaml v1.2.0 // indirect
 )
diff --git a/pkg/kamelet/repository/go.sum b/pkg/kamelet/repository/go.sum
index f81275cbe..3f115878d 100644
--- a/pkg/kamelet/repository/go.sum
+++ b/pkg/kamelet/repository/go.sum
@@ -129,6 +129,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
 github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod 
h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod 
h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.13 
h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
+github.com/imdario/mergo v0.3.13/go.mod 
h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
 github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.11 
h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 github.com/json-iterator/go v1.1.11/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -424,8 +426,9 @@ gopkg.in/yaml.v2 v2.4.0 
h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b 
h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
+gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -444,8 +447,9 @@ k8s.io/klog/v2 v2.9.0 
h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c 
h1:jvamsI1tn9V0S8jicyX82qaFC0H/NKxv2e5mbqsgR80=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod 
h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a 
h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g=
 k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e 
h1:W1yba+Bpkwb5BatGKZALQ1yylhwnuD6CkYmrTibyLDM=
+k8s.io/utils v0.0.0-20220713171938-56c0de1e6f5e/go.mod 
h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod 
h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

Reply via email to