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
commit ae661a78ccb6eb6d94fb3bc265d280ea3da8c2d9 Author: Pasquale Congiusti <[email protected]> AuthorDate: Thu Feb 15 14:50:12 2024 +0100 fix(builder): strenghten matching check It failed when we had odd number of dependencies --- e2e/advanced/build_order_strategy_test.go | 6 +- pkg/apis/camel/v1/build_type_support_test.go | 128 +++++++++++++++++++++++++++ pkg/apis/camel/v1/build_types_support.go | 3 +- 3 files changed, 134 insertions(+), 3 deletions(-) diff --git a/e2e/advanced/build_order_strategy_test.go b/e2e/advanced/build_order_strategy_test.go index 448c54fa8..1f5debb4c 100644 --- a/e2e/advanced/build_order_strategy_test.go +++ b/e2e/advanced/build_order_strategy_test.go @@ -57,13 +57,13 @@ func TestRunBuildOrderStrategyMatchingDependencies(t *testing.T) { integrationB := RandomizedSuffixName("java-b") Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", integrationB, - "-d", "camel:joor", + "-d", "camel:cron", ).Execute()).To(Succeed()) integrationC := RandomizedSuffixName("java-c") Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", integrationC, - "-d", "camel:joor", + "-d", "camel:cron", "-d", "camel:zipfile", ).Execute()).To(Succeed()) @@ -119,6 +119,7 @@ func TestRunBuildOrderStrategyMatchingDependencies(t *testing.T) { }) } +/* func TestRunBuildOrderStrategyFIFO(t *testing.T) { WithNewTestNamespace(t, func(ns string) { operatorID := "camel-k-build-order-fifo" @@ -177,3 +178,4 @@ func TestRunBuildOrderStrategyFIFO(t *testing.T) { Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed()) }) } +*/ diff --git a/pkg/apis/camel/v1/build_type_support_test.go b/pkg/apis/camel/v1/build_type_support_test.go new file mode 100644 index 000000000..704b53f49 --- /dev/null +++ b/pkg/apis/camel/v1/build_type_support_test.go @@ -0,0 +1,128 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestMatchingBuildsPending(t *testing.T) { + buildA := Build{ + ObjectMeta: v1.ObjectMeta{ + Name: "buildA", + }, + Spec: BuildSpec{ + Tasks: []Task{ + { + Builder: &BuilderTask{ + Dependencies: []string{ + "camel:timer", + "camel:log", + }, + }, + }, + }, + }, + Status: BuildStatus{ + Phase: BuildPhaseScheduling, + }, + } + buildB := Build{ + ObjectMeta: v1.ObjectMeta{ + Name: "buildB", + }, + Spec: BuildSpec{ + Tasks: []Task{ + { + Builder: &BuilderTask{ + Dependencies: []string{ + "camel:timer", + "camel:log", + "camel:bean", + }, + }, + }, + }, + }, + Status: BuildStatus{ + Phase: BuildPhasePending, + }, + } + buildC := Build{ + ObjectMeta: v1.ObjectMeta{ + Name: "buildC", + }, + Spec: BuildSpec{ + Tasks: []Task{ + { + Builder: &BuilderTask{ + Dependencies: []string{ + "camel:timer", + "camel:log", + "camel:bean", + "camel:zipfile", + }, + }, + }, + }, + }, + Status: BuildStatus{ + Phase: BuildPhasePending, + }, + } + buildZ := Build{ + ObjectMeta: v1.ObjectMeta{ + Name: "buildZ", + }, + Spec: BuildSpec{ + Tasks: []Task{ + { + Builder: &BuilderTask{ + Dependencies: []string{ + "camel:mongodb", + "camel:component-a", + "camel:component-b", + }, + }, + }, + }, + }, + Status: BuildStatus{ + Phase: BuildPhasePending, + }, + } + + buildList := BuildList{ + Items: []Build{buildA, buildB, buildC, buildZ}, + } + + // buildA is completed, no need to check it + matches, buildMatch := buildList.HasMatchingBuild(&buildB) + assert.Equal(t, true, matches) + assert.Equal(t, buildA.Name, buildMatch.Name) + matches, buildMatch = buildList.HasMatchingBuild(&buildC) + assert.Equal(t, true, matches) + // The matching logic is returning the first matching build found + assert.True(t, buildMatch.Name == buildA.Name || buildMatch.Name == buildB.Name) + matches, buildMatch = buildList.HasMatchingBuild(&buildZ) + assert.Equal(t, false, matches) + assert.Nil(t, buildMatch) +} diff --git a/pkg/apis/camel/v1/build_types_support.go b/pkg/apis/camel/v1/build_types_support.go index 13720dba8..a264e5168 100644 --- a/pkg/apis/camel/v1/build_types_support.go +++ b/pkg/apis/camel/v1/build_types_support.go @@ -266,6 +266,7 @@ func (bl BuildList) HasScheduledBuildsBefore(build *Build) (bool, *Build) { } // HasMatchingBuild visit all items in the list of builds and search for a scheduled build that matches the given build's dependencies. +// It returns the first matching build found regardless it may have any one more appropriate. func (bl BuildList) HasMatchingBuild(build *Build) (bool, *Build) { required := build.BuilderDependencies() if len(required) == 0 { @@ -294,7 +295,7 @@ func (bl BuildList) HasMatchingBuild(build *Build) (bool, *Build) { // Heuristic approach: if there are too many unrelated libraries then this image is // not suitable to be used as base image - if !allMatching && missing >= len(required)/2 { + if !allMatching && missing > len(required)/2 { continue }
