Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/content-service/pkg/service/ideplugin-service.go
2499 views
1
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package service
6
7
import (
8
"context"
9
10
"github.com/opentracing/opentracing-go"
11
"google.golang.org/grpc/codes"
12
"google.golang.org/grpc/status"
13
14
"github.com/gitpod-io/gitpod/common-go/log"
15
"github.com/gitpod-io/gitpod/common-go/tracing"
16
"github.com/gitpod-io/gitpod/content-service/api"
17
"github.com/gitpod-io/gitpod/content-service/api/config"
18
"github.com/gitpod-io/gitpod/content-service/pkg/storage"
19
)
20
21
// IDEPluginService implements IDEPluginServiceServer
22
type IDEPluginService struct {
23
cfg config.StorageConfig
24
s storage.PresignedAccess
25
26
api.UnimplementedIDEPluginServiceServer
27
}
28
29
// NewIDEPluginService create a new IDE plugin service
30
func NewIDEPluginService(cfg config.StorageConfig) (res *IDEPluginService, err error) {
31
s, err := storage.NewPresignedAccess(&cfg)
32
if err != nil {
33
return nil, err
34
}
35
return &IDEPluginService{cfg: cfg, s: s}, nil
36
}
37
38
// UploadURL provides a URL to which clients can upload the content via HTTP PUT.
39
func (cs *IDEPluginService) UploadURL(ctx context.Context, req *api.PluginUploadURLRequest) (resp *api.PluginUploadURLResponse, err error) {
40
span, ctx := opentracing.StartSpanFromContext(ctx, "Plugin.UploadURL")
41
span.SetTag("name", req.Name)
42
defer tracing.FinishSpan(span, &err)
43
44
err = cs.s.EnsureExists(ctx, req.Bucket)
45
if err != nil {
46
return nil, status.Error(codes.NotFound, err.Error())
47
}
48
49
info, err := cs.s.SignUpload(ctx, req.Bucket, req.Name, &storage.SignedURLOptions{
50
ContentType: "*/*",
51
})
52
if err != nil {
53
log.WithField("name", req.Name).
54
WithField("bucket", req.Bucket).
55
WithError(err).
56
Error("error getting Plugin SignUpload URL")
57
if err == storage.ErrNotFound {
58
return nil, status.Error(codes.NotFound, err.Error())
59
}
60
return nil, status.Error(codes.Unknown, err.Error())
61
}
62
return &api.PluginUploadURLResponse{Url: info.URL}, nil
63
}
64
65
// DownloadURL provides a URL from which clients can download the content via HTTP GET.
66
func (cs *IDEPluginService) DownloadURL(ctx context.Context, req *api.PluginDownloadURLRequest) (resp *api.PluginDownloadURLResponse, err error) {
67
span, ctx := opentracing.StartSpanFromContext(ctx, "Plugin.DownloadURL")
68
span.SetTag("name", req.Name)
69
defer tracing.FinishSpan(span, &err)
70
71
info, err := cs.s.SignDownload(ctx, req.Bucket, req.Name, &storage.SignedURLOptions{
72
ContentType: "*/*",
73
})
74
if err != nil {
75
log.WithField("name", req.Name).
76
WithField("bucket", req.Bucket).
77
WithError(err).
78
Error("error getting Plugin SignDownload URL")
79
if err == storage.ErrNotFound {
80
return nil, status.Error(codes.NotFound, err.Error())
81
}
82
return nil, status.Error(codes.Unknown, err.Error())
83
}
84
return &api.PluginDownloadURLResponse{Url: info.URL}, nil
85
}
86
87
// PluginHash provides a hash of the plugin
88
func (cs *IDEPluginService) PluginHash(ctx context.Context, req *api.PluginHashRequest) (resp *api.PluginHashResponse, err error) {
89
span, ctx := opentracing.StartSpanFromContext(ctx, "Plugin.PluginHash")
90
span.SetTag("name", req.Name)
91
defer tracing.FinishSpan(span, &err)
92
93
hash, err := cs.s.ObjectHash(ctx, req.Bucket, req.Name)
94
if err != nil {
95
log.WithField("name", req.Name).
96
WithField("bucket", req.Bucket).
97
WithError(err).
98
Error("error getting Plugin Hash")
99
if err == storage.ErrNotFound {
100
return nil, status.Error(codes.NotFound, err.Error())
101
}
102
return nil, status.Error(codes.Unknown, err.Error())
103
}
104
return &api.PluginHashResponse{Hash: hash}, nil
105
}
106
107