diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2022-07-15 09:35:48 +0000 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2022-08-24 12:05:06 +0200 |
| commit | 924a4fd1cb7a5ad3b5720380eb6fc742ea7602d2 (patch) | |
| tree | 00f090d775e22d1c32340909d66cccdea6e32011 /pkg/asset/backend_dummy.go | |
| parent | 6db8af716fb0995966f00e2d52d2f3baa43ea868 (diff) | |
syz-ci: upload build assets
This commit introduces the syz-ci side of the asset storage
functionality.
* Intercept assets at various stages of syz-ci operation.
* Compress and upload assets to GCS.
* Report assets to the dashboard.
* Remove no longer needed assets.
Diffstat (limited to 'pkg/asset/backend_dummy.go')
| -rw-r--r-- | pkg/asset/backend_dummy.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/pkg/asset/backend_dummy.go b/pkg/asset/backend_dummy.go new file mode 100644 index 000000000..5e811d48e --- /dev/null +++ b/pkg/asset/backend_dummy.go @@ -0,0 +1,103 @@ +// Copyright 2022 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package asset + +import ( + "fmt" + "strings" + "time" +) + +type objectUploadCallback func(req *uploadRequest) (*uploadResponse, error) +type objectRemoveCallback func(url string) error + +type dummyObject struct { + createdAt time.Time + contentType string + contentEncoding string +} + +type dummyStorageBackend struct { + currentTime time.Time + objects map[string]*dummyObject + objectUpload objectUploadCallback + objectRemove objectRemoveCallback +} + +func makeDummyStorageBackend() *dummyStorageBackend { + return &dummyStorageBackend{ + currentTime: time.Now(), + objects: make(map[string]*dummyObject), + } +} + +type dummyWriteCloser struct { +} + +func (dwc *dummyWriteCloser) Write(p []byte) (int, error) { + return len(p), nil +} + +func (dwc *dummyWriteCloser) Close() error { + return nil +} + +func (be *dummyStorageBackend) upload(req *uploadRequest) (*uploadResponse, error) { + be.objects[req.savePath] = &dummyObject{ + createdAt: be.currentTime, + contentType: req.contentType, + contentEncoding: req.contentEncoding, + } + if be.objectUpload != nil { + return be.objectUpload(req) + } + return &uploadResponse{writer: &dummyWriteCloser{}}, nil +} + +func (be *dummyStorageBackend) downloadURL(path string, publicURL bool) (string, error) { + return "http://download/" + path, nil +} + +func (be *dummyStorageBackend) getPath(url string) (string, error) { + return strings.TrimPrefix(url, "http://download/"), nil +} + +func (be *dummyStorageBackend) list() ([]storedObject, error) { + ret := []storedObject{} + for path, obj := range be.objects { + ret = append(ret, storedObject{ + path: path, + createdAt: obj.createdAt, + }) + } + return ret, nil +} + +func (be *dummyStorageBackend) remove(path string) error { + if be.objectRemove != nil { + if err := be.objectRemove(path); err != nil { + return err + } + } + if _, ok := be.objects[path]; !ok { + return ErrAssetDoesNotExist + } + delete(be.objects, path) + return nil +} + +func (be *dummyStorageBackend) hasOnly(paths []string) error { + makeError := func() error { + return fmt.Errorf("object sets are not equal; needed: %#v; uploaded: %#v", paths, be.objects) + } + if len(paths) != len(be.objects) { + return makeError() + } + for _, path := range paths { + if be.objects[path] == nil { + return makeError() + } + } + return nil +} |
