Skip to content

Commit 26e93b8

Browse files
committed
[content-service] Implement UsageReportService.GetDownloadURL
1 parent 8d00926 commit 26e93b8

File tree

3 files changed

+74
-9
lines changed

3 files changed

+74
-9
lines changed

Diff for: components/content-service/pkg/service/usage-report-service.go

+52-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package service
66

77
import (
88
"context"
9-
9+
"errors"
1010
"github.com/opentracing/opentracing-go"
1111
"google.golang.org/grpc/codes"
1212
"google.golang.org/grpc/status"
@@ -42,20 +42,64 @@ func (us *UsageReportService) UploadURL(ctx context.Context, req *api.UsageRepor
4242
span.SetTag("name", req.Name)
4343
defer tracing.FinishSpan(span, &err)
4444

45-
err = us.s.EnsureExists(ctx, us.bucketName)
45+
if req.GetName() == "" {
46+
return nil, status.Error(codes.InvalidArgument, "Name is required but got empty.")
47+
}
48+
49+
logger := log.WithField("name", req.Name).
50+
WithField("bucket", us.bucketName)
51+
52+
err = us.ensureBucketExists(ctx)
4653
if err != nil {
47-
return nil, status.Error(codes.NotFound, err.Error())
54+
return nil, err
4855
}
4956

5057
info, err := us.s.SignUpload(ctx, us.bucketName, req.Name, &storage.SignedURLOptions{
5158
ContentType: "application/json",
5259
})
5360
if err != nil {
54-
log.WithField("name", req.Name).
55-
WithField("bucket", us.bucketName).
56-
WithError(err).
57-
Error("Error getting UsageReport SignUpload URL")
58-
return nil, status.Error(codes.Unknown, err.Error())
61+
logger.WithError(err).Error("Error getting UsageReport SignUpload URL")
62+
return nil, status.Error(codes.Internal, err.Error())
5963
}
6064
return &api.UsageReportUploadURLResponse{Url: info.URL}, nil
6165
}
66+
67+
func (us *UsageReportService) DownloadURL(ctx context.Context, req *api.UsageReportDownloadURLRequest) (resp *api.UsageReportDownloadURLResponse, err error) {
68+
span, ctx := opentracing.StartSpanFromContext(ctx, "UsageReport.DownloadURL")
69+
span.SetTag("name", req.Name)
70+
defer tracing.FinishSpan(span, &err)
71+
72+
if req.GetName() == "" {
73+
return nil, status.Error(codes.InvalidArgument, "Name is required but got empty.")
74+
}
75+
76+
err = us.ensureBucketExists(ctx)
77+
if err != nil {
78+
return nil, err
79+
}
80+
81+
download, err := us.s.SignDownload(ctx, us.bucketName, req.GetName(), &storage.SignedURLOptions{
82+
ContentType: "application/json",
83+
})
84+
if err != nil {
85+
if errors.Is(err, storage.ErrNotFound) {
86+
return nil, status.Errorf(codes.NotFound, "Object %s does not exist.", req.GetName())
87+
}
88+
89+
return nil, status.Errorf(codes.Internal, "Failed to generate download URL for usage report: %s", err.Error())
90+
}
91+
92+
return &api.UsageReportDownloadURLResponse{
93+
Url: download.URL,
94+
}, nil
95+
}
96+
97+
func (us *UsageReportService) ensureBucketExists(ctx context.Context) error {
98+
err := us.s.EnsureExists(ctx, us.bucketName)
99+
if err != nil {
100+
log.WithError(err).Errorf("Bucket %s does not exist", us.bucketName)
101+
return status.Error(codes.Internal, err.Error())
102+
}
103+
104+
return nil
105+
}

Diff for: components/content-service/pkg/service/usage-report-service_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,24 @@ func TestUploadURL(t *testing.T) {
3838
require.NoError(t, err)
3939
require.Equal(t, "http://example.com/some-path", resp.Url)
4040
}
41+
42+
func TestDownloadURL(t *testing.T) {
43+
const (
44+
fileName = "some-report-filename"
45+
bucketName = "gitpod-usage-reports"
46+
)
47+
48+
ctrl := gomock.NewController(t)
49+
s := storagemock.NewMockPresignedAccess(ctrl)
50+
51+
s.EXPECT().EnsureExists(gomock.Any(), bucketName).
52+
Return(nil)
53+
s.EXPECT().SignDownload(gomock.Any(), bucketName, fileName, gomock.Any()).
54+
Return(&storage.DownloadInfo{URL: "http://example.com/some-path"}, nil)
55+
56+
svc := &UsageReportService{cfg: config.StorageConfig{}, s: s, bucketName: bucketName}
57+
resp, err := svc.DownloadURL(context.Background(), &api.UsageReportDownloadURLRequest{Name: fileName})
58+
59+
require.NoError(t, err)
60+
require.Equal(t, "http://example.com/some-path", resp.Url)
61+
}

Diff for: components/content-service/pkg/storage/storage.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const (
3232

3333
var (
3434
// ErrNotFound is returned when an object is not found
35-
ErrNotFound = xerrors.Errorf("not found")
35+
ErrNotFound = fmt.Errorf("not found")
3636
)
3737

3838
// BucketNamer provides names for storage buckets

0 commit comments

Comments
 (0)