You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2023/08/09 09:35:14 UTC

[camel-k] branch main updated: feat(trait): Fail IntKit when custom task on build strategy routine

This is an automated email from the ASF dual-hosted git repository.

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/main by this push:
     new 308ca76c1 feat(trait): Fail IntKit when custom task on build strategy routine
308ca76c1 is described below

commit 308ca76c1fe406144cfd6013275df583b9a686c4
Author: Gaelle Fournier <ga...@gmail.com>
AuthorDate: Fri Aug 4 11:47:19 2023 +0200

    feat(trait): Fail IntKit when custom task on build strategy routine
    
    Ref #4558
---
 pkg/trait/builder.go      | 35 +++++++++++++++++++----
 pkg/trait/builder_test.go | 72 ++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 91 insertions(+), 16 deletions(-)

diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index d42922e44..c9fc315c2 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -67,6 +67,8 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 }
 
 func (t *builderTrait) Apply(e *Environment) error {
+	// local pipeline tasks
+	var pipelineTasks []v1.Task
 	// Building task
 	builderTask, err := t.builderTask(e)
 	if err != nil {
@@ -78,17 +80,36 @@ func (t *builderTrait) Apply(e *Environment) error {
 		}
 		return nil
 	}
-	e.Pipeline = append(e.Pipeline, v1.Task{Builder: builderTask})
+
+	pipelineTasks = append(pipelineTasks, v1.Task{Builder: builderTask})
 
 	// Custom tasks
 	if t.Tasks != nil {
-		e.Pipeline = append(e.Pipeline, t.customTasks()...)
+		realBuildStrategy := builderTask.Configuration.Strategy
+		if realBuildStrategy == "" {
+			realBuildStrategy = e.Platform.Status.Build.BuildConfiguration.Strategy
+		}
+		if len(t.Tasks) > 0 && realBuildStrategy != v1.BuildStrategyPod {
+			e.IntegrationKit.Status.Phase = v1.IntegrationKitPhaseError
+			e.IntegrationKit.Status.SetCondition("IntegrationKitTasksValid",
+				corev1.ConditionFalse,
+				"IntegrationKitTasksValid",
+				fmt.Sprintf("Pipeline tasks unavailable when using `%s` platform build strategy: use `%s` instead.",
+					realBuildStrategy,
+					v1.BuildStrategyPod),
+			)
+			if err := e.Client.Status().Update(e.Ctx, e.IntegrationKit); err != nil {
+				return err
+			}
+			return nil
+		}
+		pipelineTasks = append(pipelineTasks, t.customTasks()...)
 	}
 
 	// Publishing task
 	switch e.Platform.Status.Build.PublishStrategy {
 	case v1.IntegrationPlatformBuildPublishStrategySpectrum:
-		e.Pipeline = append(e.Pipeline, v1.Task{Spectrum: &v1.SpectrumTask{
+		pipelineTasks = append(pipelineTasks, v1.Task{Spectrum: &v1.SpectrumTask{
 			BaseTask: v1.BaseTask{
 				Name: "spectrum",
 			},
@@ -100,7 +121,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 		}})
 
 	case v1.IntegrationPlatformBuildPublishStrategyS2I:
-		e.Pipeline = append(e.Pipeline, v1.Task{S2i: &v1.S2iTask{
+		pipelineTasks = append(pipelineTasks, v1.Task{S2i: &v1.S2iTask{
 			BaseTask: v1.BaseTask{
 				Name: "s2i",
 			},
@@ -121,7 +142,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 			executorImage = image
 			t.L.Infof("User defined executor image %s will be used for buildah", image)
 		}
-		e.Pipeline = append(e.Pipeline, v1.Task{Buildah: &v1.BuildahTask{
+		pipelineTasks = append(pipelineTasks, v1.Task{Buildah: &v1.BuildahTask{
 			Platform: platform,
 			BaseTask: v1.BaseTask{
 				Name: "buildah",
@@ -144,7 +165,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 			t.L.Infof("User defined executor image %s will be used for kaniko", image)
 		}
 
-		e.Pipeline = append(e.Pipeline, v1.Task{Kaniko: &v1.KanikoTask{
+		pipelineTasks = append(pipelineTasks, v1.Task{Kaniko: &v1.KanikoTask{
 			BaseTask: v1.BaseTask{
 				Name: "kaniko",
 			},
@@ -160,6 +181,8 @@ func (t *builderTrait) Apply(e *Environment) error {
 			ExecutorImage: executorImage,
 		}})
 	}
+	// add local pipeline tasks to env pipeline
+	e.Pipeline = append(e.Pipeline, pipelineTasks...)
 	return nil
 }
 
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index a260c18a0..95702bbc8 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -36,8 +36,8 @@ import (
 
 func TestBuilderTraitNotAppliedBecauseOfNilKit(t *testing.T) {
 	environments := []*Environment{
-		createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, v1.IntegrationPlatformBuildPublishStrategyS2I),
-		createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko),
+		createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, v1.IntegrationPlatformBuildPublishStrategyS2I, v1.BuildStrategyRoutine),
+		createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine),
 	}
 
 	for _, e := range environments {
@@ -57,8 +57,8 @@ func TestBuilderTraitNotAppliedBecauseOfNilKit(t *testing.T) {
 
 func TestBuilderTraitNotAppliedBecauseOfNilPhase(t *testing.T) {
 	environments := []*Environment{
-		createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, v1.IntegrationPlatformBuildPublishStrategyS2I),
-		createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko),
+		createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, v1.IntegrationPlatformBuildPublishStrategyS2I, v1.BuildStrategyRoutine),
+		createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine),
 	}
 
 	for _, e := range environments {
@@ -77,7 +77,7 @@ func TestBuilderTraitNotAppliedBecauseOfNilPhase(t *testing.T) {
 }
 
 func TestS2IBuilderTrait(t *testing.T) {
-	env := createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, v1.IntegrationPlatformBuildPublishStrategyS2I)
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, v1.IntegrationPlatformBuildPublishStrategyS2I, v1.BuildStrategyRoutine)
 	err := NewBuilderTestCatalog().apply(env)
 
 	assert.Nil(t, err)
@@ -90,7 +90,7 @@ func TestS2IBuilderTrait(t *testing.T) {
 }
 
 func TestKanikoBuilderTrait(t *testing.T) {
-	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko)
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine)
 	err := NewBuilderTestCatalog().apply(env)
 
 	assert.Nil(t, err)
@@ -102,7 +102,7 @@ func TestKanikoBuilderTrait(t *testing.T) {
 	assert.NotNil(t, env.Pipeline[1].Kaniko)
 }
 
-func createBuilderTestEnv(cluster v1.IntegrationPlatformCluster, strategy v1.IntegrationPlatformBuildPublishStrategy) *Environment {
+func createBuilderTestEnv(cluster v1.IntegrationPlatformCluster, strategy v1.IntegrationPlatformBuildPublishStrategy, buildStrategy v1.BuildStrategy) *Environment {
 	c, err := camel.DefaultCatalog()
 	if err != nil {
 		panic(err)
@@ -136,6 +136,9 @@ func createBuilderTestEnv(cluster v1.IntegrationPlatformCluster, strategy v1.Int
 					RuntimeVersion:         defaults.DefaultRuntimeVersion,
 					RuntimeProvider:        v1.RuntimeProviderQuarkus,
 					PublishStrategyOptions: map[string]string{},
+					BuildConfiguration: v1.BuildConfiguration{
+						Strategy: buildStrategy,
+					},
 				},
 			},
 			Status: v1.IntegrationPlatformStatus{
@@ -157,7 +160,7 @@ func NewBuilderTestCatalog() *Catalog {
 }
 
 func TestMavenPropertyBuilderTrait(t *testing.T) {
-	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko)
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine)
 	builderTrait := createNominalBuilderTraitTest()
 	builderTrait.Properties = append(builderTrait.Properties, "build-time-prop1=build-time-value1")
 
@@ -175,7 +178,7 @@ func createNominalBuilderTraitTest() *builderTrait {
 }
 
 func TestCustomTaskBuilderTrait(t *testing.T) {
-	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategySpectrum)
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategySpectrum, v1.BuildStrategyPod)
 	builderTrait := createNominalBuilderTraitTest()
 	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
 
@@ -194,6 +197,55 @@ func TestCustomTaskBuilderTrait(t *testing.T) {
 	assert.Equal(t, "ls", customTask.Custom.ContainerCommand)
 }
 
+func TestCustomTaskBuilderTraitValidStrategyOverride(t *testing.T) {
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategySpectrum, v1.BuildStrategyRoutine)
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
+	builderTrait.Strategy = "pod"
+
+	err := builderTrait.Apply(env)
+
+	assert.Nil(t, err)
+
+	builderTask := findCustomTaskByName(env.Pipeline, "builder")
+	publisherTask := findCustomTaskByName(env.Pipeline, "spectrum")
+	customTask := findCustomTaskByName(env.Pipeline, "test")
+	assert.NotNil(t, customTask)
+	assert.NotNil(t, builderTask)
+	assert.NotNil(t, publisherTask)
+	assert.Equal(t, 3, len(env.Pipeline))
+	assert.Equal(t, "test", customTask.Custom.Name)
+	assert.Equal(t, "alpine", customTask.Custom.ContainerImage)
+	assert.Equal(t, "ls", customTask.Custom.ContainerCommand)
+}
+
+func TestCustomTaskBuilderTraitInvalidStrategy(t *testing.T) {
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategySpectrum, v1.BuildStrategyRoutine)
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
+
+	err := builderTrait.Apply(env)
+
+	assert.NotNil(t, err)
+	assert.Equal(t, env.IntegrationKit.Status.Phase, v1.IntegrationKitPhaseError)
+	assert.Equal(t, env.IntegrationKit.Status.Conditions[0].Status, corev1.ConditionFalse)
+	assert.Equal(t, env.IntegrationKit.Status.Conditions[0].Type, v1.IntegrationKitConditionType("IntegrationKitTasksValid"))
+}
+
+func TestCustomTaskBuilderTraitInvalidStrategyOverride(t *testing.T) {
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategySpectrum, v1.BuildStrategyPod)
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
+	builderTrait.Strategy = "routine"
+
+	err := builderTrait.Apply(env)
+
+	assert.NotNil(t, err)
+	assert.Equal(t, env.IntegrationKit.Status.Phase, v1.IntegrationKitPhaseError)
+	assert.Equal(t, env.IntegrationKit.Status.Conditions[0].Status, corev1.ConditionFalse)
+	assert.Equal(t, env.IntegrationKit.Status.Conditions[0].Type, v1.IntegrationKitConditionType("IntegrationKitTasksValid"))
+}
+
 func findCustomTaskByName(tasks []v1.Task, name string) v1.Task {
 	for _, t := range tasks {
 		if t.Custom != nil && t.Custom.Name == name {
@@ -204,7 +256,7 @@ func findCustomTaskByName(tasks []v1.Task, name string) v1.Task {
 }
 
 func TestMavenProfileBuilderTrait(t *testing.T) {
-	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko)
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine)
 	builderTrait := createNominalBuilderTraitTest()
 	builderTrait.MavenProfile = "configmap:maven-profile/owasp-profile.xml"