internal/storage: add object not found error

This error will be used by the server to respond with a 404
on requests for objects that do not exist.

Change-Id: I64d232e4f3321d9b80be9b3da2572c5b32c76c9c
Reviewed-on: https://go-review.googlesource.com/c/telemetry/+/523737
Run-TryBot: Jamal Carvalho <jamal@golang.org>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/godev/internal/storage/storage.go b/godev/internal/storage/storage.go
index 93182b3..41f2482 100644
--- a/godev/internal/storage/storage.go
+++ b/godev/internal/storage/storage.go
@@ -70,7 +70,11 @@
 
 func (s *gcStore) Reader(ctx context.Context, object string) (io.ReadCloser, error) {
 	obj := s.bucket.Object(object)
-	return obj.NewReader(ctx)
+	r, err := obj.NewReader(ctx)
+	if errors.Is(err, storage.ErrObjectNotExist) {
+		return nil, ErrObjectNotExist
+	}
+	return r, err
 }
 
 func (s *gcStore) List(ctx context.Context, prefix string) (*ObjectIterator, error) {
@@ -120,7 +124,11 @@
 }
 
 func (s *fsStore) Reader(ctx context.Context, object string) (io.ReadCloser, error) {
-	return os.Open(filepath.Join(s.dir, s.bucket, filepath.FromSlash(object)))
+	r, err := os.Open(filepath.Join(s.dir, s.bucket, filepath.FromSlash(object)))
+	if errors.Is(err, os.ErrNotExist) {
+		return nil, ErrObjectNotExist
+	}
+	return r, err
 }
 
 func (s *fsStore) List(ctx context.Context, prefix string) (*ObjectIterator, error) {
@@ -157,6 +165,7 @@
 }
 
 var ErrObjectIteratorDone = errors.New("object iterator done")
+var ErrObjectNotExist = errors.New("object does not exist")
 
 type ObjectIterator struct {
 	Next func() (elem string, err error)