github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-cluster/pkg/service/session.go (about) 1 // Copyright 2025 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package service 5 6 import ( 7 "bytes" 8 "context" 9 "errors" 10 "fmt" 11 "time" 12 13 "github.com/google/syzkaller/syz-cluster/pkg/api" 14 "github.com/google/syzkaller/syz-cluster/pkg/app" 15 "github.com/google/syzkaller/syz-cluster/pkg/blob" 16 "github.com/google/syzkaller/syz-cluster/pkg/db" 17 ) 18 19 type SessionService struct { 20 sessionRepo *db.SessionRepository 21 seriesRepo *db.SeriesRepository 22 blobStorage blob.Storage 23 } 24 25 func NewSessionService(env *app.AppEnvironment) *SessionService { 26 return &SessionService{ 27 sessionRepo: db.NewSessionRepository(env.Spanner), 28 seriesRepo: db.NewSeriesRepository(env.Spanner), 29 blobStorage: env.BlobStorage, 30 } 31 } 32 33 var ErrSessionNotFound = errors.New("session not found") 34 35 func (s *SessionService) TriageResult(ctx context.Context, sessionID string, req *api.UploadTriageResultReq) error { 36 var triageLogURI string 37 if len(req.Log) > 0 { 38 var err error 39 triageLogURI, err = s.blobStorage.Write(bytes.NewReader(req.Log), "Session", sessionID, "triage_log") 40 if err != nil { 41 return fmt.Errorf("failed to save the triage log: %w", err) 42 } 43 } 44 err := s.sessionRepo.Update(ctx, sessionID, func(session *db.Session) error { 45 session.TriageLogURI = triageLogURI 46 if req.SkipReason != "" { 47 session.SetSkipReason(req.SkipReason) 48 } 49 return nil 50 }) 51 if errors.Is(err, db.ErrEntityNotFound) { 52 return ErrSessionNotFound 53 } 54 return err 55 } 56 57 func (s *SessionService) UploadSession(ctx context.Context, req *api.NewSession) (*api.UploadSessionResp, error) { 58 series, err := s.seriesRepo.GetByExtID(ctx, req.ExtID) 59 if err != nil { 60 return nil, err 61 } else if series == nil { 62 return nil, ErrSeriesNotFound 63 } 64 session := &db.Session{ 65 SeriesID: series.ID, 66 Tags: req.Tags, 67 CreatedAt: time.Now(), 68 } 69 err = s.sessionRepo.Insert(ctx, session) 70 if err != nil { 71 return nil, err 72 } 73 return &api.UploadSessionResp{ID: session.ID}, nil 74 }