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

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

commit fc708d5b5bab42d708e00e1ad2d937b1f9b129b0
Author: nferraro <[email protected]>
AuthorDate: Mon Dec 24 16:39:27 2018 +0100

    Copy dependencies and context to status
---
 pkg/apis/camel/v1alpha1/types.go                 | 12 +++++-----
 pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go | 29 +++++++++++++++++++++++-
 pkg/client/cmd/get.go                            |  2 +-
 pkg/stub/action/context/build.go                 |  2 +-
 pkg/stub/action/integration/build_context.go     | 16 ++++++-------
 pkg/stub/action/integration/build_image.go       |  4 ++--
 pkg/stub/action/integration/deploy.go            |  5 +++-
 pkg/stub/action/integration/initialize.go        |  3 +++
 pkg/stub/action/integration/monitor.go           |  2 +-
 pkg/stub/action/integration/util.go              |  8 +++----
 pkg/trait/classpath.go                           |  6 ++---
 pkg/trait/dependencies.go                        | 21 +++++++++++------
 pkg/trait/springboot.go                          |  4 ++--
 pkg/trait/util.go                                |  4 ++--
 pkg/util/util.go                                 |  4 ++++
 15 files changed, 83 insertions(+), 39 deletions(-)

diff --git a/pkg/apis/camel/v1alpha1/types.go b/pkg/apis/camel/v1alpha1/types.go
index 6df4c30..df2c251 100644
--- a/pkg/apis/camel/v1alpha1/types.go
+++ b/pkg/apis/camel/v1alpha1/types.go
@@ -18,12 +18,10 @@ limitations under the License.
 package v1alpha1
 
 import (
-       "strings"
-
        "github.com/apache/camel-k/pkg/util"
-
        "github.com/mitchellh/mapstructure"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "strings"
 )
 
 // ConfigurationSpec --
@@ -175,9 +173,11 @@ func (in *IntegrationTraitSpec) Decode(target interface{}) 
error {
 
 // IntegrationStatus --
 type IntegrationStatus struct {
-       Phase  IntegrationPhase `json:"phase,omitempty"`
-       Digest string           `json:"digest,omitempty"`
-       Image  string           `json:"image,omitempty"`
+       Phase        IntegrationPhase `json:"phase,omitempty"`
+       Digest       string           `json:"digest,omitempty"`
+       Image        string           `json:"image,omitempty"`
+       Dependencies []string         `json:"dependencies,omitempty"`
+       Context      string           `json:"context,omitempty"`
 }
 
 // IntegrationPhase --
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go 
b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index 85e3be8..8df4769 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -95,12 +95,34 @@ func (in *Flow) DeepCopy() *Flow {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
+func (in Flows) DeepCopyInto(out *Flows) {
+       {
+               in := &in
+               *out = make(Flows, len(*in))
+               for i := range *in {
+                       (*in)[i].DeepCopyInto(&(*out)[i])
+               }
+               return
+       }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new Flows.
+func (in Flows) DeepCopy() Flows {
+       if in == nil {
+               return nil
+       }
+       out := new(Flows)
+       in.DeepCopyInto(out)
+       return *out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
 func (in *Integration) DeepCopyInto(out *Integration) {
        *out = *in
        out.TypeMeta = in.TypeMeta
        in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
        in.Spec.DeepCopyInto(&out.Spec)
-       out.Status = in.Status
+       in.Status.DeepCopyInto(&out.Status)
        return
 }
 
@@ -453,6 +475,11 @@ func (in *IntegrationSpec) DeepCopy() *IntegrationSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, 
writing into out. in must be non-nil.
 func (in *IntegrationStatus) DeepCopyInto(out *IntegrationStatus) {
        *out = *in
+       if in.Dependencies != nil {
+               in, out := &in.Dependencies, &out.Dependencies
+               *out = make([]string, len(*in))
+               copy(*out, *in)
+       }
        return
 }
 
diff --git a/pkg/client/cmd/get.go b/pkg/client/cmd/get.go
index 02d4726..d9e4851 100644
--- a/pkg/client/cmd/get.go
+++ b/pkg/client/cmd/get.go
@@ -64,7 +64,7 @@ func (o *getCmdOptions) run(cmd *cobra.Command, args 
[]string) error {
        w := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0)
        fmt.Fprintln(w, "NAME\tCONTEXT\tSTATUS")
        for _, integration := range integrationList.Items {
-               fmt.Fprintf(w, "%s\t%s\t%s\n", integration.Name, 
integration.Spec.Context, string(integration.Status.Phase))
+               fmt.Fprintf(w, "%s\t%s\t%s\n", integration.Name, 
integration.Status.Context, string(integration.Status.Phase))
        }
        w.Flush()
 
diff --git a/pkg/stub/action/context/build.go b/pkg/stub/action/context/build.go
index 08394c9..eebf87e 100644
--- a/pkg/stub/action/context/build.go
+++ b/pkg/stub/action/context/build.go
@@ -136,7 +136,7 @@ func (action *buildAction) informIntegrations(context 
*v1alpha1.IntegrationConte
        }
        for _, integration := range list.Items {
                integration := integration // pin
-               if integration.Spec.Context != context.Name {
+               if integration.Status.Context != context.Name {
                        continue
                }
 
diff --git a/pkg/stub/action/integration/build_context.go 
b/pkg/stub/action/integration/build_context.go
index 97da4aa..9f25225 100644
--- a/pkg/stub/action/integration/build_context.go
+++ b/pkg/stub/action/integration/build_context.go
@@ -66,12 +66,12 @@ func (action *buildContextAction) Handle(integration 
*v1alpha1.Integration) erro
                        // amended to add/remove dependencies
 
                        //TODO: this is a very simple check, we may need to 
provide a deps comparison strategy
-                       if !util.StringSliceContains(ctx.Spec.Dependencies, 
integration.Spec.Dependencies) {
+                       if !util.StringSliceContains(ctx.Spec.Dependencies, 
integration.Status.Dependencies) {
                                // We need to re-generate a context or search 
for a new one that
                                // satisfies integrations needs so let's remove 
the association
                                // with a context
                                target := integration.DeepCopy()
-                               target.Spec.Context = ""
+                               target.Status.Context = ""
                                return sdk.Update(target)
                        }
                }
@@ -79,7 +79,7 @@ func (action *buildContextAction) Handle(integration 
*v1alpha1.Integration) erro
                if ctx.Status.Phase == v1alpha1.IntegrationContextPhaseError {
                        target := integration.DeepCopy()
                        target.Status.Image = ctx.ImageForIntegration()
-                       target.Spec.Context = ctx.Name
+                       target.Status.Context = ctx.Name
                        target.Status.Phase = v1alpha1.IntegrationPhaseError
 
                        target.Status.Digest, err = 
digest.ComputeForIntegration(target)
@@ -95,7 +95,7 @@ func (action *buildContextAction) Handle(integration 
*v1alpha1.Integration) erro
                if ctx.Status.Phase == v1alpha1.IntegrationContextPhaseReady {
                        target := integration.DeepCopy()
                        target.Status.Image = ctx.ImageForIntegration()
-                       target.Spec.Context = ctx.Name
+                       target.Status.Context = ctx.Name
 
                        dgst, err := digest.ComputeForIntegration(target)
                        if err != nil {
@@ -113,10 +113,10 @@ func (action *buildContextAction) Handle(integration 
*v1alpha1.Integration) erro
                        return sdk.Update(target)
                }
 
-               if integration.Spec.Context == "" {
+               if integration.Status.Context == "" {
                        // We need to set the context
                        target := integration.DeepCopy()
-                       target.Spec.Context = ctx.Name
+                       target.Status.Context = ctx.Name
                        return sdk.Update(target)
                }
 
@@ -137,7 +137,7 @@ func (action *buildContextAction) Handle(integration 
*v1alpha1.Integration) erro
 
        // Set the context to have the same dependencies as the integrations
        platformCtx.Spec = v1alpha1.IntegrationContextSpec{
-               Dependencies: integration.Spec.Dependencies,
+               Dependencies: integration.Status.Dependencies,
                Repositories: integration.Spec.Repositories,
                Traits:       integration.Spec.Traits,
        }
@@ -149,7 +149,7 @@ func (action *buildContextAction) Handle(integration 
*v1alpha1.Integration) erro
        // Set the context name so the next handle loop, will fall through the
        // same path as integration with a user defined context
        target := integration.DeepCopy()
-       target.Spec.Context = platformCtxName
+       target.Status.Context = platformCtxName
 
        return sdk.Update(target)
 }
diff --git a/pkg/stub/action/integration/build_image.go 
b/pkg/stub/action/integration/build_image.go
index 44440cf..62058f5 100644
--- a/pkg/stub/action/integration/build_image.go
+++ b/pkg/stub/action/integration/build_image.go
@@ -62,13 +62,13 @@ func (action *buildImageAction) Handle(integration 
*v1alpha1.Integration) error
 
        // in this phase the integration need to be associated to a context 
whose image
        // will be used as base image for the integration images
-       if integration.Spec.Context == "" {
+       if integration.Status.Context == "" {
                return fmt.Errorf("context is not set for integration: %s", 
integration.Name)
        }
 
        // look-up the integration context associated to this integration, this 
is needed
        // to determine the base image
-       ctx := v1alpha1.NewIntegrationContext(integration.Namespace, 
integration.Spec.Context)
+       ctx := v1alpha1.NewIntegrationContext(integration.Namespace, 
integration.Status.Context)
        if err := sdk.Get(&ctx); err != nil {
                return errors.Wrapf(err, "unable to find integration context 
%s, %s", ctx.Name, err)
        }
diff --git a/pkg/stub/action/integration/deploy.go 
b/pkg/stub/action/integration/deploy.go
index ad0d04a..7ceaeef 100644
--- a/pkg/stub/action/integration/deploy.go
+++ b/pkg/stub/action/integration/deploy.go
@@ -43,7 +43,10 @@ func (action *deployAction) CanHandle(integration 
*v1alpha1.Integration) bool {
 }
 
 func (action *deployAction) Handle(integration *v1alpha1.Integration) error {
-       ctxName := integration.Spec.Context
+       ctxName := integration.Status.Context
+       if ctxName == "" {
+               return errors.Errorf("no context set on integration %s", 
integration.Name)
+       }
        ctx := v1alpha1.NewIntegrationContext(integration.Namespace, ctxName)
 
        if err := sdk.Get(&ctx); err != nil {
diff --git a/pkg/stub/action/integration/initialize.go 
b/pkg/stub/action/integration/initialize.go
index b9ca930..c2e0289 100644
--- a/pkg/stub/action/integration/initialize.go
+++ b/pkg/stub/action/integration/initialize.go
@@ -68,6 +68,9 @@ func (action *initializeAction) Handle(integration 
*v1alpha1.Integration) error
 
        target.Status.Phase = v1alpha1.IntegrationPhaseBuildingContext
        target.Status.Digest = dgst
+       target.Status.Context = integration.Spec.Context
+       target.Status.Dependencies = integration.Spec.Dependencies
+       target.Status.Image = ""
 
        logrus.Info("Integration ", target.Name, " transitioning to state ", 
target.Status.Phase)
 
diff --git a/pkg/stub/action/integration/monitor.go 
b/pkg/stub/action/integration/monitor.go
index d0e8107..7f3bf33 100644
--- a/pkg/stub/action/integration/monitor.go
+++ b/pkg/stub/action/integration/monitor.go
@@ -53,7 +53,7 @@ func (action *monitorAction) Handle(integration 
*v1alpha1.Integration) error {
 
                target := integration.DeepCopy()
                target.Status.Digest = hash
-               target.Status.Phase = v1alpha1.IntegrationPhaseBuildingContext
+               target.Status.Phase = ""
 
                logrus.Info("Integration ", target.Name, " transitioning to 
state ", target.Status.Phase)
 
diff --git a/pkg/stub/action/integration/util.go 
b/pkg/stub/action/integration/util.go
index 26c1fd8..15230c7 100644
--- a/pkg/stub/action/integration/util.go
+++ b/pkg/stub/action/integration/util.go
@@ -27,8 +27,8 @@ import (
 
 // LookupContextForIntegration --
 func LookupContextForIntegration(integration *v1alpha1.Integration) 
(*v1alpha1.IntegrationContext, error) {
-       if integration.Spec.Context != "" {
-               name := integration.Spec.Context
+       if integration.Status.Context != "" {
+               name := integration.Status.Context
                ctx := v1alpha1.NewIntegrationContext(integration.Namespace, 
name)
 
                if err := sdk.Get(&ctx); err != nil {
@@ -46,14 +46,14 @@ func LookupContextForIntegration(integration 
*v1alpha1.Integration) (*v1alpha1.I
        for _, ctx := range ctxList.Items {
                ctx := ctx // pin
                if ctx.Labels["camel.apache.org/context.type"] == 
v1alpha1.IntegrationContextTypePlatform {
-                       ideps := len(integration.Spec.Dependencies)
+                       ideps := len(integration.Status.Dependencies)
                        cdeps := len(ctx.Spec.Dependencies)
 
                        if ideps != cdeps {
                                continue
                        }
 
-                       if util.StringSliceContains(ctx.Spec.Dependencies, 
integration.Spec.Dependencies) {
+                       if util.StringSliceContains(ctx.Spec.Dependencies, 
integration.Status.Dependencies) {
                                return &ctx, nil
                        }
                }
diff --git a/pkg/trait/classpath.go b/pkg/trait/classpath.go
index 3936584..619e6b3 100644
--- a/pkg/trait/classpath.go
+++ b/pkg/trait/classpath.go
@@ -54,8 +54,8 @@ func (t *classpathTrait) Configure(e *Environment) (bool, 
error) {
 func (t *classpathTrait) Apply(e *Environment) error {
        ctx := e.Context
 
-       if ctx == nil && e.Integration.Spec.Context != "" {
-               name := e.Integration.Spec.Context
+       if ctx == nil && e.Integration.Status.Context != "" {
+               name := e.Integration.Status.Context
                c := v1alpha1.NewIntegrationContext(e.Integration.Namespace, 
name)
 
                if err := sdk.Get(&c); err != nil {
@@ -66,7 +66,7 @@ func (t *classpathTrait) Apply(e *Environment) error {
        }
 
        if ctx == nil {
-               return fmt.Errorf("unable to find integration context %s", 
e.Integration.Spec.Context)
+               return fmt.Errorf("unable to find integration context %s", 
e.Integration.Status.Context)
        }
 
        deps := make([]string, 0, 2+len(ctx.Status.Artifacts))
diff --git a/pkg/trait/dependencies.go b/pkg/trait/dependencies.go
index 79862a6..4052e4c 100644
--- a/pkg/trait/dependencies.go
+++ b/pkg/trait/dependencies.go
@@ -46,28 +46,35 @@ func (t *dependenciesTrait) Configure(e *Environment) 
(bool, error) {
 }
 
 func (t *dependenciesTrait) Apply(e *Environment) error {
+       dependencies := make([]string, 0)
+       if e.Integration.Spec.Dependencies != nil {
+               for _, dep := range e.Integration.Spec.Dependencies {
+                       util.StringSliceUniqueAdd(&dependencies, dep)
+               }
+       }
        for _, s := range e.Integration.Spec.Sources {
                meta := metadata.Extract(s)
 
                switch s.InferLanguage() {
                case v1alpha1.LanguageGroovy:
-                       
util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, "runtime:groovy")
+                       util.StringSliceUniqueAdd(&dependencies, 
"runtime:groovy")
                case v1alpha1.LanguageKotlin:
-                       
util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, "runtime:kotlin")
+                       util.StringSliceUniqueAdd(&dependencies, 
"runtime:kotlin")
                case v1alpha1.LanguageYamlFlow:
-                       
util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, "runtime:yaml")
+                       util.StringSliceUniqueAdd(&dependencies, "runtime:yaml")
                }
 
                // jvm runtime and camel-core required by default
-               util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, 
"runtime:jvm")
-               util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, 
"camel:core")
+               util.StringSliceUniqueAdd(&dependencies, "runtime:jvm")
+               util.StringSliceUniqueAdd(&dependencies, "camel:core")
 
                for _, d := range meta.Dependencies {
-                       
util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, d)
+                       util.StringSliceUniqueAdd(&dependencies, d)
                }
        }
 
        // sort the dependencies to get always the same list if they don't 
change
-       sort.Strings(e.Integration.Spec.Dependencies)
+       sort.Strings(dependencies)
+       e.Integration.Status.Dependencies = dependencies
        return nil
 }
diff --git a/pkg/trait/springboot.go b/pkg/trait/springboot.go
index fb280ba..7c790e5 100644
--- a/pkg/trait/springboot.go
+++ b/pkg/trait/springboot.go
@@ -66,10 +66,10 @@ func (t *springBootTrait) Apply(e *Environment) error {
        //
 
        if e.IntegrationInPhase("") {
-               util.StringSliceUniqueAdd(&e.Integration.Spec.Dependencies, 
"runtime:spring-boot")
+               util.StringSliceUniqueAdd(&e.Integration.Status.Dependencies, 
"runtime:spring-boot")
 
                // sort the dependencies to get always the same list if they 
don't change
-               sort.Strings(e.Integration.Spec.Dependencies)
+               sort.Strings(e.Integration.Status.Dependencies)
        }
 
        if e.InPhase(v1alpha1.IntegrationContextPhaseReady, 
v1alpha1.IntegrationPhaseDeploying) {
diff --git a/pkg/trait/util.go b/pkg/trait/util.go
index ad6e1d3..3c73236 100644
--- a/pkg/trait/util.go
+++ b/pkg/trait/util.go
@@ -26,11 +26,11 @@ import (
 
 // GetIntegrationContext retrieves the context set on the integration
 func GetIntegrationContext(integration *v1alpha1.Integration) 
(*v1alpha1.IntegrationContext, error) {
-       if integration.Spec.Context == "" {
+       if integration.Status.Context== "" {
                return nil, nil
        }
 
-       name := integration.Spec.Context
+       name := integration.Status.Context
        ctx := v1alpha1.NewIntegrationContext(integration.Namespace, name)
        err := sdk.Get(&ctx)
        return &ctx, err
diff --git a/pkg/util/util.go b/pkg/util/util.go
index 18594ad..7cd9712 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -52,6 +52,10 @@ func StringSliceExists(slice []string, item string) bool {
 
 // StringSliceUniqueAdd append the given item if not already present in the 
slice
 func StringSliceUniqueAdd(slice *[]string, item string) bool {
+       if slice == nil {
+               newSlice := make([]string, 0)
+               slice = &newSlice
+       }
        for _, i := range *slice {
                if i == item {
                        return false

Reply via email to