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
