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

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


The following commit(s) were added to refs/heads/master by this push:
     new eb4aecb  Add support for traits defaults #566
eb4aecb is described below

commit eb4aecb11e343a4fa983df51228756d3ac14fcb9
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Wed Mar 20 15:55:35 2019 +0100

    Add support for traits defaults #566
---
 pkg/apis/camel/v1alpha1/common_types.go            |  5 ++
 pkg/apis/camel/v1alpha1/common_types_support.go    | 21 ++++++
 pkg/apis/camel/v1alpha1/integration_types.go       | 25 +++-----
 .../camel/v1alpha1/integration_types_support.go    | 21 ------
 .../camel/v1alpha1/integrationcontext_types.go     | 12 ++--
 .../camel/v1alpha1/integrationplatform_types.go    |  1 +
 pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go   | 75 ++++++++++++++--------
 pkg/apis/camel/v1alpha1/zz_generated.defaults.go   | 32 +++++++++
 pkg/cmd/context_create.go                          |  4 +-
 pkg/cmd/run.go                                     |  4 +-
 pkg/trait/debug_test.go                            |  4 +-
 pkg/trait/environment_test.go                      |  4 +-
 pkg/trait/knative_service_vol_test.go              |  4 +-
 pkg/trait/owner_test.go                            |  2 +-
 pkg/trait/trait_catalog.go                         | 34 ++++++----
 pkg/trait/trait_test.go                            | 65 +++++++++++++++++--
 16 files changed, 216 insertions(+), 97 deletions(-)

diff --git a/pkg/apis/camel/v1alpha1/common_types.go 
b/pkg/apis/camel/v1alpha1/common_types.go
index be2fdf0..57bdac7 100644
--- a/pkg/apis/camel/v1alpha1/common_types.go
+++ b/pkg/apis/camel/v1alpha1/common_types.go
@@ -61,3 +61,8 @@ type FailureRecovery struct {
        AttemptMax  int         `json:"attemptMax"`
        AttemptTime metav1.Time `json:"attemptTime"`
 }
+
+// A TraitSpec contains the configuration of a trait
+type TraitSpec struct {
+       Configuration map[string]string `json:"configuration,omitempty"`
+}
diff --git a/pkg/apis/camel/v1alpha1/common_types_support.go 
b/pkg/apis/camel/v1alpha1/common_types_support.go
index 364150e..29c6ef1 100644
--- a/pkg/apis/camel/v1alpha1/common_types_support.go
+++ b/pkg/apis/camel/v1alpha1/common_types_support.go
@@ -20,6 +20,7 @@ package v1alpha1
 import (
        "fmt"
 
+       "github.com/mitchellh/mapstructure"
        yaml2 "gopkg.in/yaml.v2"
 )
 
@@ -39,3 +40,23 @@ func (flows Flows) Serialize() (string, error) {
        }
        return string(res), nil
 }
+
+// Decode the trait configuration to a type safe struct
+func (in *TraitSpec) Decode(target interface{}) error {
+       md := mapstructure.Metadata{}
+
+       decoder, err := mapstructure.NewDecoder(
+               &mapstructure.DecoderConfig{
+                       Metadata:         &md,
+                       WeaklyTypedInput: true,
+                       TagName:          "property",
+                       Result:           &target,
+               },
+       )
+
+       if err != nil {
+               return err
+       }
+
+       return decoder.Decode(in.Configuration)
+}
diff --git a/pkg/apis/camel/v1alpha1/integration_types.go 
b/pkg/apis/camel/v1alpha1/integration_types.go
index 69c29e0..5c515d8 100644
--- a/pkg/apis/camel/v1alpha1/integration_types.go
+++ b/pkg/apis/camel/v1alpha1/integration_types.go
@@ -8,16 +8,16 @@ import (
 
 // IntegrationSpec defines the desired state of Integration
 type IntegrationSpec struct {
-       Replicas           *int32                          
`json:"replicas,omitempty"`
-       Sources            []SourceSpec                    
`json:"sources,omitempty"`
-       Resources          []ResourceSpec                  
`json:"resources,omitempty"`
-       Context            string                          
`json:"context,omitempty"`
-       Dependencies       []string                        
`json:"dependencies,omitempty"`
-       Profile            TraitProfile                    
`json:"profile,omitempty"`
-       Traits             map[string]IntegrationTraitSpec 
`json:"traits,omitempty"`
-       Configuration      []ConfigurationSpec             
`json:"configuration,omitempty"`
-       Repositories       []string                        
`json:"repositories,omitempty"`
-       ServiceAccountName string                          
`json:"serviceAccountName,omitempty"`
+       Replicas           *int32               `json:"replicas,omitempty"`
+       Sources            []SourceSpec         `json:"sources,omitempty"`
+       Resources          []ResourceSpec       `json:"resources,omitempty"`
+       Context            string               `json:"context,omitempty"`
+       Dependencies       []string             `json:"dependencies,omitempty"`
+       Profile            TraitProfile         `json:"profile,omitempty"`
+       Traits             map[string]TraitSpec `json:"traits,omitempty"`
+       Configuration      []ConfigurationSpec  `json:"configuration,omitempty"`
+       Repositories       []string             `json:"repositories,omitempty"`
+       ServiceAccountName string               
`json:"serviceAccountName,omitempty"`
 }
 
 // IntegrationStatus defines the observed state of Integration
@@ -117,11 +117,6 @@ var Languages = []Language{
        LanguageYamlFlow,
 }
 
-// A IntegrationTraitSpec contains the configuration of a trait
-type IntegrationTraitSpec struct {
-       Configuration map[string]string `json:"configuration,omitempty"`
-}
-
 // IntegrationPhase --
 type IntegrationPhase string
 
diff --git a/pkg/apis/camel/v1alpha1/integration_types_support.go 
b/pkg/apis/camel/v1alpha1/integration_types_support.go
index 07e0e50..531cf88 100644
--- a/pkg/apis/camel/v1alpha1/integration_types_support.go
+++ b/pkg/apis/camel/v1alpha1/integration_types_support.go
@@ -21,7 +21,6 @@ import (
        "strings"
 
        "github.com/apache/camel-k/pkg/util"
-       "github.com/mitchellh/mapstructure"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -91,26 +90,6 @@ func (is *IntegrationSpec) AddDependency(dependency string) {
        }
 }
 
-// Decode the trait configuration to a type safe struct
-func (in *IntegrationTraitSpec) Decode(target interface{}) error {
-       md := mapstructure.Metadata{}
-
-       decoder, err := mapstructure.NewDecoder(
-               &mapstructure.DecoderConfig{
-                       Metadata:         &md,
-                       WeaklyTypedInput: true,
-                       TagName:          "property",
-                       Result:           &target,
-               },
-       )
-
-       if err != nil {
-               return err
-       }
-
-       return decoder.Decode(in.Configuration)
-}
-
 // NewSourceSpec --
 func NewSourceSpec(name string, content string, language Language) SourceSpec {
        return SourceSpec{
diff --git a/pkg/apis/camel/v1alpha1/integrationcontext_types.go 
b/pkg/apis/camel/v1alpha1/integrationcontext_types.go
index c0b733c..e6a567b 100644
--- a/pkg/apis/camel/v1alpha1/integrationcontext_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationcontext_types.go
@@ -8,12 +8,12 @@ import (
 
 // IntegrationContextSpec defines the desired state of IntegrationContext
 type IntegrationContextSpec struct {
-       Image         string                          `json:"image,omitempty"`
-       Dependencies  []string                        
`json:"dependencies,omitempty"`
-       Profile       TraitProfile                    `json:"profile,omitempty"`
-       Traits        map[string]IntegrationTraitSpec `json:"traits,omitempty"`
-       Configuration []ConfigurationSpec             
`json:"configuration,omitempty"`
-       Repositories  []string                        
`json:"repositories,omitempty"`
+       Image         string               `json:"image,omitempty"`
+       Dependencies  []string             `json:"dependencies,omitempty"`
+       Profile       TraitProfile         `json:"profile,omitempty"`
+       Traits        map[string]TraitSpec `json:"traits,omitempty"`
+       Configuration []ConfigurationSpec  `json:"configuration,omitempty"`
+       Repositories  []string             `json:"repositories,omitempty"`
 }
 
 // IntegrationContextStatus defines the observed state of IntegrationContext
diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go 
b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
index 134017f..a0fd232 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
@@ -12,6 +12,7 @@ type IntegrationPlatformSpec struct {
        Profile   TraitProfile                     `json:"profile,omitempty"`
        Build     IntegrationPlatformBuildSpec     `json:"build,omitempty"`
        Resources IntegrationPlatformResourcesSpec `json:"resources,omitempty"`
+       Traits    map[string]TraitSpec             `json:"traits,omitempty"`
 }
 
 // IntegrationPlatformResourcesSpec contains platform related resources
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go 
b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index e9a0f03..ff43010 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -441,7 +441,7 @@ func (in *IntegrationContextSpec) DeepCopyInto(out 
*IntegrationContextSpec) {
        }
        if in.Traits != nil {
                in, out := &in.Traits, &out.Traits
-               *out = make(map[string]IntegrationTraitSpec, len(*in))
+               *out = make(map[string]TraitSpec, len(*in))
                for key, val := range *in {
                        (*out)[key] = *val.DeepCopy()
                }
@@ -571,6 +571,8 @@ func (in *IntegrationPlatformBuildSpec) DeepCopyInto(out 
*IntegrationPlatformBui
                *out = make([]string, len(*in))
                copy(*out, *in)
        }
+       out.Registry = in.Registry
+       out.Timeout = in.Timeout
        return
 }
 
@@ -618,6 +620,22 @@ func (in *IntegrationPlatformList) DeepCopyObject() 
runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
+func (in *IntegrationPlatformRegistrySpec) DeepCopyInto(out 
*IntegrationPlatformRegistrySpec) {
+       *out = *in
+       return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new IntegrationPlatformRegistrySpec.
+func (in *IntegrationPlatformRegistrySpec) DeepCopy() 
*IntegrationPlatformRegistrySpec {
+       if in == nil {
+               return nil
+       }
+       out := new(IntegrationPlatformRegistrySpec)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
 func (in *IntegrationPlatformResourcesSpec) DeepCopyInto(out 
*IntegrationPlatformResourcesSpec) {
        *out = *in
        if in.Contexts != nil {
@@ -643,6 +661,13 @@ func (in *IntegrationPlatformSpec) DeepCopyInto(out 
*IntegrationPlatformSpec) {
        *out = *in
        in.Build.DeepCopyInto(&out.Build)
        in.Resources.DeepCopyInto(&out.Resources)
+       if in.Traits != nil {
+               in, out := &in.Traits, &out.Traits
+               *out = make(map[string]TraitSpec, len(*in))
+               for key, val := range *in {
+                       (*out)[key] = *val.DeepCopy()
+               }
+       }
        return
 }
 
@@ -697,7 +722,7 @@ func (in *IntegrationSpec) DeepCopyInto(out 
*IntegrationSpec) {
        }
        if in.Traits != nil {
                in, out := &in.Traits, &out.Traits
-               *out = make(map[string]IntegrationTraitSpec, len(*in))
+               *out = make(map[string]TraitSpec, len(*in))
                for key, val := range *in {
                        (*out)[key] = *val.DeepCopy()
                }
@@ -757,29 +782,6 @@ func (in *IntegrationStatus) DeepCopy() *IntegrationStatus 
{
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
-func (in *IntegrationTraitSpec) DeepCopyInto(out *IntegrationTraitSpec) {
-       *out = *in
-       if in.Configuration != nil {
-               in, out := &in.Configuration, &out.Configuration
-               *out = make(map[string]string, len(*in))
-               for key, val := range *in {
-                       (*out)[key] = val
-               }
-       }
-       return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new IntegrationTraitSpec.
-func (in *IntegrationTraitSpec) DeepCopy() *IntegrationTraitSpec {
-       if in == nil {
-               return nil
-       }
-       out := new(IntegrationTraitSpec)
-       in.DeepCopyInto(out)
-       return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
 func (in *ResourceSpec) DeepCopyInto(out *ResourceSpec) {
        *out = *in
        out.DataSpec = in.DataSpec
@@ -828,3 +830,26 @@ func (in *Step) DeepCopy() *Step {
        in.DeepCopyInto(out)
        return out
 }
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
+func (in *TraitSpec) DeepCopyInto(out *TraitSpec) {
+       *out = *in
+       if in.Configuration != nil {
+               in, out := &in.Configuration, &out.Configuration
+               *out = make(map[string]string, len(*in))
+               for key, val := range *in {
+                       (*out)[key] = val
+               }
+       }
+       return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new TraitSpec.
+func (in *TraitSpec) DeepCopy() *TraitSpec {
+       if in == nil {
+               return nil
+       }
+       out := new(TraitSpec)
+       in.DeepCopyInto(out)
+       return out
+}
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.defaults.go 
b/pkg/apis/camel/v1alpha1/zz_generated.defaults.go
new file mode 100644
index 0000000..dd621a3
--- /dev/null
+++ b/pkg/apis/camel/v1alpha1/zz_generated.defaults.go
@@ -0,0 +1,32 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed 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.
+*/
+
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+       runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+       return nil
+}
diff --git a/pkg/cmd/context_create.go b/pkg/cmd/context_create.go
index bf9a440..059497b 100644
--- a/pkg/cmd/context_create.go
+++ b/pkg/cmd/context_create.go
@@ -212,7 +212,7 @@ func (command *contextCreateCommand) run(_ *cobra.Command, 
args []string) error
 
 func (*contextCreateCommand) configureTrait(ctx *v1alpha1.IntegrationContext, 
config string) error {
        if ctx.Spec.Traits == nil {
-               ctx.Spec.Traits = make(map[string]v1alpha1.IntegrationTraitSpec)
+               ctx.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
        }
 
        parts := traitConfigRegexp.FindStringSubmatch(config)
@@ -225,7 +225,7 @@ func (*contextCreateCommand) configureTrait(ctx 
*v1alpha1.IntegrationContext, co
 
        spec, ok := ctx.Spec.Traits[traitID]
        if !ok {
-               spec = v1alpha1.IntegrationTraitSpec{
+               spec = v1alpha1.TraitSpec{
                        Configuration: make(map[string]string),
                }
        }
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index 9d72789..5e807cd 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -466,7 +466,7 @@ func (*runCmdOptions) loadData(fileName string, compress 
bool) (string, error) {
 
 func (*runCmdOptions) configureTrait(integration *v1alpha1.Integration, config 
string) error {
        if integration.Spec.Traits == nil {
-               integration.Spec.Traits = 
make(map[string]v1alpha1.IntegrationTraitSpec)
+               integration.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
        }
 
        parts := traitConfigRegexp.FindStringSubmatch(config)
@@ -479,7 +479,7 @@ func (*runCmdOptions) configureTrait(integration 
*v1alpha1.Integration, config s
 
        spec, ok := integration.Spec.Traits[traitID]
        if !ok {
-               spec = v1alpha1.IntegrationTraitSpec{
+               spec = v1alpha1.TraitSpec{
                        Configuration: make(map[string]string),
                }
        }
diff --git a/pkg/trait/debug_test.go b/pkg/trait/debug_test.go
index 8e4e2de..b01fdd0 100644
--- a/pkg/trait/debug_test.go
+++ b/pkg/trait/debug_test.go
@@ -40,7 +40,7 @@ func TestDebugTraitApplicability(t *testing.T) {
                                Phase: v1alpha1.IntegrationPhaseDeploying,
                        },
                        Spec: v1alpha1.IntegrationSpec{
-                               Traits: 
map[string]v1alpha1.IntegrationTraitSpec{
+                               Traits: map[string]v1alpha1.TraitSpec{
                                        "debug": {
                                                Configuration: 
map[string]string{
                                                        "enabled": "true",
@@ -72,7 +72,7 @@ func TestApplyDebugTrait(t *testing.T) {
                                Phase: v1alpha1.IntegrationPhaseDeploying,
                        },
                        Spec: v1alpha1.IntegrationSpec{
-                               Traits: 
map[string]v1alpha1.IntegrationTraitSpec{
+                               Traits: map[string]v1alpha1.TraitSpec{
                                        "debug": {
                                                Configuration: 
map[string]string{
                                                        "enabled": "true",
diff --git a/pkg/trait/environment_test.go b/pkg/trait/environment_test.go
index c210105..e6a1bde 100644
--- a/pkg/trait/environment_test.go
+++ b/pkg/trait/environment_test.go
@@ -104,7 +104,7 @@ func TestEnabledContainerMetaDataEnvVars(t *testing.T) {
                        },
                        Spec: v1alpha1.IntegrationSpec{
                                Profile: v1alpha1.TraitProfileOpenShift,
-                               Traits: 
map[string]v1alpha1.IntegrationTraitSpec{
+                               Traits: map[string]v1alpha1.TraitSpec{
                                        "environment": {
                                                Configuration: 
map[string]string{
                                                        "container-meta": 
"true",
@@ -169,7 +169,7 @@ func TestDisabledContainerMetaDataEnvVars(t *testing.T) {
                        },
                        Spec: v1alpha1.IntegrationSpec{
                                Profile: v1alpha1.TraitProfileOpenShift,
-                               Traits: 
map[string]v1alpha1.IntegrationTraitSpec{
+                               Traits: map[string]v1alpha1.TraitSpec{
                                        "environment": {
                                                Configuration: 
map[string]string{
                                                        "container-meta": 
"false",
diff --git a/pkg/trait/knative_service_vol_test.go 
b/pkg/trait/knative_service_vol_test.go
index 87c8600..86ff6c1 100644
--- a/pkg/trait/knative_service_vol_test.go
+++ b/pkg/trait/knative_service_vol_test.go
@@ -79,7 +79,7 @@ func TestKnativeWithVolumeBinding(t *testing.T) {
                                        {Type: "secret", Value: "my-secret"},
                                        {Type: "property", Value: 
"my-property=my-property-value"},
                                },
-                               Traits: 
map[string]v1alpha1.IntegrationTraitSpec{
+                               Traits: map[string]v1alpha1.TraitSpec{
                                        "knative-service": {
                                                Configuration: 
map[string]string{
                                                        "configuration-type": 
"volume",
@@ -217,7 +217,7 @@ func TestKnativeWithVolumeBindingAndContainerImage(t 
*testing.T) {
                                        {Type: "configmap", Value: "my-cm"},
                                        {Type: "secret", Value: "my-secret"},
                                },
-                               Traits: 
map[string]v1alpha1.IntegrationTraitSpec{
+                               Traits: map[string]v1alpha1.TraitSpec{
                                        "deployer": {
                                                Configuration: 
map[string]string{
                                                        "container-image": 
"true",
diff --git a/pkg/trait/owner_test.go b/pkg/trait/owner_test.go
index 2c08f0e..16410b4 100644
--- a/pkg/trait/owner_test.go
+++ b/pkg/trait/owner_test.go
@@ -54,7 +54,7 @@ func TestOwnerWithoutFinalizer(t *testing.T) {
 
 func SetUpOwnerEnvironment(t *testing.T) *Environment {
        env := createTestEnv(t, v1alpha1.IntegrationPlatformClusterOpenShift, 
"camel:core")
-       env.Integration.Spec.Traits = map[string]v1alpha1.IntegrationTraitSpec{
+       env.Integration.Spec.Traits = map[string]v1alpha1.TraitSpec{
                "owner": {
                        Configuration: map[string]string{
                                "target-labels":      "com.mycompany/mylabel1",
diff --git a/pkg/trait/trait_catalog.go b/pkg/trait/trait_catalog.go
index 757af57..3935c86 100644
--- a/pkg/trait/trait_catalog.go
+++ b/pkg/trait/trait_catalog.go
@@ -243,23 +243,31 @@ func (c *Catalog) GetTrait(id string) Trait {
 }
 
 func (c *Catalog) configure(env *Environment) error {
+       if env.Platform != nil && env.Platform.Spec.Traits != nil {
+               if err := c.configureTraits(env.Platform.Spec.Traits); err != 
nil {
+                       return err
+               }
+       }
        if env.IntegrationContext != nil && env.IntegrationContext.Spec.Traits 
!= nil {
-               for id, traitSpec := range env.IntegrationContext.Spec.Traits {
-                       catTrait := c.GetTrait(id)
-                       if catTrait != nil {
-                               if err := traitSpec.Decode(catTrait); err != 
nil {
-                                       return err
-                               }
-                       }
+               if err := 
c.configureTraits(env.IntegrationContext.Spec.Traits); err != nil {
+                       return err
                }
        }
        if env.Integration != nil && env.Integration.Spec.Traits != nil {
-               for id, traitSpec := range env.Integration.Spec.Traits {
-                       catTrait := c.GetTrait(id)
-                       if catTrait != nil {
-                               if err := traitSpec.Decode(catTrait); err != 
nil {
-                                       return err
-                               }
+               if err := c.configureTraits(env.Integration.Spec.Traits); err 
!= nil {
+                       return err
+               }
+       }
+
+       return nil
+}
+
+func (c *Catalog) configureTraits(traits map[string]v1alpha1.TraitSpec) error {
+       for id, traitSpec := range traits {
+               catTrait := c.GetTrait(id)
+               if catTrait != nil {
+                       if err := traitSpec.Decode(catTrait); err != nil {
+                               return err
                        }
                }
        }
diff --git a/pkg/trait/trait_test.go b/pkg/trait/trait_test.go
index ed02a94..bae8930 100644
--- a/pkg/trait/trait_test.go
+++ b/pkg/trait/trait_test.go
@@ -80,8 +80,8 @@ func TestOpenShiftTraitsWithWeb(t *testing.T) {
 
 func TestOpenShiftTraitsWithWebAndConfig(t *testing.T) {
        env := createTestEnv(t, v1alpha1.IntegrationPlatformClusterOpenShift, 
"from('undertow:http').to('log:info')")
-       env.Integration.Spec.Traits = 
make(map[string]v1alpha1.IntegrationTraitSpec)
-       env.Integration.Spec.Traits["service"] = v1alpha1.IntegrationTraitSpec{
+       env.Integration.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
+       env.Integration.Spec.Traits["service"] = v1alpha1.TraitSpec{
                Configuration: map[string]string{
                        "port": "7071",
                },
@@ -96,8 +96,8 @@ func TestOpenShiftTraitsWithWebAndConfig(t *testing.T) {
 
 func TestOpenShiftTraitsWithWebAndDisabledTrait(t *testing.T) {
        env := createTestEnv(t, v1alpha1.IntegrationPlatformClusterOpenShift, 
"from('undertow:http').to('log:info')")
-       env.Integration.Spec.Traits = 
make(map[string]v1alpha1.IntegrationTraitSpec)
-       env.Integration.Spec.Traits["service"] = v1alpha1.IntegrationTraitSpec{
+       env.Integration.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
+       env.Integration.Spec.Traits["service"] = v1alpha1.TraitSpec{
                Configuration: map[string]string{
                        "enabled": "false",
                        "port":    "7071",
@@ -146,8 +146,8 @@ func TestKubernetesTraitsWithWeb(t *testing.T) {
 
 func TestTraitDecode(t *testing.T) {
        env := createTestEnv(t, v1alpha1.IntegrationPlatformClusterOpenShift, 
"")
-       env.Integration.Spec.Traits = 
make(map[string]v1alpha1.IntegrationTraitSpec)
-       svcTrait := v1alpha1.IntegrationTraitSpec{
+       env.Integration.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
+       svcTrait := v1alpha1.TraitSpec{
                Configuration: map[string]string{
                        "enabled": "false",
                        "port":    "7071",
@@ -165,6 +165,59 @@ func TestTraitDecode(t *testing.T) {
        assert.Equal(t, false, *svc.Enabled)
 }
 
+func TestTraitHierarchyDecode(t *testing.T) {
+       env := createTestEnv(t, v1alpha1.IntegrationPlatformClusterOpenShift, 
"")
+
+       env.Platform.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
+       env.Platform.Spec.Traits["knative-service"] = v1alpha1.TraitSpec{
+               Configuration: map[string]string{
+                       "enabled":            "false",
+                       "min-scale":          "1",
+                       "max-scale":          "10",
+                       "autoscaling-target": "15",
+               },
+       }
+
+       env.IntegrationContext.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
+       env.IntegrationContext.Spec.Traits["knative-service"] = 
v1alpha1.TraitSpec{
+               Configuration: map[string]string{
+                       "enabled":   "true",
+                       "min-scale": "5",
+               },
+       }
+
+       env.Integration.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
+       env.Integration.Spec.Traits["knative-service"] = v1alpha1.TraitSpec{
+               Configuration: map[string]string{
+                       "max-scale": "20",
+               },
+       }
+
+       c := NewTraitTestCatalog()
+       err := c.configure(env)
+
+       assert.Nil(t, err)
+
+       knt := c.GetTrait("knative-service")
+       assert.NotNil(t, knt)
+
+       kns, ok := knt.(*knativeServiceTrait)
+       assert.True(t, ok)
+       assert.NotNil(t, kns)
+
+       assert.NotNil(t, kns.Enabled)
+       assert.True(t, *kns.Enabled)
+
+       assert.NotNil(t, kns.MinScale)
+       assert.Equal(t, 5, *kns.MinScale)
+
+       assert.NotNil(t, kns.MaxScale)
+       assert.Equal(t, 20, *kns.MaxScale)
+
+       assert.NotNil(t, kns.Target)
+       assert.Equal(t, 15, *kns.Target)
+}
+
 func TestConfigureVolumesAndMounts(t *testing.T) {
        env := Environment{
                Integration: &v1alpha1.Integration{

Reply via email to