diff --git a/graph/pkg/service/v0/driveitems.go b/graph/pkg/service/v0/driveitems.go index 1eec27331ca..6f72fe7b4cd 100644 --- a/graph/pkg/service/v0/driveitems.go +++ b/graph/pkg/service/v0/driveitems.go @@ -2,6 +2,7 @@ package svc import ( "context" + "errors" "fmt" "net/http" "net/url" @@ -105,7 +106,7 @@ func (g Graph) getRemoteItem(ctx context.Context, root *storageprovider.Resource if res.Status.Code != cs3rpc.Code_CODE_OK { // Only log this, there could be mountpoints which have no grant g.logger.Debug().Msg(res.Status.Message) - return nil, nil + return nil, errors.New("could not fetch grant resource for the mountpoint") } item, err := cs3ResourceToRemoteItem(res.Info) if err != nil { diff --git a/graph/pkg/service/v0/drives.go b/graph/pkg/service/v0/drives.go index 19c176cc076..847be14a69b 100644 --- a/graph/pkg/service/v0/drives.go +++ b/graph/pkg/service/v0/drives.go @@ -516,7 +516,7 @@ func (g Graph) cs3StorageSpaceToDrive(ctx context.Context, baseURL *url.URL, spa var err error remoteItem, err = g.getRemoteItem(ctx, &grantID, baseURL) if err != nil { - g.logger.Debug().Err(err).Msg("Could not fetch remote item for mountpoint") + g.logger.Debug().Err(err).Msg(err.Error()) } } if remoteItem != nil { diff --git a/graph/pkg/service/v0/graph_test.go b/graph/pkg/service/v0/graph_test.go index 533420ef611..28702d4181d 100644 --- a/graph/pkg/service/v0/graph_test.go +++ b/graph/pkg/service/v0/graph_test.go @@ -184,6 +184,78 @@ var _ = Describe("Graph", func() { } `)) }) + It("can list a spaces type mountpoint", func() { + gatewayClient.On("ListStorageSpaces", mock.Anything, mock.Anything).Return(&provider.ListStorageSpacesResponse{ + Status: status.NewOK(ctx), + StorageSpaces: []*provider.StorageSpace{ + { + Id: &provider.StorageSpaceId{OpaqueId: "aID!differentID"}, + SpaceType: "mountpoint", + Root: &provider.ResourceId{ + StorageId: "aID", + OpaqueId: "differentID", + }, + Name: "New Folder", + Opaque: &typesv1beta1.Opaque{ + Map: map[string]*typesv1beta1.OpaqueEntry{ + "spaceAlias": {Decoder: "plain", Value: []byte("mountpoint/new-folder")}, + "etag": {Decoder: "plain", Value: []byte("101112131415")}, + "grantStorageID": {Decoder: "plain", Value: []byte("ownerStorageID")}, + "grantOpaqueID": {Decoder: "plain", Value: []byte("opaqueID")}, + }, + }, + }, + }, + }, nil) + gatewayClient.On("Stat", mock.Anything, mock.Anything).Return(&provider.StatResponse{ + Status: status.NewOK(ctx), + Info: &provider.ResourceInfo{ + Etag: "123456789", + Type: provider.ResourceType_RESOURCE_TYPE_CONTAINER, + Id: &provider.ResourceId{StorageId: "ownerStorageID", OpaqueId: "opaqueID"}, + Path: "New Folder", + Mtime: &typesv1beta1.Timestamp{Seconds: 1648327606}, + Size: uint64(1234), + }, + }, nil) + gatewayClient.On("GetQuota", mock.Anything, mock.Anything).Return(&provider.GetQuotaResponse{ + Status: status.NewUnimplemented(ctx, fmt.Errorf("not supported"), "not supported"), + }, nil) + + r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/me/drives", nil) + rr := httptest.NewRecorder() + svc.GetDrives(rr, r) + + Expect(rr.Code).To(Equal(http.StatusOK)) + + body, _ := io.ReadAll(rr.Body) + Expect(body).To(MatchJSON(` + { + "value":[ + { + "driveAlias":"mountpoint/new-folder", + "driveType":"mountpoint", + "id":"aID!differentID", + "name":"New Folder", + "root":{ + "eTag":"101112131415", + "id":"aID!differentID", + "remoteItem":{ + "eTag":"123456789", + "folder":{}, + "id":"ownerStorageID!opaqueID", + "lastModifiedDateTime":"2022-03-26T21:46:46+01:00", + "name":"New Folder", + "size":1234, + "webDavUrl":"https://localhost:9200/dav/spaces/ownerStorageID!opaqueID" + }, + "webDavUrl":"https://localhost:9200/dav/spaces/aID!differentID" + } + } + ] + } + `)) + }) It("can not list spaces with wrong sort parameter", func() { gatewayClient.On("ListStorageSpaces", mock.Anything, mock.Anything).Return(&provider.ListStorageSpacesResponse{ Status: status.NewOK(ctx),