From ffdf59b99962f123b0e3e0b5b01ebb8a170e3825 Mon Sep 17 00:00:00 2001 From: Gaelle Fournier Date: Fri, 4 Aug 2023 11:47:19 +0200 Subject: [PATCH] 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 d42922e44d..c9fc315c2b 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 a260c18a02..95702bbc80 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"