Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(trait): Fail IntegrationKit when custom task defined with build strategy routine #4649

Merged
merged 1 commit into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 29 additions & 6 deletions pkg/trait/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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",
},
Expand All @@ -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",
},
Expand All @@ -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",
Expand All @@ -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",
},
Expand All @@ -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
}

Expand Down
72 changes: 62 additions & 10 deletions pkg/trait/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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{
Expand All @@ -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")

Expand All @@ -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")

Expand All @@ -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 {
Expand All @@ -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"

Expand Down
Loading