Skip to content

Commit 9b58069

Browse files
committed
Tests for Custom Scheduler Name on Build and BuildRun objects
Signed-off-by: Dylan Orzel <[email protected]>
1 parent cd32beb commit 9b58069

File tree

12 files changed

+681
-3
lines changed

12 files changed

+681
-3
lines changed

pkg/reconciler/build/build_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,5 +645,20 @@ var _ = Describe("Reconcile Build", func() {
645645
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
646646
})
647647
})
648+
649+
Context("when SchedulerName is specified", func() {
650+
It("should fail to validate when the SchedulerName is invalid", func() {
651+
// set SchedulerName to be invalid
652+
buildSample.Spec.SchedulerName = ptr.To(strings.Repeat("s", 64))
653+
buildSample.Spec.Output.PushSecret = nil
654+
655+
statusCall := ctl.StubFunc(corev1.ConditionFalse, build.SchedulerNameNotValid, "Scheduler name not valid: name part "+validation.MaxLenError(63))
656+
statusWriter.UpdateCalls(statusCall)
657+
658+
_, err := reconciler.Reconcile(context.TODO(), request)
659+
Expect(err).To(BeNil())
660+
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
661+
})
662+
})
648663
})
649664
})

pkg/reconciler/buildrun/buildrun_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,5 +1660,64 @@ var _ = Describe("Reconcile BuildRun", func() {
16601660
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
16611661
})
16621662
})
1663+
1664+
Context("when SchedulerName is specified", func() {
1665+
It("should fail to validate when the SchedulerName is invalid", func() {
1666+
// set SchedulerName to be invalid
1667+
buildRunSample.Spec.SchedulerName = ptr.To(strings.Repeat("s", 64))
1668+
1669+
statusCall := ctl.StubFunc(corev1.ConditionFalse, build.SchedulerNameNotValid, validation.MaxLenError(64))
1670+
statusWriter.UpdateCalls(statusCall)
1671+
1672+
_, err := reconciler.Reconcile(context.TODO(), buildRunRequest)
1673+
Expect(err).To(BeNil())
1674+
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
1675+
})
1676+
})
1677+
1678+
Context("when a buildrun has a buildSpec defined and overrides nodeSelector", func() {
1679+
BeforeEach(func() {
1680+
buildRunSample = ctl.BuildRunWithNodeSelectorOverride(buildRunName, buildName, map[string]string{"Key": "testkey", "Value": "testvalue"})
1681+
})
1682+
1683+
It("should fail to register", func() {
1684+
statusCall := ctl.StubFunc(corev1.ConditionFalse, build.BuildReason(resources.BuildRunBuildFieldOverrideForbidden), "cannot use 'nodeSelector' override and 'buildSpec' simultaneously")
1685+
statusWriter.UpdateCalls(statusCall)
1686+
1687+
_, err := reconciler.Reconcile(context.TODO(), buildRunRequest)
1688+
Expect(err).To(BeNil())
1689+
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
1690+
})
1691+
})
1692+
1693+
Context("when a buildrun has a buildSpec defined and overrides Tolerations", func() {
1694+
BeforeEach(func() {
1695+
buildRunSample = ctl.BuildRunWithTolerationsOverride(buildRunName, buildName, []corev1.Toleration{{Key: "testkey", Value: "testvalue", Operator: corev1.TolerationOpEqual, Effect: corev1.TaintEffectNoSchedule}})
1696+
})
1697+
1698+
It("should fail to register", func() {
1699+
statusCall := ctl.StubFunc(corev1.ConditionFalse, build.BuildReason(resources.BuildRunBuildFieldOverrideForbidden), "cannot use 'tolerations' override and 'buildSpec' simultaneously")
1700+
statusWriter.UpdateCalls(statusCall)
1701+
1702+
_, err := reconciler.Reconcile(context.TODO(), buildRunRequest)
1703+
Expect(err).To(BeNil())
1704+
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
1705+
})
1706+
})
1707+
1708+
Context("when a buildrun has a buildSpec defined and overrides schedulerName", func() {
1709+
BeforeEach(func() {
1710+
buildRunSample = ctl.BuildRunWithSchedulerNameOverride(buildRunName, buildName, "testSchedulerName")
1711+
})
1712+
1713+
It("should fail to register", func() {
1714+
statusCall := ctl.StubFunc(corev1.ConditionFalse, build.BuildReason(resources.BuildRunBuildFieldOverrideForbidden), "cannot use 'schedulerName' override and 'buildSpec' simultaneously")
1715+
statusWriter.UpdateCalls(statusCall)
1716+
1717+
_, err := reconciler.Reconcile(context.TODO(), buildRunRequest)
1718+
Expect(err).To(BeNil())
1719+
Expect(statusWriter.UpdateCallCount()).To(Equal(1))
1720+
})
1721+
})
16631722
})
16641723
})

pkg/reconciler/buildrun/resources/taskrun_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,5 +678,27 @@ var _ = Describe("GenerateTaskrun", func() {
678678
Expect(got.Spec.PodTemplate.Tolerations[0].Value).To(Equal(buildRun.Spec.Tolerations[0].Value))
679679
})
680680
})
681+
682+
Context("when the build and buildrun both specify a SchedulerName", func() {
683+
BeforeEach(func() {
684+
build, err = ctl.LoadBuildYAML([]byte(test.MinimalBuildWithSchedulerName))
685+
Expect(err).To(BeNil())
686+
687+
buildRun, err = ctl.LoadBuildRunFromBytes([]byte(test.MinimalBuildRunWithSchedulerName))
688+
Expect(err).To(BeNil())
689+
690+
buildStrategy, err = ctl.LoadBuildStrategyFromBytes([]byte(test.ClusterBuildStrategyNoOp))
691+
Expect(err).To(BeNil())
692+
})
693+
694+
JustBeforeEach(func() {
695+
got, err = resources.GenerateTaskRun(config.NewDefaultConfig(), build, buildRun, serviceAccountName, buildStrategy)
696+
Expect(err).To(BeNil())
697+
})
698+
699+
It("should give precedence to the SchedulerName value specified in the buildRun", func() {
700+
Expect(got.Spec.PodTemplate.SchedulerName).To(Equal(buildRun.Spec.SchedulerName))
701+
})
702+
})
681703
})
682704
})

pkg/validate/nodeselector_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// Copyright The Shipwright Contributors
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package validate_test
6+
7+
import (
8+
"context"
9+
10+
. "github.com/onsi/ginkgo/v2"
11+
. "github.com/onsi/gomega"
12+
13+
corev1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
15+
. "github.com/shipwright-io/build/pkg/apis/build/v1beta1"
16+
"github.com/shipwright-io/build/pkg/validate"
17+
)
18+
19+
var _ = Describe("ValidateNodeSelector", func() {
20+
var ctx context.Context
21+
22+
BeforeEach(func() {
23+
ctx = context.TODO()
24+
})
25+
26+
var validate = func(build *Build) {
27+
GinkgoHelper()
28+
29+
var validator = &validate.NodeSelectorRef{Build: build}
30+
Expect(validator.ValidatePath(ctx)).To(Succeed())
31+
}
32+
33+
var sampleBuild = func(key string, value string) *Build {
34+
return &Build{
35+
ObjectMeta: corev1.ObjectMeta{
36+
Namespace: "foo",
37+
Name: "bar",
38+
},
39+
Spec: BuildSpec{
40+
NodeSelector: map[string]string{key: value},
41+
},
42+
}
43+
}
44+
45+
Context("when node selector is specified", func() {
46+
It("should fail an empty key and value", func() {
47+
build := sampleBuild("", "")
48+
validate(build)
49+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
50+
Expect(*build.Status.Message).To(ContainSubstring("Node selector key not valid"))
51+
})
52+
53+
It("should fail an empty key and valid value", func() {
54+
build := sampleBuild("", "validvalue")
55+
validate(build)
56+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
57+
Expect(*build.Status.Message).To(ContainSubstring("Node selector key not valid"))
58+
})
59+
60+
It("should fail an empty key and invalid value", func() {
61+
build := sampleBuild("", "invalidvalue!")
62+
validate(build)
63+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
64+
Expect(*build.Status.Message).To(ContainSubstring("Node selector key not valid"))
65+
})
66+
67+
It("should pass a valid key and valid value", func() {
68+
build := sampleBuild("validkey", "validvalue")
69+
validate(build)
70+
Expect(build.Status.Reason).To(BeNil())
71+
Expect(build.Status.Message).To(BeNil())
72+
})
73+
74+
It("should fail a valid key and invalid value", func() {
75+
build := sampleBuild("validkey", "invalidvalue!")
76+
validate(build)
77+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
78+
Expect(*build.Status.Message).To(ContainSubstring("Node selector value not valid"))
79+
})
80+
81+
It("should pass a valid key and empty value", func() {
82+
build := sampleBuild("validkey", "")
83+
validate(build)
84+
Expect(build.Status.Reason).To(BeNil())
85+
Expect(build.Status.Message).To(BeNil())
86+
})
87+
88+
It("should fail an invalid key and empty value", func() {
89+
build := sampleBuild("invalidkey!", "")
90+
validate(build)
91+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
92+
Expect(*build.Status.Message).To(ContainSubstring("Node selector key not valid"))
93+
})
94+
95+
It("should fail an invalid key and valid value", func() {
96+
build := sampleBuild("invalidkey!", "validvalue")
97+
validate(build)
98+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
99+
Expect(*build.Status.Message).To(ContainSubstring("Node selector key not valid"))
100+
})
101+
102+
It("should fail both an invalid key and invalid value", func() {
103+
build := sampleBuild("invalidkey!", "invalidvalue!")
104+
validate(build)
105+
Expect(*build.Status.Reason).To(Equal(NodeSelectorNotValid))
106+
Expect(*build.Status.Message).To(ContainSubstring("Node selector key not valid"))
107+
})
108+
})
109+
})

pkg/validate/scheduler_name_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright The Shipwright Contributors
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package validate_test
6+
7+
import (
8+
"context"
9+
10+
. "github.com/onsi/ginkgo/v2"
11+
. "github.com/onsi/gomega"
12+
13+
corev1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
15+
. "github.com/shipwright-io/build/pkg/apis/build/v1beta1"
16+
"github.com/shipwright-io/build/pkg/validate"
17+
)
18+
19+
var _ = Describe("ValidateSchedulerName", func() {
20+
var ctx context.Context
21+
22+
BeforeEach(func() {
23+
ctx = context.TODO()
24+
})
25+
26+
var validate = func(build *Build) {
27+
GinkgoHelper()
28+
29+
var validator = &validate.SchedulerNameRef{Build: build}
30+
Expect(validator.ValidatePath(ctx)).To(Succeed())
31+
}
32+
33+
var sampleBuild = func(schedulerName string) *Build {
34+
return &Build{
35+
ObjectMeta: corev1.ObjectMeta{
36+
Namespace: "foo",
37+
Name: "bar",
38+
},
39+
Spec: BuildSpec{
40+
SchedulerName: &schedulerName,
41+
},
42+
}
43+
}
44+
45+
Context("when schedulerName is specified", func() {
46+
It("should pass an empty name", func() {
47+
build := sampleBuild("")
48+
validate(build)
49+
Expect(build.Status.Reason).To(BeNil())
50+
Expect(build.Status.Message).To(BeNil())
51+
})
52+
53+
It("should fail an invalid name", func() {
54+
build := sampleBuild("invalidname!")
55+
validate(build)
56+
Expect(*build.Status.Reason).To(Equal(SchedulerNameNotValid))
57+
Expect(*build.Status.Message).To(ContainSubstring("Scheduler name not valid"))
58+
})
59+
})
60+
})

0 commit comments

Comments
 (0)