Skip to content

Commit 4e7ca25

Browse files
committed
stats: Add a check and count for CI infra failures
This check looks for any failed e2e lanes that did not get as far as running the tests and creating a junit.functext.xml. This is a good indicator that a failure has occurred in kubevirtci. Signed-off-by: Brian Carey <[email protected]>
1 parent 0f5910c commit 4e7ca25

File tree

5 files changed

+41
-4
lines changed

5 files changed

+41
-4
lines changed

pkg/constants/main.go

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ const (
4545
SIGNetworkRetestBadgeFileName = "sig-network-retests.svg"
4646
SIGStorageRetestBadgeFileName = "sig-storage-retests.svg"
4747
SIGOperatorRetestBadgeFileName = "sig-operator-retests.svg"
48+
SIGCIRetestBadgeFileName = "sig-ci-retests.svg"
4849
JSONResultsFileName = "results.json"
4950
PlotFileName = "plot.png"
5051
MetricsFileName = "metrics"
@@ -58,6 +59,7 @@ const (
5859
SIGNetworkRetestBadgeName = "SIG Network"
5960
SIGOperatorRetestBadgeName = "SIG Operator"
6061
SIGStorageRetestBadgeName = "SIG Storage"
62+
SIGCIRetestBadgeName = "SIG CI"
6163
BadgeDataFormat = "%.2f ± std %.2f"
6264
NoRetestBadgeDataFormat = "%.0f / %.0f | %.0f%s"
6365

pkg/output/output.go

+10
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@ func (b *Handler) writeBadges(results *types.Results) error {
159159
b.options.SIGRetestsLevels,
160160
)
161161

162+
err = b.writeSIGRetestBadge(
163+
constants.SIGCIRetestBadgeName,
164+
filepath.Join(basePath, constants.SIGCIRetestBadgeFileName),
165+
results.Data[constants.SIGRetests],
166+
b.options.SIGRetestsLevels,
167+
)
168+
162169
err = b.writeJobFailureBadges(
163170
results.Data[constants.SIGRetests],
164171
b.options.SIGRetestsLevels,
@@ -209,6 +216,9 @@ func (b *Handler) writeSIGRetestBadge(name, filePath string, data types.RunningA
209216
case constants.SIGOperatorRetestBadgeName:
210217
value = data.SIGOperatorRetest
211218
total = data.SIGOperatorTotal
219+
case constants.SIGCIRetestBadgeName:
220+
value = data.SIGCIRetest
221+
total = data.SIGCITotal
212222
}
213223

214224
color := BadgeColor(((value / total) * 100), levels)

pkg/sigretests/main.go

+25-4
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ const org = "kubevirt"
1414
const repo = "kubevirt"
1515

1616
type job struct {
17-
jobName string
18-
buildNumber string
19-
buildURL string
20-
failure bool
17+
jobName string
18+
buildNumber string
19+
buildURL string
20+
failure bool
21+
artifactsURL string
2122
}
2223

2324
type SigRetests struct {
25+
SigCIFailure int
2426
SigComputeFailure int
2527
SigNetworkFailure int
2628
SigStorageFailure int
@@ -48,6 +50,20 @@ func finishedJSONURL(org string, repo string, prNumber string, jobName string, b
4850
return fmt.Sprintf("%s/%s/%s/finished.json", prStorageURL(org, repo, prNumber), jobName, buildNumber)
4951
}
5052

53+
func checkSIGCIFailure(job job) bool {
54+
if job.failure {
55+
junitURL := fmt.Sprintf("%s/junit.functest.xml", job.artifactsURL)
56+
resp, err := http.Get(junitURL)
57+
if err != nil {
58+
return true
59+
}
60+
if resp.StatusCode != http.StatusOK {
61+
return true
62+
}
63+
}
64+
return false
65+
}
66+
5167
func filterJobs(node *html.Node) (jobs []job) {
5268
var e2eJob job
5369
if node.Type == html.ElementNode && node.Data == "td" {
@@ -60,6 +76,9 @@ func filterJobs(node *html.Node) (jobs []job) {
6076
buildLogUrl := strings.Split(href.Val, "/")
6177
e2eJob.jobName = buildLogUrl[len(buildLogUrl)-2]
6278
e2eJob.buildNumber = buildLogUrl[len(buildLogUrl)-1]
79+
prNumber := buildLogUrl[len(buildLogUrl)-3]
80+
e2eJob.artifactsURL = fmt.Sprintf("https://gcsweb.ci.kubevirt.io/gcs/kubevirt-prow/pr-logs/pull/kubevirt_kubevirt/%s/%s/%s/artifacts",
81+
prNumber, e2eJob.jobName, e2eJob.buildNumber)
6382
prowjobs = append(prowjobs, e2eJob)
6483
continue
6584
}
@@ -172,6 +191,8 @@ func FilterJobsPerSigs(jobs []job) (prSigRetests SigRetests) {
172191
prSigRetests = SigRetests{}
173192
for _, job := range jobs {
174193
switch {
194+
case checkSIGCIFailure(job):
195+
prSigRetests.SigCIFailure += 1
175196
case strings.Contains(job.jobName, "sig-compute") || strings.Contains(job.jobName, "vgpu"):
176197
if job.failure {
177198
prSigRetests.SigComputeFailure += 1

pkg/stats/stats.go

+2
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ func (h *Handler) sigRetestsProcessor(results *types.Results) (*types.Results, e
281281
dataItem.SIGNetworkRetest = dataItem.SIGNetworkRetest + float64(jobsPerSIG.SigNetworkFailure)
282282
dataItem.SIGStorageRetest = dataItem.SIGStorageRetest + float64(jobsPerSIG.SigStorageFailure)
283283
dataItem.SIGOperatorRetest = dataItem.SIGOperatorRetest + float64(jobsPerSIG.SigOperatorFailure)
284+
dataItem.SIGCIRetest = dataItem.SIGCIRetest + float64(jobsPerSIG.SigCIFailure)
284285
dataItem.SIGComputeTotal = dataItem.SIGComputeTotal + float64(jobsPerSIG.SigComputeFailure) + float64(jobsPerSIG.SigComputeSuccess)
285286
dataItem.SIGNetworkTotal = dataItem.SIGNetworkTotal + float64(jobsPerSIG.SigNetworkFailure) + float64(jobsPerSIG.SigNetworkSuccess)
286287
dataItem.SIGStorageTotal = dataItem.SIGStorageTotal + float64(jobsPerSIG.SigStorageFailure) + float64(jobsPerSIG.SigStorageSuccess)
@@ -294,6 +295,7 @@ func (h *Handler) sigRetestsProcessor(results *types.Results) (*types.Results, e
294295
successJobNames = slices.Concat(successJobNames, jobsPerSIG.SuccessJobNames)
295296
failedJobURLs = slices.Concat(failedJobURLs, jobsPerSIG.FailedJobURLs)
296297
}
298+
dataItem.SIGCITotal = dataItem.SIGComputeTotal + dataItem.SIGStorageTotal + dataItem.SIGNetworkTotal + dataItem.SIGOperatorTotal + dataItem.SIGCIRetest
297299
sortedFailedJobs := types.SortByMostFailed(countFailedJobs(failedJobNames))
298300
for i, job := range sortedFailedJobs {
299301
for _, success := range successJobNames {

pkg/types/main.go

+2
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,12 @@ type RunningAverageDataItem struct {
246246
SIGStorageRetest float64
247247
SIGNetworkRetest float64
248248
SIGOperatorRetest float64
249+
SIGCIRetest float64
249250
SIGComputeTotal float64
250251
SIGStorageTotal float64
251252
SIGNetworkTotal float64
252253
SIGOperatorTotal float64
254+
SIGCITotal float64
253255
FailedJobLeaderBoard FailedJobs
254256
DataPoints []DataPoint
255257
}

0 commit comments

Comments
 (0)