You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/01/13 14:47:23 UTC

[camel-k] 09/09: Fix #312: move lookup logic to the images trait

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

commit 3387b5eef526a80c79451c94387dd558034adbe5
Author: nferraro <ni...@gmail.com>
AuthorDate: Fri Jan 11 13:25:18 2019 +0100

    Fix #312: move lookup logic to the images trait
---
 .../camel/v1alpha1/integrationplatform_types.go    | 15 +++--
 pkg/cmd/install.go                                 |  3 -
 pkg/controller/integration/build_context.go        | 15 -----
 pkg/controller/integration/util.go                 | 32 -----------
 pkg/controller/integrationcontext/initialize.go    | 12 +++-
 pkg/platform/images/images.go                      |  4 +-
 pkg/trait/catalog.go                               |  6 ++
 pkg/trait/images.go                                | 65 ++++++++++++++++++++++
 8 files changed, 89 insertions(+), 63 deletions(-)

diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
index f967b2a..7db0ae0 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
@@ -71,14 +71,13 @@ var allTraitProfiles = []TraitProfile{TraitProfileOpenShift, TraitProfileKuberne
 
 // IntegrationPlatformBuildSpec contains platform related build information
 type IntegrationPlatformBuildSpec struct {
-	PublishStrategy  IntegrationPlatformBuildPublishStrategy `json:"publishStrategy,omitempty"`
-	Registry         string                                  `json:"registry,omitempty"`
-	Organization     string                                  `json:"organization,omitempty"`
-	PushSecret       string                                  `json:"pushSecret,omitempty"`
-	CamelVersion     string                                  `json:"camelVersion,omitempty"`
-	PredefinedImages bool                                    `json:"predefinedImages,omitempty"`
-	Properties       map[string]string                       `json:"properties,omitempty"`
-	Repositories     []string                                `json:"repositories,omitempty"`
+	PublishStrategy IntegrationPlatformBuildPublishStrategy `json:"publishStrategy,omitempty"`
+	Registry        string                                  `json:"registry,omitempty"`
+	Organization    string                                  `json:"organization,omitempty"`
+	PushSecret      string                                  `json:"pushSecret,omitempty"`
+	CamelVersion    string                                  `json:"camelVersion,omitempty"`
+	Properties      map[string]string                       `json:"properties,omitempty"`
+	Repositories    []string                                `json:"repositories,omitempty"`
 }
 
 // IntegrationPlatformBuildPublishStrategy enumerates all implemented build strategies
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index 6f9cd02..f9bbff2 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -43,7 +43,6 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 	cmd.Flags().BoolVar(&impl.clusterSetupOnly, "cluster-setup", false, "Execute cluster-wide operations only (may require admin rights)")
 	cmd.Flags().BoolVar(&impl.skipClusterSetup, "skip-cluster-setup", false, "Skip the cluster-setup phase")
 	cmd.Flags().BoolVar(&impl.exampleSetup, "example", false, "Install example integration")
-	cmd.Flags().BoolVar(&impl.predefinedImages, "predefined-images", false, "Enable usage of predefined images")
 	cmd.Flags().StringVar(&impl.registry, "registry", "", "A Docker registry that can be used to publish images")
 	cmd.Flags().StringVarP(&impl.outputFormat, "output", "o", "", "Output format. One of: json|yaml")
 	cmd.Flags().StringVar(&impl.organization, "organization", "", "A organization on the Docker registry that can be used to publish images")
@@ -70,7 +69,6 @@ type installCmdOptions struct {
 	clusterSetupOnly bool
 	skipClusterSetup bool
 	exampleSetup     bool
-	predefinedImages bool
 	registry         string
 	outputFormat     string
 	organization     string
@@ -142,7 +140,6 @@ func (o *installCmdOptions) install(cmd *cobra.Command, args []string) error {
 			platform.Spec.Build.CamelVersion = o.camelVersion
 		}
 
-		platform.Spec.Build.PredefinedImages = o.predefinedImages
 		platform.Spec.Resources.Contexts = o.contexts
 
 		err = install.RuntimeObjectOrCollect(o.Context, c, namespace, collection, platform)
diff --git a/pkg/controller/integration/build_context.go b/pkg/controller/integration/build_context.go
index eb1ee6a..abfb2fd 100644
--- a/pkg/controller/integration/build_context.go
+++ b/pkg/controller/integration/build_context.go
@@ -22,7 +22,6 @@ import (
 	"fmt"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-	"github.com/apache/camel-k/pkg/platform"
 	"github.com/apache/camel-k/pkg/trait"
 	"github.com/apache/camel-k/pkg/util"
 	"github.com/apache/camel-k/pkg/util/digest"
@@ -57,20 +56,6 @@ func (action *buildContextAction) Handle(ctx context.Context, integration *v1alp
 		return err
 	}
 
-	if ictx == nil {
-		// Try to create an external context if possible
-		pl, err := platform.GetCurrentPlatform(ctx, action.client, integration.Namespace)
-		if err != nil {
-			return nil
-		}
-		if pl.Spec.Build.PredefinedImages {
-			ictx, err = ImportPredefinedContextIfPresent(ctx, action.client, integration)
-			if err != nil {
-				return err
-			}
-		}
-	}
-
 	if ictx != nil {
 		if ictx.Labels["camel.apache.org/context.type"] == v1alpha1.IntegrationContextTypePlatform {
 			// This is a platform context and as it is auto generated it may get
diff --git a/pkg/controller/integration/util.go b/pkg/controller/integration/util.go
index 9eecf11..e9fe974 100644
--- a/pkg/controller/integration/util.go
+++ b/pkg/controller/integration/util.go
@@ -19,14 +19,10 @@ package integration
 
 import (
 	"context"
-	"fmt"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-	"github.com/apache/camel-k/pkg/client"
-	"github.com/apache/camel-k/pkg/platform/images"
 	"github.com/apache/camel-k/pkg/util"
 	"github.com/pkg/errors"
-	"github.com/rs/xid"
 	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
@@ -74,31 +70,3 @@ func LookupContextForIntegration(ctx context.Context, c k8sclient.Reader, integr
 
 	return nil, nil
 }
-
-// ImportPredefinedContextIfPresent tries to create an external context from a predefined image
-func ImportPredefinedContextIfPresent(ctx context.Context, c client.Client, integration *v1alpha1.Integration) (*v1alpha1.IntegrationContext, error) {
-	image := images.LookupPredefinedImage(integration.Status.Dependencies)
-	if image == "" {
-		return nil, nil
-	}
-
-	externalCtxName := fmt.Sprintf("ctx-base-%s", xid.New())
-	externalCtx := v1alpha1.NewIntegrationContext(integration.Namespace, externalCtxName)
-
-	externalCtx.Labels = map[string]string{
-		"camel.apache.org/context.type":               v1alpha1.IntegrationContextTypeExternal,
-		"camel.apache.org/context.created.by.kind":    v1alpha1.IntegrationKind,
-		"camel.apache.org/context.created.by.name":    integration.Name,
-		"camel.apache.org/context.created.by.version": integration.ResourceVersion,
-	}
-
-	externalCtx.Spec = v1alpha1.IntegrationContextSpec{
-		Dependencies: integration.Status.Dependencies,
-		Image:        image,
-	}
-
-	if err := c.Create(ctx, &externalCtx); err != nil {
-		return nil, err
-	}
-	return &externalCtx, nil
-}
diff --git a/pkg/controller/integrationcontext/initialize.go b/pkg/controller/integrationcontext/initialize.go
index 80b9452..f84ee44 100644
--- a/pkg/controller/integrationcontext/initialize.go
+++ b/pkg/controller/integrationcontext/initialize.go
@@ -22,6 +22,7 @@ import (
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/apache/camel-k/pkg/platform"
+	"github.com/apache/camel-k/pkg/trait"
 	"github.com/apache/camel-k/pkg/util/digest"
 	"github.com/sirupsen/logrus"
 )
@@ -52,10 +53,15 @@ func (action *initializeAction) Handle(ctx context.Context, ictx *v1alpha1.Integ
 
 	target := ictx.DeepCopy()
 
-	// by default the context should be build
-	target.Status.Phase = v1alpha1.IntegrationContextPhaseBuilding
+	_, err := trait.Apply(ctx, action.client, nil, target)
+	if err != nil {
+		return err
+	}
 
-	if target.Spec.Image != "" {
+	if target.Spec.Image == "" {
+		// by default the context should be build
+		target.Status.Phase = v1alpha1.IntegrationContextPhaseBuilding
+	} else {
 		// but in case it has been created from an image, mark the
 		// context as ready
 		target.Status.Phase = v1alpha1.IntegrationContextPhaseReady
diff --git a/pkg/platform/images/images.go b/pkg/platform/images/images.go
index da65856..03278ab 100644
--- a/pkg/platform/images/images.go
+++ b/pkg/platform/images/images.go
@@ -19,9 +19,9 @@ package images
 
 import (
 	"fmt"
-	"github.com/apache/camel-k/pkg/util/camel"
 	"strings"
 
+	"github.com/apache/camel-k/pkg/util/camel"
 	"github.com/apache/camel-k/version"
 )
 
@@ -85,7 +85,7 @@ func PredefinedImageNameFor(comp string) string {
 }
 
 func isInCamelCatalog(comp string) bool {
-	if _, ok := camel.Runtime.Artifacts["camel-" + comp]; ok {
+	if _, ok := camel.Runtime.Artifacts["camel-"+comp]; ok {
 		return true
 	}
 	return false
diff --git a/pkg/trait/catalog.go b/pkg/trait/catalog.go
index 47decb0..0984975 100644
--- a/pkg/trait/catalog.go
+++ b/pkg/trait/catalog.go
@@ -38,6 +38,7 @@ type Catalog struct {
 	tRoute        Trait
 	tIngress      Trait
 	tOwner        Trait
+	tImages       Trait
 	tBuilder      Trait
 	tSpringBoot   Trait
 	tIstio        Trait
@@ -56,6 +57,7 @@ func NewCatalog(ctx context.Context, c client.Client) *Catalog {
 		tRoute:        newRouteTrait(),
 		tIngress:      newIngressTrait(),
 		tOwner:        newOwnerTrait(),
+		tImages:       newImagesTrait(),
 		tBuilder:      newBuilderTrait(),
 		tSpringBoot:   newSpringBootTrait(),
 		tIstio:        newIstioTrait(),
@@ -84,6 +86,7 @@ func (c *Catalog) allTraits() []Trait {
 		c.tRoute,
 		c.tIngress,
 		c.tOwner,
+		c.tImages,
 		c.tBuilder,
 		c.tSpringBoot,
 		c.tIstio,
@@ -98,6 +101,7 @@ func (c *Catalog) traitsFor(environment *Environment) []Trait {
 		return []Trait{
 			c.tDebug,
 			c.tDependencies,
+			c.tImages,
 			c.tBuilder,
 			c.tEnvironment,
 			c.tClasspath,
@@ -111,6 +115,7 @@ func (c *Catalog) traitsFor(environment *Environment) []Trait {
 		return []Trait{
 			c.tDebug,
 			c.tDependencies,
+			c.tImages,
 			c.tBuilder,
 			c.tEnvironment,
 			c.tClasspath,
@@ -124,6 +129,7 @@ func (c *Catalog) traitsFor(environment *Environment) []Trait {
 		return []Trait{
 			c.tDebug,
 			c.tDependencies,
+			c.tImages,
 			c.tBuilder,
 			c.tEnvironment,
 			c.tClasspath,
diff --git a/pkg/trait/images.go b/pkg/trait/images.go
new file mode 100644
index 0000000..3ed4c0b
--- /dev/null
+++ b/pkg/trait/images.go
@@ -0,0 +1,65 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+*/
+
+package trait
+
+import (
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/platform/images"
+)
+
+type imagesTrait struct {
+	BaseTrait `property:",squash"`
+}
+
+func newImagesTrait() *imagesTrait {
+	return &imagesTrait{
+		BaseTrait: BaseTrait{
+			id: ID("images"),
+		},
+	}
+}
+
+func (t *imagesTrait) Configure(e *Environment) (bool, error) {
+	if t.Enabled == nil || !*t.Enabled {
+		// Disabled by default
+		return false, nil
+	}
+
+	if e.IntegrationContextInPhase("") {
+		return true, nil
+	}
+
+	return false, nil
+}
+
+func (t *imagesTrait) Apply(e *Environment) error {
+	// Try to lookup a image from predefined images
+	image := images.LookupPredefinedImage(e.Context.Spec.Dependencies)
+	if image == "" {
+		return nil
+	}
+
+	// Change the context type to external
+	if e.Context.Labels == nil {
+		e.Context.Labels = make(map[string]string)
+	}
+	e.Context.Labels["camel.apache.org/context.type"] = v1alpha1.IntegrationContextTypeExternal
+
+	e.Context.Spec.Image = image
+	return nil
+}