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/05/08 12:39:57 UTC
[camel-k] 07/07: fix(e2e): Improve max build limit E2E test
This is an automated email from the ASF dual-hosted git repository.
pcongiusti pushed a commit to branch release-1.12.x
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 1267b27b4716625e4db9d02494789a61c84df8cd
Author: Christoph Deppisch <cd...@redhat.com>
AuthorDate: Fri May 5 15:20:56 2023 +0200
fix(e2e): Improve max build limit E2E test
- Improve assertions on max parallel running builds
- Make sure to properly dump test namespaces on failure
---
e2e/global/builder/build_test.go | 151 +++++++++++++++++++++------------------
e2e/support/test_support.go | 12 ++++
2 files changed, 93 insertions(+), 70 deletions(-)
diff --git a/e2e/global/builder/build_test.go b/e2e/global/builder/build_test.go
index cc6338cae..6f289c775 100644
--- a/e2e/global/builder/build_test.go
+++ b/e2e/global/builder/build_test.go
@@ -23,6 +23,7 @@ limitations under the License.
package builder
import (
+ "errors"
"fmt"
"os"
"testing"
@@ -57,76 +58,86 @@ func TestKitMaxBuildLimit(t *testing.T) {
buildB := "integration-b"
buildC := "integration-c"
- ns1 := NewTestNamespace(false).GetName()
- defer DumpNamespace(t, ns1)
- defer DeleteNamespace(t, ns1)
-
- pl1 := v1.NewIntegrationPlatform(ns1, fmt.Sprintf("camel-k-%s", ns))
- pl.Spec.DeepCopyInto(&pl1.Spec)
- pl1.Spec.Build.Maven.Settings = v1.ValueSource{}
- pl1.SetOperatorID(fmt.Sprintf("camel-k-%s", ns))
- if err := TestClient().Create(TestContext, &pl1); err != nil {
- t.Error(err)
- t.FailNow()
- }
-
- Eventually(PlatformPhase(ns1), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
-
- ns2 := NewTestNamespace(false).GetName()
- defer DumpNamespace(t, ns2)
- defer DeleteNamespace(t, ns2)
-
- pl2 := v1.NewIntegrationPlatform(ns2, fmt.Sprintf("camel-k-%s", ns))
- pl.Spec.DeepCopyInto(&pl2.Spec)
- pl2.Spec.Build.Maven.Settings = v1.ValueSource{}
- pl2.SetOperatorID(fmt.Sprintf("camel-k-%s", ns))
- if err := TestClient().Create(TestContext, &pl2); err != nil {
- t.Error(err)
- t.FailNow()
- }
-
- Eventually(PlatformPhase(ns2), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
-
- doKitBuildInNamespace(buildA, ns, TestTimeoutShort, kitOptions{
- operatorID: fmt.Sprintf("camel-k-%s", ns),
- dependencies: []string{
- "camel:timer", "camel:log",
- },
- traits: []string{
- "builder.properties=build-property=A",
- },
- }, v1.BuildPhaseRunning, v1.IntegrationKitPhaseBuildRunning)
-
- doKitBuildInNamespace(buildB, ns1, TestTimeoutShort, kitOptions{
- operatorID: fmt.Sprintf("camel-k-%s", ns),
- dependencies: []string{
- "camel:timer", "camel:log",
- },
- traits: []string{
- "builder.properties=build-property=B",
- },
- }, v1.BuildPhaseRunning, v1.IntegrationKitPhaseBuildRunning)
-
- doKitBuildInNamespace(buildC, ns2, TestTimeoutShort, kitOptions{
- operatorID: fmt.Sprintf("camel-k-%s", ns),
- dependencies: []string{
- "camel:timer", "camel:log",
- },
- traits: []string{
- "builder.properties=build-property=C",
- },
- }, v1.BuildPhaseScheduling, v1.IntegrationKitPhaseNone)
-
- // verify that buildC is allowed to build as soon as buildA has finished
- Eventually(BuildPhase(ns, buildA), TestTimeoutLong).Should(Equal(v1.BuildPhaseSucceeded))
- Eventually(BuildPhase(ns2, buildC), TestTimeoutShort).Should(Equal(v1.BuildPhaseRunning))
- Eventually(KitPhase(ns2, buildC), TestTimeoutLong).Should(Equal(v1.IntegrationKitPhaseBuildRunning))
-
- // verify that all builds are successful
- Eventually(BuildPhase(ns1, buildB), TestTimeoutLong).Should(Equal(v1.BuildPhaseSucceeded))
- Eventually(KitPhase(ns1, buildB), TestTimeoutLong).Should(Equal(v1.IntegrationKitPhaseReady))
- Eventually(BuildPhase(ns2, buildC), TestTimeoutLong).Should(Equal(v1.BuildPhaseSucceeded))
- Eventually(KitPhase(ns2, buildC), TestTimeoutLong).Should(Equal(v1.IntegrationKitPhaseReady))
+ WithNewTestNamespace(t, func(ns1 string) {
+ WithNewTestNamespace(t, func(ns2 string) {
+ pl1 := v1.NewIntegrationPlatform(ns1, fmt.Sprintf("camel-k-%s", ns))
+ pl.Spec.DeepCopyInto(&pl1.Spec)
+ pl1.Spec.Build.Maven.Settings = v1.ValueSource{}
+ pl1.SetOperatorID(fmt.Sprintf("camel-k-%s", ns))
+ if err := TestClient().Create(TestContext, &pl1); err != nil {
+ t.Error(err)
+ t.FailNow()
+ }
+
+ Eventually(PlatformPhase(ns1), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
+
+ pl2 := v1.NewIntegrationPlatform(ns2, fmt.Sprintf("camel-k-%s", ns))
+ pl.Spec.DeepCopyInto(&pl2.Spec)
+ pl2.Spec.Build.Maven.Settings = v1.ValueSource{}
+ pl2.SetOperatorID(fmt.Sprintf("camel-k-%s", ns))
+ if err := TestClient().Create(TestContext, &pl2); err != nil {
+ t.Error(err)
+ t.FailNow()
+ }
+
+ Eventually(PlatformPhase(ns2), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
+
+ doKitBuildInNamespace(buildA, ns, TestTimeoutShort, kitOptions{
+ operatorID: fmt.Sprintf("camel-k-%s", ns),
+ dependencies: []string{
+ "camel:timer", "camel:log",
+ },
+ traits: []string{
+ "builder.properties=build-property=A",
+ },
+ }, v1.BuildPhaseRunning, v1.IntegrationKitPhaseBuildRunning)
+
+ doKitBuildInNamespace(buildB, ns1, TestTimeoutShort, kitOptions{
+ operatorID: fmt.Sprintf("camel-k-%s", ns),
+ dependencies: []string{
+ "camel:timer", "camel:log",
+ },
+ traits: []string{
+ "builder.properties=build-property=B",
+ },
+ }, v1.BuildPhaseRunning, v1.IntegrationKitPhaseBuildRunning)
+
+ doKitBuildInNamespace(buildC, ns2, TestTimeoutShort, kitOptions{
+ operatorID: fmt.Sprintf("camel-k-%s", ns),
+ dependencies: []string{
+ "camel:timer", "camel:log",
+ },
+ traits: []string{
+ "builder.properties=build-property=C",
+ },
+ }, v1.BuildPhaseScheduling, v1.IntegrationKitPhaseNone)
+
+ var notExceedsMaxBuildLimit = func(runningBuilds int) bool {
+ return runningBuilds <= 2
+ }
+
+ limit := 0
+ for limit < 5 && BuildPhase(ns, buildA)() == v1.BuildPhaseRunning {
+ // verify that number of running builds does not exceed max build limit
+ Consistently(BuildsRunning(BuildPhase(ns, buildA), BuildPhase(ns1, buildB), BuildPhase(ns2, buildC)), TestTimeoutShort, 10*time.Second).Should(Satisfy(notExceedsMaxBuildLimit))
+ limit++
+ }
+
+ // make sure we have verified max build limit at least once
+ if limit == 0 {
+ t.Error(errors.New(fmt.Sprintf("Unexpected build phase '%s' for %s - not able to verify max builds limit", BuildPhase(ns, buildA)(), buildA)))
+ t.FailNow()
+ }
+
+ // verify that all builds are successful
+ Eventually(BuildPhase(ns, buildA), TestTimeoutLong).Should(Equal(v1.BuildPhaseSucceeded))
+ Eventually(KitPhase(ns, buildA), TestTimeoutLong).Should(Equal(v1.IntegrationKitPhaseReady))
+ Eventually(BuildPhase(ns1, buildB), TestTimeoutLong).Should(Equal(v1.BuildPhaseSucceeded))
+ Eventually(KitPhase(ns1, buildB), TestTimeoutLong).Should(Equal(v1.IntegrationKitPhaseReady))
+ Eventually(BuildPhase(ns2, buildC), TestTimeoutLong).Should(Equal(v1.BuildPhaseSucceeded))
+ Eventually(KitPhase(ns2, buildC), TestTimeoutLong).Should(Equal(v1.IntegrationKitPhaseReady))
+ })
+ })
})
}
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index e831d8384..489734ac8 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -1535,6 +1535,18 @@ func BuildPhase(ns, name string) func() v1.BuildPhase {
}
}
+func BuildsRunning(predicates ...func() v1.BuildPhase) func() int {
+ return func() int {
+ runningBuilds := 0
+ for _, predicate := range predicates {
+ if predicate() == v1.BuildPhaseRunning {
+ runningBuilds++
+ }
+ }
+ return runningBuilds
+ }
+}
+
func HasPlatform(ns string) func() bool {
return func() bool {
lst := v1.NewIntegrationPlatformList()