Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions dashboard/app/ai.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ import (
const AIAccessLevel = AccessUser

type uiAIJobsPage struct {
Header *uiHeader
Jobs []*uiAIJob
Header *uiHeader
Jobs []*uiAIJob
Workflows []string
CurrentWorkflow string
}

type uiAIJobPage struct {
Expand Down Expand Up @@ -90,13 +92,28 @@ func handleAIJobsPage(ctx context.Context, w http.ResponseWriter, r *http.Reques
if err != nil {
return err
}
workflowParam := r.FormValue("workflow")
var uiJobs []*uiAIJob
for _, job := range jobs {
if workflowParam != "" && job.Workflow != workflowParam {
continue
}
uiJobs = append(uiJobs, makeUIAIJob(job))
}
workflows, err := aidb.LoadWorkflows(ctx)
if err != nil {
return err
}
var workflowNames []string
for _, w := range workflows {
workflowNames = append(workflowNames, w.Name)
}
slices.Sort(workflowNames)
page := &uiAIJobsPage{
Header: hdr,
Jobs: uiJobs,
Header: hdr,
Jobs: uiJobs,
Workflows: workflowNames,
CurrentWorkflow: workflowParam,
}
return serveTemplate(w, "ai_jobs.html", page)
}
Expand Down
37 changes: 37 additions & 0 deletions dashboard/app/ai_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,40 @@ func TestAIAssessmentKCSAN(t *testing.T) {
labels = bug.LabelValues(RaceLabel)
require.Len(t, labels, 0)
}

func TestAIJobsFiltering(t *testing.T) {
c := NewSpannerCtx(t)
defer c.Close()

build := testBuild(1)
c.aiClient.UploadBuild(build)

crash := testCrash(build, 1)
crash.Title = "KCSAN: data-race in foo / bar"
c.aiClient.ReportCrash(crash)
c.aiClient.pollEmailBug()

pollResp, err := c.aiClient.AIJobPoll(&dashapi.AIJobPollReq{
CodeRevision: prog.GitRevision,
Workflows: []dashapi.AIWorkflow{
{Type: ai.WorkflowAssessmentKCSAN, Name: string(ai.WorkflowAssessmentKCSAN)},
{Type: ai.WorkflowPatching, Name: "patching"},
},
})
require.NoError(t, err)
require.NotEmpty(t, pollResp.ID)

resp, err := c.GET("/ains/ai")
require.NoError(t, err)
require.Contains(t, string(resp), "KCSAN: data-race")

// Filter by correct workflow.
resp, err = c.GET("/ains/ai?workflow=" + string(ai.WorkflowAssessmentKCSAN))
require.NoError(t, err)
require.Contains(t, string(resp), "KCSAN: data-race")

// Filter by usage of another workflow (should hide it).
resp, err = c.GET("/ains/ai?workflow=patching")
require.NoError(t, err)
require.NotContains(t, string(resp), "KCSAN: data-race")
}
10 changes: 10 additions & 0 deletions dashboard/app/templates/ai_jobs.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@
</head>
<body>
{{template "header" .Header}}
<form action="/{{.Header.Namespace}}/ai" method="GET">
<label for="workflow">Workflow:</label>
<select name="workflow">
<option value="">All</option>
{{range $w := .Workflows}}
<option value="{{$w}}" {{if eq $w $.CurrentWorkflow}}selected{{end}}>{{$w}}</option>
{{end}}
</select>
<input type="submit" value="Filter">
</form>
{{template "ai_job_list" .Jobs}}
</body>
</html>
Loading