Skip to content

Commit 9950305

Browse files
a-nogikhdvyukov
authored andcommitted
dashboard: filter AI jobs by workflows
Add a simple form on top of the table.
1 parent ee98cb7 commit 9950305

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

dashboard/app/ai.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ import (
2626
const AIAccessLevel = AccessUser
2727

2828
type uiAIJobsPage struct {
29-
Header *uiHeader
30-
Jobs []*uiAIJob
29+
Header *uiHeader
30+
Jobs []*uiAIJob
31+
Workflows []string
32+
CurrentWorkflow string
3133
}
3234

3335
type uiAIJobPage struct {
@@ -90,13 +92,28 @@ func handleAIJobsPage(ctx context.Context, w http.ResponseWriter, r *http.Reques
9092
if err != nil {
9193
return err
9294
}
95+
workflowParam := r.FormValue("workflow")
9396
var uiJobs []*uiAIJob
9497
for _, job := range jobs {
98+
if workflowParam != "" && job.Workflow != workflowParam {
99+
continue
100+
}
95101
uiJobs = append(uiJobs, makeUIAIJob(job))
96102
}
103+
workflows, err := aidb.LoadWorkflows(ctx)
104+
if err != nil {
105+
return err
106+
}
107+
var workflowNames []string
108+
for _, w := range workflows {
109+
workflowNames = append(workflowNames, w.Name)
110+
}
111+
slices.Sort(workflowNames)
97112
page := &uiAIJobsPage{
98-
Header: hdr,
99-
Jobs: uiJobs,
113+
Header: hdr,
114+
Jobs: uiJobs,
115+
Workflows: workflowNames,
116+
CurrentWorkflow: workflowParam,
100117
}
101118
return serveTemplate(w, "ai_jobs.html", page)
102119
}

dashboard/app/ai_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,40 @@ func TestAIAssessmentKCSAN(t *testing.T) {
249249
labels = bug.LabelValues(RaceLabel)
250250
require.Len(t, labels, 0)
251251
}
252+
253+
func TestAIJobsFiltering(t *testing.T) {
254+
c := NewSpannerCtx(t)
255+
defer c.Close()
256+
257+
build := testBuild(1)
258+
c.aiClient.UploadBuild(build)
259+
260+
crash := testCrash(build, 1)
261+
crash.Title = "KCSAN: data-race in foo / bar"
262+
c.aiClient.ReportCrash(crash)
263+
c.aiClient.pollEmailBug()
264+
265+
pollResp, err := c.aiClient.AIJobPoll(&dashapi.AIJobPollReq{
266+
CodeRevision: prog.GitRevision,
267+
Workflows: []dashapi.AIWorkflow{
268+
{Type: ai.WorkflowAssessmentKCSAN, Name: string(ai.WorkflowAssessmentKCSAN)},
269+
{Type: ai.WorkflowPatching, Name: "patching"},
270+
},
271+
})
272+
require.NoError(t, err)
273+
require.NotEmpty(t, pollResp.ID)
274+
275+
resp, err := c.GET("/ains/ai")
276+
require.NoError(t, err)
277+
require.Contains(t, string(resp), "KCSAN: data-race")
278+
279+
// Filter by correct workflow.
280+
resp, err = c.GET("/ains/ai?workflow=" + string(ai.WorkflowAssessmentKCSAN))
281+
require.NoError(t, err)
282+
require.Contains(t, string(resp), "KCSAN: data-race")
283+
284+
// Filter by usage of another workflow (should hide it).
285+
resp, err = c.GET("/ains/ai?workflow=patching")
286+
require.NoError(t, err)
287+
require.NotContains(t, string(resp), "KCSAN: data-race")
288+
}

dashboard/app/templates/ai_jobs.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313
</head>
1414
<body>
1515
{{template "header" .Header}}
16+
<form action="/{{.Header.Namespace}}/ai" method="GET">
17+
<label for="workflow">Workflow:</label>
18+
<select name="workflow">
19+
<option value="">All</option>
20+
{{range $w := .Workflows}}
21+
<option value="{{$w}}" {{if eq $w $.CurrentWorkflow}}selected{{end}}>{{$w}}</option>
22+
{{end}}
23+
</select>
24+
<input type="submit" value="Filter">
25+
</form>
1626
{{template "ai_job_list" .Jobs}}
1727
</body>
1828
</html>

0 commit comments

Comments
 (0)