Skip to content

Commit ec12dda

Browse files
HeavyWombatqu1queee
authored andcommitted
Add condition test cases to integration test
Add test cases for the three main status condition: - unknown (ramp-up and early phases of buildrun) - true (buildrun runs through fine) - false (error scenarios like timeout or misconfiguration) Signed-off-by: Enrique Eduardo Encalada Olivas <[email protected]>
1 parent ae7a362 commit ec12dda

File tree

2 files changed

+310
-2
lines changed

2 files changed

+310
-2
lines changed

test/clusterbuildstrategy_samples.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,138 @@ spec:
111111
- name: buildah-images
112112
mountPath: /var/lib/containers/storage
113113
`
114+
115+
// ClusterBuildStrategySingleStepKaniko is a cluster build strategy based on
116+
// Kaniko, which is very close to the actual Kaniko build strategy example in
117+
// the project
118+
const ClusterBuildStrategySingleStepKaniko = `
119+
apiVersion: build.dev/v1alpha1
120+
kind: ClusterBuildStrategy
121+
metadata:
122+
name: kaniko
123+
spec:
124+
buildSteps:
125+
- name: step-build-and-push
126+
image: gcr.io/kaniko-project/executor:v1.3.0
127+
workingDir: /workspace/source
128+
securityContext:
129+
runAsUser: 0
130+
capabilities:
131+
add:
132+
- CHOWN
133+
- DAC_OVERRIDE
134+
- FOWNER
135+
- SETGID
136+
- SETUID
137+
- SETFCAP
138+
env:
139+
- name: DOCKER_CONFIG
140+
value: /tekton/home/.docker
141+
- name: AWS_ACCESS_KEY_ID
142+
value: NOT_SET
143+
- name: AWS_SECRET_KEY
144+
value: NOT_SET
145+
command:
146+
- /kaniko/executor
147+
args:
148+
- --skip-tls-verify=true
149+
- --dockerfile=$(build.dockerfile)
150+
- --context=/workspace/source/$(build.source.contextDir)
151+
- --destination=$(build.output.image)
152+
- --oci-layout-path=/workspace/output/image
153+
- --snapshotMode=redo
154+
resources:
155+
limits:
156+
cpu: 500m
157+
memory: 1Gi
158+
requests:
159+
cpu: 250m
160+
memory: 65Mi
161+
`
162+
163+
// ClusterBuildStrategySingleStepKanikoError is a Kaniko based cluster build
164+
// strategy that has a configuration error (misspelled command flag) so that
165+
// it will fail in Tekton
166+
const ClusterBuildStrategySingleStepKanikoError = `
167+
apiVersion: build.dev/v1alpha1
168+
kind: ClusterBuildStrategy
169+
metadata:
170+
name: kaniko
171+
spec:
172+
buildSteps:
173+
- name: step-build-and-push
174+
image: gcr.io/kaniko-project/executor:v1.3.0
175+
workingDir: /workspace/source
176+
securityContext:
177+
runAsUser: 0
178+
capabilities:
179+
add:
180+
- CHOWN
181+
- DAC_OVERRIDE
182+
- FOWNER
183+
- SETGID
184+
- SETUID
185+
- SETFCAP
186+
env:
187+
- name: DOCKER_CONFIG
188+
value: /tekton/home/.docker
189+
- name: AWS_ACCESS_KEY_ID
190+
value: NOT_SET
191+
- name: AWS_SECRET_KEY
192+
value: NOT_SET
193+
command:
194+
- /kaniko/executor
195+
args:
196+
- --skips-tlss-verifys=true
197+
- --dockerfile=$(build.dockerfile)
198+
- --context=/workspace/source/$(build.source.contextDir)
199+
- --destination=$(build.output.image)
200+
- --oci-layout-path=/workspace/output/image
201+
- --snapshotMode=redo
202+
resources:
203+
limits:
204+
cpu: 500m
205+
memory: 1Gi
206+
requests:
207+
cpu: 250m
208+
memory: 65Mi
209+
`
210+
211+
// ClusterBuildStrategyNoOp is a strategy that does nothing and has no dependencies
212+
const ClusterBuildStrategyNoOp = `
213+
apiVersion: build.dev/v1alpha1
214+
kind: ClusterBuildStrategy
215+
metadata:
216+
name: noop
217+
spec:
218+
buildSteps:
219+
- name: step-no-and-op
220+
image: alpine:latest
221+
workingDir: /workspace/source
222+
securityContext:
223+
runAsUser: 0
224+
capabilities:
225+
add:
226+
- CHOWN
227+
- DAC_OVERRIDE
228+
- FOWNER
229+
- SETGID
230+
- SETUID
231+
- SETFCAP
232+
env:
233+
- name: DOCKER_CONFIG
234+
value: /tekton/home/.docker
235+
- name: AWS_ACCESS_KEY_ID
236+
value: NOT_SET
237+
- name: AWS_SECRET_KEY
238+
value: NOT_SET
239+
command:
240+
- "true"
241+
resources:
242+
limits:
243+
cpu: 250m
244+
memory: 128Mi
245+
requests:
246+
cpu: 250m
247+
memory: 128Mi
248+
`

test/integration/buildruns_to_taskruns_test.go

Lines changed: 175 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
package integration_test
66

77
import (
8+
"context"
89
"fmt"
10+
"time"
911

1012
. "github.com/onsi/ginkgo"
1113
. "github.com/onsi/gomega"
12-
"knative.dev/pkg/apis"
1314

1415
"github.com/shipwright-io/build/pkg/apis/build/v1alpha1"
1516
"github.com/shipwright-io/build/test"
17+
corev1 "k8s.io/api/core/v1"
18+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
19+
"k8s.io/apimachinery/pkg/watch"
20+
"knative.dev/pkg/apis"
1621
)
1722

1823
var _ = Describe("Integration tests BuildRuns and TaskRuns", func() {
@@ -26,7 +31,7 @@ var _ = Describe("Integration tests BuildRuns and TaskRuns", func() {
2631

2732
// Load the ClusterBuildStrategies before each test case
2833
BeforeEach(func() {
29-
cbsObject, err = tb.Catalog.LoadCBSWithName(STRATEGY+tb.Namespace, []byte(test.ClusterBuildStrategySingleStep))
34+
cbsObject, err = tb.Catalog.LoadCBSWithName(STRATEGY+tb.Namespace, []byte(test.ClusterBuildStrategySingleStepKaniko))
3035
Expect(err).To(BeNil())
3136

3237
err = tb.CreateClusterBuildStrategy(cbsObject)
@@ -59,6 +64,174 @@ var _ = Describe("Integration tests BuildRuns and TaskRuns", func() {
5964
}
6065
})
6166

67+
Context("when buildrun uses conditions", func() {
68+
var setupBuildAndBuildRun = func(buildDef []byte, buildRunDef []byte, strategy ...string) (watch.Interface, *v1alpha1.Build, *v1alpha1.BuildRun) {
69+
70+
var strategyName = STRATEGY + tb.Namespace
71+
if len(strategy) > 0 {
72+
strategyName = strategy[0]
73+
}
74+
75+
buildRunWitcher, err := tb.BuildClientSet.BuildV1alpha1().BuildRuns(tb.Namespace).Watch(context.TODO(), metav1.ListOptions{})
76+
Expect(err).To(BeNil())
77+
78+
buildObject, err = tb.Catalog.LoadBuildWithNameAndStrategy(BUILD+tb.Namespace, strategyName, buildDef)
79+
Expect(err).To(BeNil())
80+
Expect(tb.CreateBuild(buildObject)).To(BeNil())
81+
82+
buildRunObject, err = tb.Catalog.LoadBRWithNameAndRef(BUILDRUN+tb.Namespace, BUILD+tb.Namespace, buildRunDef)
83+
Expect(err).To(BeNil())
84+
Expect(tb.CreateBR(buildRunObject)).To(BeNil())
85+
86+
//TODO: consider how to deal with buildObject or buildRunObject
87+
return buildRunWitcher, buildObject, buildRunObject
88+
}
89+
90+
var WithCustomClusterBuildStrategy = func(data []byte, f func()) {
91+
customClusterBuildStrategy, err := tb.Catalog.LoadCBSWithName(STRATEGY+tb.Namespace+"custom", data)
92+
Expect(err).To(BeNil())
93+
94+
Expect(tb.CreateClusterBuildStrategy(customClusterBuildStrategy)).To(BeNil())
95+
f()
96+
Expect(tb.DeleteClusterBuildStrategy(customClusterBuildStrategy.Name)).To(BeNil())
97+
}
98+
99+
Context("when condition status unknown", func() {
100+
It("reflects a change from pending to running reason", func() {
101+
buildRunWitcher, _, _ := setupBuildAndBuildRun([]byte(test.BuildCBSMinimal), []byte(test.MinimalBuildRun))
102+
103+
var timeout = time.After(tb.TimeOut)
104+
go func() {
105+
<-timeout
106+
buildRunWitcher.Stop()
107+
}()
108+
109+
var seq = []*v1alpha1.Condition{}
110+
for event := range buildRunWitcher.ResultChan() {
111+
condition := event.Object.(*v1alpha1.BuildRun).Status.GetCondition(v1alpha1.Succeeded)
112+
if condition != nil {
113+
seq = append(seq, condition)
114+
}
115+
116+
// Pending -> Running
117+
if condition != nil && condition.Reason == "Running" {
118+
buildRunWitcher.Stop()
119+
}
120+
}
121+
122+
Expect(len(seq)).To(Equal(2))
123+
Expect(seq[0].Type).To(Equal(v1alpha1.Succeeded))
124+
Expect(seq[0].Status).To(Equal(corev1.ConditionUnknown))
125+
Expect(seq[0].Reason).To(Equal("Pending"))
126+
Expect(seq[1].Type).To(Equal(v1alpha1.Succeeded))
127+
Expect(seq[1].Reason).To(Equal("Running"))
128+
})
129+
})
130+
131+
Context("when condition status is false", func() {
132+
It("reflects a timeout", func() {
133+
buildRunWitcher, build, buildRun := setupBuildAndBuildRun([]byte(test.BuildCBSWithShortTimeOut), []byte(test.MinimalBuildRun))
134+
135+
var timeout = time.After(tb.TimeOut)
136+
go func() {
137+
<-timeout
138+
buildRunWitcher.Stop()
139+
}()
140+
141+
var seq = []*v1alpha1.Condition{}
142+
for event := range buildRunWitcher.ResultChan() {
143+
condition := event.Object.(*v1alpha1.BuildRun).Status.GetCondition(v1alpha1.Succeeded)
144+
if condition != nil {
145+
seq = append(seq, condition)
146+
}
147+
148+
// Pending -> Running
149+
if condition != nil && condition.Status == corev1.ConditionFalse {
150+
buildRunWitcher.Stop()
151+
}
152+
}
153+
154+
lastIdx := len(seq) - 1
155+
Expect(lastIdx).To(BeNumerically(">", 0))
156+
Expect(seq[lastIdx].Type).To(Equal(v1alpha1.Succeeded))
157+
Expect(seq[lastIdx].Status).To(Equal(corev1.ConditionFalse))
158+
Expect(seq[lastIdx].Reason).To(Equal("BuildRunTimeout"))
159+
Expect(seq[lastIdx].Message).To(Equal(fmt.Sprintf("BuildRun %s failed to finish within %v", buildRun.Name, build.Spec.Timeout.Duration)))
160+
})
161+
162+
It("reflects a failed reason", func() {
163+
WithCustomClusterBuildStrategy([]byte(test.ClusterBuildStrategySingleStepKanikoError), func() {
164+
buildRunWitcher, _, buildRun := setupBuildAndBuildRun([]byte(test.BuildCBSMinimal), []byte(test.MinimalBuildRun), STRATEGY+tb.Namespace+"custom")
165+
166+
var timeout = time.After(tb.TimeOut)
167+
go func() {
168+
<-timeout
169+
buildRunWitcher.Stop()
170+
}()
171+
172+
var seq = []*v1alpha1.Condition{}
173+
for event := range buildRunWitcher.ResultChan() {
174+
condition := event.Object.(*v1alpha1.BuildRun).Status.GetCondition(v1alpha1.Succeeded)
175+
if condition != nil {
176+
seq = append(seq, condition)
177+
}
178+
179+
if condition != nil && condition.Status == corev1.ConditionFalse {
180+
buildRunWitcher.Stop()
181+
}
182+
}
183+
184+
buildRun, err = tb.GetBR(buildRun.Name)
185+
Expect(err).ToNot(HaveOccurred())
186+
Expect(buildRun.Status.CompletionTime).ToNot(BeNil())
187+
188+
taskRun, err := tb.GetTaskRunFromBuildRun(buildRun.Name)
189+
Expect(err).ToNot(HaveOccurred())
190+
191+
lastIdx := len(seq) - 1
192+
Expect(lastIdx).To(BeNumerically(">", 0))
193+
Expect(seq[lastIdx].Type).To(Equal(v1alpha1.Succeeded))
194+
Expect(seq[lastIdx].Status).To(Equal(corev1.ConditionFalse))
195+
Expect(seq[lastIdx].Reason).To(Equal("Failed"))
196+
Expect(seq[lastIdx].Message).To(ContainSubstring("buildrun step failed in pod %s", taskRun.Status.PodName))
197+
})
198+
})
199+
})
200+
201+
Context("when condition status true", func() {
202+
It("should reflect the taskrun succeeded reason in the buildrun condition", func() {
203+
WithCustomClusterBuildStrategy([]byte(test.ClusterBuildStrategyNoOp), func() {
204+
buildRunWitcher, _, _ := setupBuildAndBuildRun([]byte(test.BuildCBSMinimal), []byte(test.MinimalBuildRun), STRATEGY+tb.Namespace+"custom")
205+
206+
var timeout = time.After(tb.TimeOut)
207+
go func() {
208+
<-timeout
209+
buildRunWitcher.Stop()
210+
}()
211+
212+
var seq = []*v1alpha1.Condition{}
213+
for event := range buildRunWitcher.ResultChan() {
214+
condition := event.Object.(*v1alpha1.BuildRun).Status.GetCondition(v1alpha1.Succeeded)
215+
if condition != nil {
216+
seq = append(seq, condition)
217+
}
218+
219+
if condition != nil && condition.Status == corev1.ConditionTrue {
220+
buildRunWitcher.Stop()
221+
}
222+
}
223+
224+
lastIdx := len(seq) - 1
225+
Expect(lastIdx).To(BeNumerically(">", 0))
226+
Expect(seq[lastIdx].Type).To(Equal(v1alpha1.Succeeded))
227+
Expect(seq[lastIdx].Status).To(Equal(corev1.ConditionTrue))
228+
Expect(seq[lastIdx].Reason).To(Equal("Succeeded"))
229+
Expect(seq[lastIdx].Message).To(ContainSubstring("All Steps have completed executing"))
230+
})
231+
})
232+
})
233+
})
234+
62235
Context("when a buildrun is created", func() {
63236

64237
BeforeEach(func() {

0 commit comments

Comments
 (0)