aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-03-19 12:08:11 +0100
committerTaras Madan <tarasmadan@google.com>2025-03-19 15:35:35 +0000
commit3b7445cf7f3c99cd574fc04ecdda1a67097cf55f (patch)
tree4d6a1d09ab00a0db7fbcb5713d7060d9a3bb2cc8
parente20d7b1367f179faeed38718178841377f3accbf (diff)
syz-ci/manager.go: make CoverProgramsPath target public
PublishGCS param now controls the CoverProgramsPath targets too. Previously it controlled only CoverUploadPath and CorpusUploadPath.
-rw-r--r--pkg/gcs/gcs.go24
-rw-r--r--syz-ci/manager.go40
-rw-r--r--syz-ci/syz-ci.go2
3 files changed, 34 insertions, 32 deletions
diff --git a/pkg/gcs/gcs.go b/pkg/gcs/gcs.go
index c9e62c86e..186b9a8eb 100644
--- a/pkg/gcs/gcs.go
+++ b/pkg/gcs/gcs.go
@@ -22,6 +22,30 @@ import (
"google.golang.org/api/iterator"
)
+func UploadFile(ctx context.Context, srcFile io.Reader, destURL string, publish bool) error {
+ destURL = strings.TrimPrefix(destURL, "gs://")
+ client, err := NewClient(ctx)
+ if err != nil {
+ return fmt.Errorf("func NewClient: %w", err)
+ }
+ defer client.Close()
+ gcsWriter, err := client.FileWriter(destURL)
+ if err != nil {
+ return fmt.Errorf("client.FileWriter: %w", err)
+ }
+ if _, err := io.Copy(gcsWriter, srcFile); err != nil {
+ gcsWriter.Close()
+ return fmt.Errorf("io.Copy: %w", err)
+ }
+ if err := gcsWriter.Close(); err != nil {
+ return fmt.Errorf("gcsWriter.Close: %w", err)
+ }
+ if publish {
+ return client.Publish(destURL)
+ }
+ return nil
+}
+
type Client struct {
client *storage.Client
ctx context.Context
diff --git a/syz-ci/manager.go b/syz-ci/manager.go
index defcedbc9..776ed2e84 100644
--- a/syz-ci/manager.go
+++ b/syz-ci/manager.go
@@ -865,7 +865,7 @@ func (mgr *Manager) uploadCoverReport() error {
}
defer resp.Body.Close()
if directUpload {
- return mgr.uploadFile(mgr.cfg.CoverUploadPath, mgr.name+".html", resp.Body, true)
+ return uploadFile(mgr.cfg.CoverUploadPath, mgr.name+".html", resp.Body, mgr.cfg.PublishGCS)
}
// Upload via the asset storage.
newAsset, err := mgr.storage.UploadBuildAsset(resp.Body, mgr.name+".html",
@@ -880,7 +880,7 @@ func (mgr *Manager) uploadCoverReport() error {
return nil
}
-func (mgr *Manager) uploadCoverJSONLToGCS(mgrSrc, gcsDest string, curTime time.Time,
+func (mgr *Manager) uploadCoverJSONLToGCS(mgrSrc, gcsDest string, curTime time.Time, publish bool,
f func(io.Writer, *json.Decoder) error) error {
if !mgr.managercfg.Cover || gcsDest == "" {
return nil
@@ -923,7 +923,7 @@ func (mgr *Manager) uploadCoverJSONLToGCS(mgrSrc, gcsDest string, curTime time.T
mgr.mgrcfg.DashboardClient,
mgr.name, curTime.Format(time.DateOnly),
curTime.Hour(), curTime.Minute())
- if err := mgr.uploadFile(gcsDest, fileName, pr, false); err != nil {
+ if err := uploadFile(gcsDest, fileName, pr, publish); err != nil {
return fmt.Errorf("failed to uploadFileGCS(): %w", err)
}
return nil
@@ -937,6 +937,7 @@ func (mgr *Manager) uploadCoverStat(fuzzingMinutes int) error {
if err := mgr.uploadCoverJSONLToGCS("/cover?jsonl=1&flush=1",
mgr.cfg.CoverPipelinePath,
curTime,
+ false,
func(w io.Writer, dec *json.Decoder) error {
var covInfo cover.CoverageInfo
if err := dec.Decode(&covInfo); err != nil {
@@ -966,6 +967,7 @@ func (mgr *Manager) uploadProgramsWithCoverage() error {
if err := mgr.uploadCoverJSONLToGCS("/coverprogs?jsonl=1",
mgr.cfg.CoverProgramsPath,
time.Now(),
+ mgr.cfg.PublishGCS,
func(w io.Writer, dec *json.Decoder) error {
var programCoverage cover.ProgramCoverage
if err := dec.Decode(&programCoverage); err != nil {
@@ -992,7 +994,7 @@ func (mgr *Manager) uploadCorpus() error {
return err
}
defer f.Close()
- return mgr.uploadFile(mgr.cfg.CorpusUploadPath, mgr.name+"-corpus.db", f, true)
+ return uploadFile(mgr.cfg.CorpusUploadPath, mgr.name+"-corpus.db", f, mgr.cfg.PublishGCS)
}
func (mgr *Manager) uploadBenchData() error {
@@ -1010,7 +1012,7 @@ func (mgr *Manager) uploadBenchData() error {
return fmt.Errorf("failed to open bench file: %w", err)
}
defer f.Close()
- err = mgr.uploadFile(mgr.cfg.BenchUploadPath+"/"+mgr.name,
+ err = uploadFile(mgr.cfg.BenchUploadPath+"/"+mgr.name,
mgr.lastRestarted.Format("2006-01-02_15h.json"), f, false)
if err != nil {
return fmt.Errorf("failed to upload the bench file: %w", err)
@@ -1018,7 +1020,7 @@ func (mgr *Manager) uploadBenchData() error {
return nil
}
-func (mgr *Manager) uploadFile(dstPath, name string, file io.Reader, allowPublishing bool) error {
+func uploadFile(dstPath, name string, file io.Reader, publish bool) error {
URL, err := url.Parse(dstPath)
if err != nil {
return fmt.Errorf("failed to parse upload path: %w", err)
@@ -1030,31 +1032,7 @@ func (mgr *Manager) uploadFile(dstPath, name string, file io.Reader, allowPublis
strings.HasPrefix(URLStr, "https://") {
return uploadFileHTTPPut(URLStr, file)
}
- return uploadFileGCS(URLStr, file, allowPublishing && mgr.cfg.PublishGCS)
-}
-
-func uploadFileGCS(URL string, file io.Reader, publish bool) error {
- URL = strings.TrimPrefix(URL, "gs://")
- GCS, err := gcs.NewClient(context.Background())
- if err != nil {
- return fmt.Errorf("failed to create GCS client: %w", err)
- }
- defer GCS.Close()
- gcsWriter, err := GCS.FileWriter(URL)
- if err != nil {
- return fmt.Errorf("failed to create GCS writer: %w", err)
- }
- if _, err := io.Copy(gcsWriter, file); err != nil {
- gcsWriter.Close()
- return fmt.Errorf("failed to copy report: %w", err)
- }
- if err := gcsWriter.Close(); err != nil {
- return fmt.Errorf("failed to close gcs writer: %w", err)
- }
- if publish {
- return GCS.Publish(URL)
- }
- return nil
+ return gcs.UploadFile(context.Background(), file, URLStr, publish)
}
func uploadFileHTTPPut(URL string, file io.Reader) error {
diff --git a/syz-ci/syz-ci.go b/syz-ci/syz-ci.go
index ae8886bb4..74afa2b89 100644
--- a/syz-ci/syz-ci.go
+++ b/syz-ci/syz-ci.go
@@ -114,7 +114,7 @@ type Config struct {
// Path to upload corpus.db from managers (optional).
// Supported protocols: GCS (gs://) and HTTP PUT (http:// or https://).
CorpusUploadPath string `json:"corpus_upload_path"`
- // Make files uploaded via CoverUploadPath and CorpusUploadPath public.
+ // Make files uploaded via CoverUploadPath, CorpusUploadPath and CoverProgramsPath public.
PublishGCS bool `json:"publish_gcs"`
// Path to upload bench data from instances (optional).
// Supported protocols: GCS (gs://) and HTTP PUT (http:// or https://).