aboutsummaryrefslogtreecommitdiffstats
path: root/syz-cluster/dashboard
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-04-10 15:22:58 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-04-11 10:07:50 +0000
commit12ba9c21547f0ea81d8ca844847dd4d25fdb1a83 (patch)
tree66190fd9e5f7f335e8bff4445994ee7f422d91f6 /syz-cluster/dashboard
parentd9f74b68bb55efb3daf03a6ad1f54cf505ea8874 (diff)
syz-cluster/dashboard: share test step artifacts
If the test artifacts are present, let the user download them.
Diffstat (limited to 'syz-cluster/dashboard')
-rw-r--r--syz-cluster/dashboard/handler.go16
-rw-r--r--syz-cluster/dashboard/templates/series.html3
2 files changed, 18 insertions, 1 deletions
diff --git a/syz-cluster/dashboard/handler.go b/syz-cluster/dashboard/handler.go
index fe9129373..c18436978 100644
--- a/syz-cluster/dashboard/handler.go
+++ b/syz-cluster/dashboard/handler.go
@@ -58,6 +58,7 @@ func (h *dashboardHandler) Mux() *http.ServeMux {
mux := http.NewServeMux()
mux.HandleFunc("/sessions/{id}/log", errToStatus(h.sessionLog))
mux.HandleFunc("/sessions/{id}/test_logs", errToStatus(h.sessionTestLog))
+ mux.HandleFunc("/sessions/{id}/test_artifacts", errToStatus(h.sessionTestArtifacts))
mux.HandleFunc("/series/{id}", errToStatus(h.seriesInfo))
mux.HandleFunc("/patches/{id}", errToStatus(h.patchContent))
mux.HandleFunc("/findings/{id}/{key}", errToStatus(h.findingInfo))
@@ -254,11 +255,24 @@ func (h *dashboardHandler) sessionTestLog(w http.ResponseWriter, r *http.Request
if err != nil {
return err
} else if test == nil {
- return fmt.Errorf("%w: test log", errNotFound)
+ return fmt.Errorf("%w: test", errNotFound)
}
return h.streamBlob(w, test.LogURI)
}
+func (h *dashboardHandler) sessionTestArtifacts(w http.ResponseWriter, r *http.Request) error {
+ test, err := h.sessionTestRepo.Get(r.Context(), r.PathValue("id"), r.FormValue("name"))
+ if err != nil {
+ return err
+ } else if test == nil {
+ return fmt.Errorf("%w: test", errNotFound)
+ }
+ filename := fmt.Sprintf("%s_%s.tar.gz", test.SessionID, test.TestName)
+ w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
+ w.Header().Set("Content-Type", "application/octet-stream")
+ return h.streamBlob(w, test.ArtifactsArchiveURI)
+}
+
func (h *dashboardHandler) streamBlob(w http.ResponseWriter, uri string) error {
if uri == "" {
return nil
diff --git a/syz-cluster/dashboard/templates/series.html b/syz-cluster/dashboard/templates/series.html
index daaad8ae8..754bfe9e2 100644
--- a/syz-cluster/dashboard/templates/series.html
+++ b/syz-cluster/dashboard/templates/series.html
@@ -130,6 +130,9 @@
{{if .LogURI}}
<a href="/sessions/{{.SessionID}}/test_logs?name={{.TestName}}" class="modal-link-raw">[Log]</a>
{{end}}
+ {{if .ArtifactsArchiveURI}}
+ <a href="/sessions/{{.SessionID}}/test_artifacts?name={{.TestName}}">[Artifacts]</a>
+ {{end}}
</th>
</tr>
{{if .Findings}}