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