You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2019/01/04 09:12:03 UTC

[camel-k] 02/03: Copy dependencies and context to status

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 <ni...@gmail.com>
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