Path: blob/main/components/content-service/pkg/service/ideplugin-service.go
2499 views
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package service56import (7"context"89"github.com/opentracing/opentracing-go"10"google.golang.org/grpc/codes"11"google.golang.org/grpc/status"1213"github.com/gitpod-io/gitpod/common-go/log"14"github.com/gitpod-io/gitpod/common-go/tracing"15"github.com/gitpod-io/gitpod/content-service/api"16"github.com/gitpod-io/gitpod/content-service/api/config"17"github.com/gitpod-io/gitpod/content-service/pkg/storage"18)1920// IDEPluginService implements IDEPluginServiceServer21type IDEPluginService struct {22cfg config.StorageConfig23s storage.PresignedAccess2425api.UnimplementedIDEPluginServiceServer26}2728// NewIDEPluginService create a new IDE plugin service29func NewIDEPluginService(cfg config.StorageConfig) (res *IDEPluginService, err error) {30s, err := storage.NewPresignedAccess(&cfg)31if err != nil {32return nil, err33}34return &IDEPluginService{cfg: cfg, s: s}, nil35}3637// UploadURL provides a URL to which clients can upload the content via HTTP PUT.38func (cs *IDEPluginService) UploadURL(ctx context.Context, req *api.PluginUploadURLRequest) (resp *api.PluginUploadURLResponse, err error) {39span, ctx := opentracing.StartSpanFromContext(ctx, "Plugin.UploadURL")40span.SetTag("name", req.Name)41defer tracing.FinishSpan(span, &err)4243err = cs.s.EnsureExists(ctx, req.Bucket)44if err != nil {45return nil, status.Error(codes.NotFound, err.Error())46}4748info, err := cs.s.SignUpload(ctx, req.Bucket, req.Name, &storage.SignedURLOptions{49ContentType: "*/*",50})51if err != nil {52log.WithField("name", req.Name).53WithField("bucket", req.Bucket).54WithError(err).55Error("error getting Plugin SignUpload URL")56if err == storage.ErrNotFound {57return nil, status.Error(codes.NotFound, err.Error())58}59return nil, status.Error(codes.Unknown, err.Error())60}61return &api.PluginUploadURLResponse{Url: info.URL}, nil62}6364// DownloadURL provides a URL from which clients can download the content via HTTP GET.65func (cs *IDEPluginService) DownloadURL(ctx context.Context, req *api.PluginDownloadURLRequest) (resp *api.PluginDownloadURLResponse, err error) {66span, ctx := opentracing.StartSpanFromContext(ctx, "Plugin.DownloadURL")67span.SetTag("name", req.Name)68defer tracing.FinishSpan(span, &err)6970info, err := cs.s.SignDownload(ctx, req.Bucket, req.Name, &storage.SignedURLOptions{71ContentType: "*/*",72})73if err != nil {74log.WithField("name", req.Name).75WithField("bucket", req.Bucket).76WithError(err).77Error("error getting Plugin SignDownload URL")78if err == storage.ErrNotFound {79return nil, status.Error(codes.NotFound, err.Error())80}81return nil, status.Error(codes.Unknown, err.Error())82}83return &api.PluginDownloadURLResponse{Url: info.URL}, nil84}8586// PluginHash provides a hash of the plugin87func (cs *IDEPluginService) PluginHash(ctx context.Context, req *api.PluginHashRequest) (resp *api.PluginHashResponse, err error) {88span, ctx := opentracing.StartSpanFromContext(ctx, "Plugin.PluginHash")89span.SetTag("name", req.Name)90defer tracing.FinishSpan(span, &err)9192hash, err := cs.s.ObjectHash(ctx, req.Bucket, req.Name)93if err != nil {94log.WithField("name", req.Name).95WithField("bucket", req.Bucket).96WithError(err).97Error("error getting Plugin Hash")98if err == storage.ErrNotFound {99return nil, status.Error(codes.NotFound, err.Error())100}101return nil, status.Error(codes.Unknown, err.Error())102}103return &api.PluginHashResponse{Hash: hash}, nil104}105106107