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 2018/11/23 10:22:25 UTC

[camel-k] branch master updated: Trigger context update when build finishes #113

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


The following commit(s) were added to refs/heads/master by this push:
     new 80479d4  Trigger context update when build finishes #113
80479d4 is described below

commit 80479d4501c0e0383fcd639fc5ec60bc114fff2c
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Thu Nov 22 19:51:11 2018 +0100

    Trigger context update when build finishes #113
---
 pkg/builder/builder.go                 | 18 +++++++--------
 pkg/builder/builder_steps.go           | 34 ++++++++++++++++++++++++++++
 pkg/builder/builder_types.go           | 41 ++++++++++++----------------------
 pkg/builder/kaniko/kaniko.go           |  1 +
 pkg/builder/kaniko/publisher.go        | 12 +++++-----
 pkg/builder/s2i/publisher.go           | 10 ++++-----
 pkg/builder/s2i/s2i.go                 |  1 +
 pkg/stub/action/context/build.go       |  2 +-
 pkg/trait/builder_test.go              |  4 ++--
 test/build_manager_integration_test.go | 22 +++++++++---------
 10 files changed, 85 insertions(+), 60 deletions(-)

diff --git a/pkg/builder/builder.go b/pkg/builder/builder.go
index 7b2e580..1e120f6 100644
--- a/pkg/builder/builder.go
+++ b/pkg/builder/builder.go
@@ -66,7 +66,7 @@ func (b *defaultBuilder) Submit(request Request) Result {
 		go b.loop()
 	}
 
-	result, present := b.request.Load(request.Identifier)
+	result, present := b.request.Load(request.Meta.Name)
 	if !present || result == nil {
 		result = Result{
 			Request: request,
@@ -75,7 +75,7 @@ func (b *defaultBuilder) Submit(request Request) Result {
 
 		b.log.Infof("submitting request: %+v", request)
 
-		b.request.Store(request.Identifier, result)
+		b.request.Store(request.Meta.Name, result)
 		b.requests <- request
 	}
 
@@ -84,7 +84,7 @@ func (b *defaultBuilder) Submit(request Request) Result {
 
 // Purge --
 func (b *defaultBuilder) Purge(request Request) {
-	b.request.Delete(request.Identifier)
+	b.request.Delete(request.Meta.Name)
 }
 
 // ********************************
@@ -113,9 +113,9 @@ func (b *defaultBuilder) loop() {
 }
 
 func (b *defaultBuilder) submit(request Request) {
-	result, present := b.request.Load(request.Identifier)
+	result, present := b.request.Load(request.Meta.Name)
 	if !present || result == nil {
-		b.log.Panicf("no info found for: %+v", request.Identifier)
+		b.log.Panicf("no info found for: %+v", request.Meta.Name)
 	}
 
 	// update the status
@@ -138,7 +138,7 @@ func (b *defaultBuilder) submit(request Request) {
 	defer os.RemoveAll(builderPath)
 
 	// update the cache
-	b.request.Store(request.Identifier, r)
+	b.request.Store(request.Meta.Name, r)
 
 	c := Context{
 		C:         b.ctx,
@@ -164,7 +164,7 @@ func (b *defaultBuilder) submit(request Request) {
 			l := b.log.WithFields(logrus.Fields{
 				"step":    step.ID(),
 				"phase":   step.Phase(),
-				"request": request.Identifier.String(),
+				"context": request.Meta.Name,
 			})
 
 			l.Infof("executing step")
@@ -195,7 +195,7 @@ func (b *defaultBuilder) submit(request Request) {
 	}
 
 	// update the cache
-	b.request.Store(request.Identifier, r)
+	b.request.Store(request.Meta.Name, r)
 
-	b.log.Infof("request %s:%s executed in %f seconds", r.Request.Identifier.Name, r.Request.Identifier.Qualifier, r.Task.Elapsed().Seconds())
+	b.log.Infof("request to build context %s executed in %f seconds", request.Meta.Name, r.Task.Elapsed().Seconds())
 }
diff --git a/pkg/builder/builder_steps.go b/pkg/builder/builder_steps.go
index 975326e..b339d1d 100644
--- a/pkg/builder/builder_steps.go
+++ b/pkg/builder/builder_steps.go
@@ -25,6 +25,8 @@ import (
 	"path"
 	"strings"
 
+	"github.com/rs/xid"
+
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/operator-framework/operator-sdk/pkg/sdk"
 
@@ -294,3 +296,35 @@ func FindBestImage(images []PublishedImage, entries []v1alpha1.Artifact) (*Publi
 
 	return &bestImage, bestImageCommonLibs
 }
+
+// Notify --
+func Notify(ctx *Context) error {
+	c := v1alpha1.IntegrationContext{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       v1alpha1.IntegrationContextKind,
+			APIVersion: v1alpha1.SchemeGroupVersion.String(),
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: ctx.Namespace,
+			Name:      ctx.Request.Meta.Name,
+		},
+	}
+
+	if err := sdk.Get(&c); err != nil {
+		return err
+	}
+
+	t := c.DeepCopy()
+	if t.Annotations == nil {
+		t.Annotations = make(map[string]string)
+	}
+
+	// Add a random ID to trigger update
+	t.Annotations["camel.apache.org/build.id"] = xid.New().String()
+
+	if err := sdk.Update(t); err != nil {
+		return err
+	}
+
+	return nil
+}
diff --git a/pkg/builder/builder_types.go b/pkg/builder/builder_types.go
index 0cf38ed..000425f 100644
--- a/pkg/builder/builder_types.go
+++ b/pkg/builder/builder_types.go
@@ -20,8 +20,11 @@ package builder
 import (
 	"context"
 	"fmt"
+	"math"
 	"time"
 
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	"github.com/apache/camel-k/pkg/util/maven"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
@@ -29,13 +32,15 @@ import (
 
 const (
 	// ProjectGenerationPhase --
-	ProjectGenerationPhase int = 10
+	ProjectGenerationPhase int32 = 10
 	// ProjectBuildPhase --
-	ProjectBuildPhase int = 20
+	ProjectBuildPhase int32 = 20
 	// ApplicationPackagePhase --
-	ApplicationPackagePhase int = 30
+	ApplicationPackagePhase int32 = 30
 	// ApplicationPublishPhase --
-	ApplicationPublishPhase int = 40
+	ApplicationPublishPhase int32 = 40
+	// NotifyPhase --
+	NotifyPhase int32 = math.MaxInt32
 )
 
 // Builder --
@@ -47,13 +52,13 @@ type Builder interface {
 // Step --
 type Step interface {
 	ID() string
-	Phase() int
+	Phase() int32
 	Execute(*Context) error
 }
 
 type stepWrapper struct {
 	id    string
-	phase int
+	phase int32
 	task  func(*Context) error
 }
 
@@ -65,7 +70,7 @@ func (s *stepWrapper) ID() string {
 	return s.id
 }
 
-func (s *stepWrapper) Phase() int {
+func (s *stepWrapper) Phase() int32 {
 	return s.phase
 }
 
@@ -74,7 +79,7 @@ func (s *stepWrapper) Execute(ctx *Context) error {
 }
 
 // NewStep --
-func NewStep(ID string, phase int, task func(*Context) error) Step {
+func NewStep(ID string, phase int32, task func(*Context) error) Step {
 	s := stepWrapper{
 		id:    ID,
 		phase: phase,
@@ -84,27 +89,9 @@ func NewStep(ID string, phase int, task func(*Context) error) Step {
 	return &s
 }
 
-// NewIdentifierForContext --
-func NewIdentifierForContext(context *v1alpha1.IntegrationContext) Identifier {
-	return Identifier{
-		Name:      "context-" + context.Name,
-		Qualifier: context.ResourceVersion,
-	}
-}
-
-// Identifier --
-type Identifier struct {
-	Name      string
-	Qualifier string
-}
-
-func (r *Identifier) String() string {
-	return r.Name + ":" + r.Qualifier
-}
-
 // Request --
 type Request struct {
-	Identifier   Identifier
+	Meta         v1.ObjectMeta
 	Platform     v1alpha1.IntegrationPlatformSpec
 	Code         v1alpha1.SourceSpec
 	Dependencies []string
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/builder/kaniko/kaniko.go
index 33d8e4f..a9b4a0c 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/builder/kaniko/kaniko.go
@@ -27,6 +27,7 @@ var DefaultSteps = []builder.Step{
 	builder.NewStep("build/compute-dependencies", builder.ProjectBuildPhase, builder.ComputeDependencies),
 	builder.NewStep("packager", builder.ApplicationPackagePhase, builder.StandardPackager),
 	builder.NewStep("publisher/kaniko", builder.ApplicationPublishPhase, Publisher),
+	builder.NewStep("notify", builder.NotifyPhase, builder.Notify),
 }
 
 // BuildDir is the directory where to build artifacts (shared with the Kaniko pod)
diff --git a/pkg/builder/kaniko/publisher.go b/pkg/builder/kaniko/publisher.go
index 823d13c..88ef68a 100644
--- a/pkg/builder/kaniko/publisher.go
+++ b/pkg/builder/kaniko/publisher.go
@@ -38,7 +38,7 @@ func Publisher(ctx *builder.Context) error {
 	if organization == "" {
 		organization = ctx.Namespace
 	}
-	image := ctx.Request.Platform.Build.Registry + "/" + organization + "/camel-k-" + ctx.Request.Identifier.Name + ":" + ctx.Request.Identifier.Qualifier
+	image := ctx.Request.Platform.Build.Registry + "/" + organization + "/camel-k-" + ctx.Request.Meta.Name + ":" + ctx.Request.Meta.ResourceVersion
 	baseDir, _ := path.Split(ctx.Archive)
 	contextDir := path.Join(baseDir, "context")
 	if err := tar.Extract(ctx.Archive, contextDir); err != nil {
@@ -88,7 +88,7 @@ func Publisher(ctx *builder.Context) error {
 			},
 		})
 		volumeMounts = append(volumeMounts, v1.VolumeMount{
-			Name: "kaniko-secret",
+			Name:      "kaniko-secret",
 			MountPath: "/secret",
 		})
 		envs = append(envs, v1.EnvVar{
@@ -105,14 +105,14 @@ func Publisher(ctx *builder.Context) error {
 		},
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: ctx.Namespace,
-			Name:      "camel-k-" + ctx.Request.Identifier.Name,
+			Name:      "camel-k-" + ctx.Request.Meta.Name,
 		},
 		Spec: v1.PodSpec{
 			Containers: []v1.Container{
 				{
-					Name:  "kaniko",
-					Image: "gcr.io/kaniko-project/executor@sha256:f29393d9c8d40296e1692417089aa2023494bce9afd632acac7dd0aea763e5bc",
-					Args: args,
+					Name:         "kaniko",
+					Image:        "gcr.io/kaniko-project/executor@sha256:f29393d9c8d40296e1692417089aa2023494bce9afd632acac7dd0aea763e5bc",
+					Args:         args,
 					Env:          envs,
 					VolumeMounts: volumeMounts,
 				},
diff --git a/pkg/builder/s2i/publisher.go b/pkg/builder/s2i/publisher.go
index e6b0d92..68cd60f 100644
--- a/pkg/builder/s2i/publisher.go
+++ b/pkg/builder/s2i/publisher.go
@@ -45,7 +45,7 @@ func Publisher(ctx *builder.Context) error {
 			Kind:       "BuildConfig",
 		},
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      "camel-k-" + ctx.Request.Identifier.Name,
+			Name:      "camel-k-" + ctx.Request.Meta.Name,
 			Namespace: ctx.Namespace,
 		},
 		Spec: buildv1.BuildConfigSpec{
@@ -64,7 +64,7 @@ func Publisher(ctx *builder.Context) error {
 				Output: buildv1.BuildOutput{
 					To: &v1.ObjectReference{
 						Kind: "ImageStreamTag",
-						Name: "camel-k-" + ctx.Request.Identifier.Name + ":" + ctx.Request.Identifier.Qualifier,
+						Name: "camel-k-" + ctx.Request.Meta.Name + ":" + ctx.Request.Meta.ResourceVersion,
 					},
 				},
 			},
@@ -83,7 +83,7 @@ func Publisher(ctx *builder.Context) error {
 			Kind:       "ImageStream",
 		},
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      "camel-k-" + ctx.Request.Identifier.Name,
+			Name:      "camel-k-" + ctx.Request.Meta.Name,
 			Namespace: ctx.Namespace,
 		},
 		Spec: imagev1.ImageStreamSpec{
@@ -113,7 +113,7 @@ func Publisher(ctx *builder.Context) error {
 		Namespace(ctx.Namespace).
 		Body(resource).
 		Resource("buildconfigs").
-		Name("camel-k-" + ctx.Request.Identifier.Name).
+		Name("camel-k-" + ctx.Request.Meta.Name).
 		SubResource("instantiatebinary").
 		Do()
 
@@ -159,7 +159,7 @@ func Publisher(ctx *builder.Context) error {
 		return errors.New("dockerImageRepository not available in ImageStream")
 	}
 
-	ctx.Image = is.Status.DockerImageRepository + ":" + ctx.Request.Identifier.Qualifier
+	ctx.Image = is.Status.DockerImageRepository + ":" + ctx.Request.Meta.ResourceVersion
 
 	return nil
 }
diff --git a/pkg/builder/s2i/s2i.go b/pkg/builder/s2i/s2i.go
index e8854fe..4d50797 100644
--- a/pkg/builder/s2i/s2i.go
+++ b/pkg/builder/s2i/s2i.go
@@ -25,4 +25,5 @@ var DefaultSteps = []builder.Step{
 	builder.NewStep("build/compute-dependencies", builder.ProjectBuildPhase, builder.ComputeDependencies),
 	builder.NewStep("packager/incremental", builder.ApplicationPackagePhase, builder.IncrementalPackager),
 	builder.NewStep("publisher/s2i", builder.ApplicationPublishPhase, Publisher),
+	builder.NewStep("notify", builder.NotifyPhase, builder.Notify),
 }
diff --git a/pkg/stub/action/context/build.go b/pkg/stub/action/context/build.go
index d97cfce..2b85770 100644
--- a/pkg/stub/action/context/build.go
+++ b/pkg/stub/action/context/build.go
@@ -62,7 +62,7 @@ func (action *buildAction) Handle(context *v1alpha1.IntegrationContext) error {
 	}
 
 	r := builder.Request{
-		Identifier:   builder.NewIdentifierForContext(context),
+		Meta:         context.ObjectMeta,
 		Dependencies: context.Spec.Dependencies,
 		Steps:        env.Steps,
 		Platform:     env.Platform.Spec,
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index ef35e96..f26f010 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -77,7 +77,7 @@ func TestS2IBuilderTrait(t *testing.T) {
 	assert.NotEmpty(t, env.ExecutedTraits)
 	assert.Contains(t, env.ExecutedTraits, ID("builder"))
 	assert.NotEmpty(t, env.Steps)
-	assert.Len(t, env.Steps, 4)
+	assert.Len(t, env.Steps, 5)
 	assert.Condition(t, func() bool {
 		for _, s := range env.Steps {
 			if s.ID() == "publisher/s2i" && s.Phase() == builder.ApplicationPublishPhase {
@@ -97,7 +97,7 @@ func TestKanikoBuilderTrait(t *testing.T) {
 	assert.NotEmpty(t, env.ExecutedTraits)
 	assert.Contains(t, env.ExecutedTraits, ID("builder"))
 	assert.NotEmpty(t, env.Steps)
-	assert.Len(t, env.Steps, 4)
+	assert.Len(t, env.Steps, 5)
 	assert.Condition(t, func() bool {
 		for _, s := range env.Steps {
 			if s.ID() == "publisher/kaniko" && s.Phase() == builder.ApplicationPublishPhase {
diff --git a/test/build_manager_integration_test.go b/test/build_manager_integration_test.go
index 63fcc12..09bc0e7 100644
--- a/test/build_manager_integration_test.go
+++ b/test/build_manager_integration_test.go
@@ -26,11 +26,11 @@ import (
 	"testing"
 	"time"
 
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/apache/camel-k/pkg/builder"
 	"github.com/apache/camel-k/pkg/builder/s2i"
-	"github.com/apache/camel-k/pkg/util/digest"
-
 	"github.com/stretchr/testify/assert"
 )
 
@@ -40,9 +40,9 @@ func TestBuildManagerBuild(t *testing.T) {
 	b := builder.New(ctx, namespace)
 
 	r := builder.Request{
-		Identifier: builder.Identifier{
-			Name:      "man-test",
-			Qualifier: digest.Random(),
+		Meta: v1.ObjectMeta{
+			Name:            "man-test",
+			ResourceVersion: "1",
 		},
 		Code: v1alpha1.SourceSpec{
 			Content: createTimerToLogIntegrationCode(),
@@ -51,7 +51,8 @@ func TestBuildManagerBuild(t *testing.T) {
 			"mvn:org.apache.camel/camel-core",
 			"camel:telegram",
 		},
-		Steps: s2i.DefaultSteps,
+		// to not include notify step
+		Steps: s2i.DefaultSteps[:len(s2i.DefaultSteps)-1],
 	}
 
 	b.Submit(r)
@@ -78,9 +79,9 @@ func TestBuildManagerFailedBuild(t *testing.T) {
 	b := builder.New(ctx, namespace)
 
 	r := builder.Request{
-		Identifier: builder.Identifier{
-			Name:      "man-test",
-			Qualifier: digest.Random(),
+		Meta: v1.ObjectMeta{
+			Name:            "man-test",
+			ResourceVersion: "1",
 		},
 		Code: v1alpha1.SourceSpec{
 			Content: createTimerToLogIntegrationCode(),
@@ -88,7 +89,8 @@ func TestBuildManagerFailedBuild(t *testing.T) {
 		Dependencies: []string{
 			"mvn:org.apache.camel/camel-cippalippa",
 		},
-		Steps: s2i.DefaultSteps,
+		// to not include notify step
+		Steps: s2i.DefaultSteps[:len(s2i.DefaultSteps)-1],
 	}
 
 	b.Submit(r)