From 182a8be64d3dab29bf584b5c0d1d561191511e37 Mon Sep 17 00:00:00 2001 From: Hugo Gonzalez Labrador Date: Tue, 6 Aug 2024 10:48:34 +0200 Subject: [PATCH] add mock spaces api --- go.mod | 2 +- go.sum | 2 + internal/grpc/services/gateway/spaces.go | 41 ++++ .../grpc/services/gateway/storageprovider.go | 198 ------------------ 4 files changed, 44 insertions(+), 199 deletions(-) create mode 100644 internal/grpc/services/gateway/spaces.go diff --git a/go.mod b/go.mod index db30cab6d4..6b93863ff4 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( github.com/coreos/go-oidc/v3 v3.9.0 github.com/creasty/defaults v1.7.0 github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e - github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543 github.com/dgraph-io/ristretto v0.1.1 github.com/dolthub/go-mysql-server v0.14.0 github.com/gdexlab/go-render v1.0.1 @@ -74,6 +73,7 @@ require ( github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cs3org/go-cs3apis v0.0.0-20240802083356-d617314e1795 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dolthub/vitess v0.0.0-20221031111135-9aad77e7b39f // indirect github.com/dustin/go-humanize v1.0.1 // indirect diff --git a/go.sum b/go.sum index e9b433355f..b1d5154738 100644 --- a/go.sum +++ b/go.sum @@ -893,6 +893,8 @@ github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJff github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543 h1:IFo6dj0XEOIA6i2baRWMC3vd+fAmuIUAVfSf77ZhoQg= github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/go-cs3apis v0.0.0-20240802083356-d617314e1795 h1:8WkweBxMQ1W6IhcK0X3eWY+aQCjEktGwVt/4KLrtOZ8= +github.com/cs3org/go-cs3apis v0.0.0-20240802083356-d617314e1795/go.mod h1:yyP8PRo0EZou3nSH7H4qjlzQwaydPeIRNgX50npQHpE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/internal/grpc/services/gateway/spaces.go b/internal/grpc/services/gateway/spaces.go new file mode 100644 index 0000000000..5a157694c4 --- /dev/null +++ b/internal/grpc/services/gateway/spaces.go @@ -0,0 +1,41 @@ +// Copyright 2018-2024 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package gateway + +import ( + "context" + + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" +) + +func (s *svc) CreateStorageSpace(ctx context.Context, req *provider.CreateStorageSpaceRequest) (*provider.CreateStorageSpaceResponse, error) { + return nil, nil +} + +func (s *svc) ListStorageSpaces(ctx context.Context, req *provider.ListStorageSpacesRequest) (*provider.ListStorageSpacesResponse, error) { + return nil, nil +} + +func (s *svc) UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorageSpaceRequest) (*provider.UpdateStorageSpaceResponse, error) { + return nil, nil +} + +func (s *svc) DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorageSpaceRequest) (*provider.DeleteStorageSpaceResponse, error) { + return nil, nil +} diff --git a/internal/grpc/services/gateway/storageprovider.go b/internal/grpc/services/gateway/storageprovider.go index 086f3f95df..a9278a13c9 100644 --- a/internal/grpc/services/gateway/storageprovider.go +++ b/internal/grpc/services/gateway/storageprovider.go @@ -24,7 +24,6 @@ import ( "net/url" "path" "strings" - "sync" "time" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" @@ -100,203 +99,6 @@ func (s *svc) CreateHome(ctx context.Context, req *provider.CreateHomeRequest) ( return res, nil } -func (s *svc) CreateStorageSpace(ctx context.Context, req *provider.CreateStorageSpaceRequest) (*provider.CreateStorageSpaceResponse, error) { - log := appctx.GetLogger(ctx) - // TODO: needs to be fixed - c, err := s.findByPath(ctx, "/users") - if err != nil { - return &provider.CreateStorageSpaceResponse{ - Status: status.NewStatusFromErrType(ctx, "error finding path", err), - }, nil - } - - res, err := c.CreateStorageSpace(ctx, req) - if err != nil { - log.Err(err).Msg("gateway: error creating storage space on storage provider") - return &provider.CreateStorageSpaceResponse{ - Status: status.NewInternal(ctx, err, "error calling CreateStorageSpace"), - }, nil - } - return res, nil -} - -func (s *svc) ListStorageSpaces(ctx context.Context, req *provider.ListStorageSpacesRequest) (*provider.ListStorageSpacesResponse, error) { - log := appctx.GetLogger(ctx) - var id *provider.StorageSpaceId - for _, f := range req.Filters { - if f.Type == provider.ListStorageSpacesRequest_Filter_TYPE_ID { - id = f.GetId() - } - } - - var ( - providers []*registry.ProviderInfo - err error - ) - c, err := pool.GetStorageRegistryClient(pool.Endpoint(s.c.StorageRegistryEndpoint)) - if err != nil { - return nil, errors.Wrap(err, "gateway: error getting storage registry client") - } - - if id != nil { - // query that specific storage provider - storageid, opaqeid, err := utils.SplitStorageSpaceID(id.OpaqueId) - if err != nil { - return &provider.ListStorageSpacesResponse{ - Status: status.NewInvalidArg(ctx, "space id must be separated by !"), - }, nil - } - res, err := c.GetStorageProviders(ctx, ®istry.GetStorageProvidersRequest{ - Ref: &provider.Reference{ResourceId: &provider.ResourceId{ - StorageId: storageid, - OpaqueId: opaqeid, - }}, - }) - if err != nil { - return &provider.ListStorageSpacesResponse{ - Status: status.NewStatusFromErrType(ctx, "ListStorageSpaces filters: req "+req.String(), err), - }, nil - } - if res.Status.Code != rpc.Code_CODE_OK { - return &provider.ListStorageSpacesResponse{ - Status: res.Status, - }, nil - } - providers = res.Providers - } else { - // get list of all storage providers - res, err := c.ListStorageProviders(ctx, ®istry.ListStorageProvidersRequest{}) - - if err != nil { - return &provider.ListStorageSpacesResponse{ - Status: status.NewStatusFromErrType(ctx, "error listing providers", err), - }, nil - } - if res.Status.Code != rpc.Code_CODE_OK { - return &provider.ListStorageSpacesResponse{ - Status: res.Status, - }, nil - } - - providers = make([]*registry.ProviderInfo, 0, len(res.Providers)) - // FIXME filter only providers that have an id set ... currently none have? - // bug? only ProviderPath is set - for i := range res.Providers { - // use only providers whose path does not start with a /? - if strings.HasPrefix(res.Providers[i].ProviderPath, "/") { - continue - } - providers = append(providers, res.Providers[i]) - } - } - - spacesFromProviders := make([][]*provider.StorageSpace, len(providers)) - errors := make([]error, len(providers)) - - var wg sync.WaitGroup - for i, p := range providers { - wg.Add(1) - go s.listStorageSpacesOnProvider(ctx, req, &spacesFromProviders[i], p, &errors[i], &wg) - } - wg.Wait() - - uniqueSpaces := map[string]*provider.StorageSpace{} - for i := range providers { - if errors[i] != nil { - if len(providers) > 1 { - log.Debug().Err(errors[i]).Msg("skipping provider") - continue - } - return &provider.ListStorageSpacesResponse{ - Status: status.NewStatusFromErrType(ctx, "error listing space", errors[i]), - }, nil - } - for j := range spacesFromProviders[i] { - uniqueSpaces[spacesFromProviders[i][j].Id.OpaqueId] = spacesFromProviders[i][j] - } - } - spaces := make([]*provider.StorageSpace, 0, len(uniqueSpaces)) - for spaceID := range uniqueSpaces { - spaces = append(spaces, uniqueSpaces[spaceID]) - } - if len(spaces) == 0 { - return &provider.ListStorageSpacesResponse{ - Status: status.NewNotFound(ctx, "space not found"), - }, nil - } - - return &provider.ListStorageSpacesResponse{ - Status: status.NewOK(ctx), - StorageSpaces: spaces, - }, nil -} - -func (s *svc) listStorageSpacesOnProvider(ctx context.Context, req *provider.ListStorageSpacesRequest, res *[]*provider.StorageSpace, p *registry.ProviderInfo, e *error, wg *sync.WaitGroup) { - defer wg.Done() - c, err := s.getStorageProviderClient(ctx, p) - if err != nil { - *e = errors.Wrap(err, "error connecting to storage provider="+p.Address) - return - } - - r, err := c.ListStorageSpaces(ctx, req) - if err != nil { - *e = errors.Wrap(err, "gateway: error calling ListStorageSpaces") - return - } - - *res = r.StorageSpaces -} - -func (s *svc) UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorageSpaceRequest) (*provider.UpdateStorageSpaceResponse, error) { - log := appctx.GetLogger(ctx) - // TODO: needs to be fixed - c, err := s.find(ctx, &provider.Reference{ResourceId: req.StorageSpace.Root}) - if err != nil { - return &provider.UpdateStorageSpaceResponse{ - Status: status.NewStatusFromErrType(ctx, "error finding ID", err), - }, nil - } - - res, err := c.UpdateStorageSpace(ctx, req) - if err != nil { - log.Err(err).Msg("gateway: error creating update space on storage provider") - return &provider.UpdateStorageSpaceResponse{ - Status: status.NewInternal(ctx, err, "error calling UpdateStorageSpace"), - }, nil - } - return res, nil -} - -func (s *svc) DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorageSpaceRequest) (*provider.DeleteStorageSpaceResponse, error) { - log := appctx.GetLogger(ctx) - // TODO: needs to be fixed - storageid, opaqeid, err := utils.SplitStorageSpaceID(req.Id.OpaqueId) - if err != nil { - return &provider.DeleteStorageSpaceResponse{ - Status: status.NewInvalidArg(ctx, "space id must be separated by !"), - }, nil - } - c, err := s.find(ctx, &provider.Reference{ResourceId: &provider.ResourceId{ - StorageId: storageid, - OpaqueId: opaqeid, - }}) - if err != nil { - return &provider.DeleteStorageSpaceResponse{ - Status: status.NewStatusFromErrType(ctx, "error finding path", err), - }, nil - } - - res, err := c.DeleteStorageSpace(ctx, req) - if err != nil { - log.Err(err).Msg("gateway: error deleting storage space on storage provider") - return &provider.DeleteStorageSpaceResponse{ - Status: status.NewInternal(ctx, err, "error calling DeleteStorageSpace"), - }, nil - } - return res, nil -} - func (s *svc) GetHome(ctx context.Context, _ *provider.GetHomeRequest) (*provider.GetHomeResponse, error) { return &provider.GetHomeResponse{ Path: s.getHome(ctx),