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 <gaelle.fournier.w...@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"
 

Reply via email to