Skip to content

Commit

Permalink
Merge pull request #2739 from owncloud/spaces-registry
Browse files Browse the repository at this point in the history
[full-ci] Spaces registry
  • Loading branch information
micbar authored Jan 11, 2022
2 parents b8294a0 + 1129d3c commit 2fc61bd
Show file tree
Hide file tree
Showing 39 changed files with 947 additions and 972 deletions.
45 changes: 28 additions & 17 deletions accounts/pkg/storage/cs3.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,28 @@ import (
"path"
"path/filepath"

"github.com/cs3org/reva/pkg/auth/scope"

user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
v1beta11 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
"github.com/cs3org/reva/pkg/auth/scope"
revactx "github.com/cs3org/reva/pkg/ctx"
"github.com/cs3org/reva/pkg/rgrpc/todo/pool"
"github.com/cs3org/reva/pkg/token"
"github.com/cs3org/reva/pkg/token/manager/jwt"
"github.com/cs3org/reva/pkg/utils"
"github.com/owncloud/ocis/accounts/pkg/config"
"github.com/owncloud/ocis/accounts/pkg/proto/v0"
olog "github.com/owncloud/ocis/ocis-pkg/log"
metadatastorage "github.com/owncloud/ocis/ocis-pkg/metadata_storage"
"google.golang.org/grpc/metadata"
)

const (
storageMountPath = "/meta"
)

// CS3Repo provides a cs3 implementation of the Repo interface
type CS3Repo struct {
cfg *config.Config
tm token.Manager
storageProvider provider.ProviderAPIClient
metadataStorage metadatastorage.MetadataStorage
metadataStorage *metadatastorage.MetadataStorage
}

// NewCS3Repo creates a new cs3 repo
Expand All @@ -54,12 +50,22 @@ func NewCS3Repo(cfg *config.Config) (Repo, error) {
return nil, err
}

return CS3Repo{
r := CS3Repo{
cfg: cfg,
tm: tokenManager,
storageProvider: client,
metadataStorage: ms,
}, nil
metadataStorage: &ms,
}

ctx, err := r.getAuthenticatedContext(context.Background())
if err != nil {
return nil, err
}
if err := ms.Init(ctx, cfg.ServiceUser); err != nil {
return nil, err
}

return r, nil
}

// WriteAccount writes an account via cs3 and modifies the provided account (e.g. with a generated id).
Expand Down Expand Up @@ -102,7 +108,8 @@ func (r CS3Repo) LoadAccounts(ctx context.Context, a *[]*proto.Account) (err err

res, err := r.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{
Ref: &provider.Reference{
Path: path.Join(storageMountPath, accountsFolder),
ResourceId: r.metadataStorage.SpaceRoot,
Path: utils.MakeRelativePath(accountsFolder),
},
})
if err != nil {
Expand Down Expand Up @@ -142,7 +149,8 @@ func (r CS3Repo) DeleteAccount(ctx context.Context, id string) (err error) {

resp, err := r.storageProvider.Delete(ctx, &provider.DeleteRequest{
Ref: &provider.Reference{
Path: path.Join(storageMountPath, accountsFolder, id),
ResourceId: r.metadataStorage.SpaceRoot,
Path: utils.MakeRelativePath(filepath.Join("/", accountsFolder, id)),
},
})

Expand Down Expand Up @@ -197,7 +205,8 @@ func (r CS3Repo) LoadGroups(ctx context.Context, g *[]*proto.Group) (err error)

res, err := r.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{
Ref: &provider.Reference{
Path: path.Join(storageMountPath, groupsFolder),
ResourceId: r.metadataStorage.SpaceRoot,
Path: utils.MakeRelativePath(groupsFolder),
},
})
if err != nil {
Expand Down Expand Up @@ -237,7 +246,8 @@ func (r CS3Repo) DeleteGroup(ctx context.Context, id string) (err error) {

resp, err := r.storageProvider.Delete(ctx, &provider.DeleteRequest{
Ref: &provider.Reference{
Path: path.Join(storageMountPath, groupsFolder, id),
ResourceId: r.metadataStorage.SpaceRoot,
Path: utils.MakeRelativePath(filepath.Join(groupsFolder, id)),
},
})

Expand Down Expand Up @@ -289,13 +299,14 @@ func (r CS3Repo) groupURL(id string) string {
}

func (r CS3Repo) makeRootDirIfNotExist(ctx context.Context, folder string) error {
return MakeDirIfNotExist(ctx, r.storageProvider, folder)
return MakeDirIfNotExist(ctx, r.storageProvider, r.metadataStorage.SpaceRoot, folder)
}

// MakeDirIfNotExist will create a root node in the metadata storage. Requires an authenticated context.
func MakeDirIfNotExist(ctx context.Context, sp provider.ProviderAPIClient, folder string) error {
func MakeDirIfNotExist(ctx context.Context, sp provider.ProviderAPIClient, root *provider.ResourceId, folder string) error {
var rootPathRef = &provider.Reference{
Path: path.Join(storageMountPath, folder),
ResourceId: root,
Path: utils.MakeRelativePath(folder),
}

resp, err := sp.Stat(ctx, &provider.StatRequest{
Expand Down
9 changes: 7 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ require (
github.com/gofrs/uuid v4.2.0+incompatible
github.com/golang-jwt/jwt/v4 v4.2.0
github.com/golang/protobuf v1.5.2
github.com/google/uuid v1.3.0
github.com/gookit/config/v2 v2.0.27
github.com/gorilla/mux v1.8.0
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2
Expand Down Expand Up @@ -76,6 +77,7 @@ require (
require (
contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect
github.com/BurntSushi/toml v0.4.1 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver v1.5.0 // indirect
github.com/Masterminds/sprig v2.22.0+incompatible // indirect
Expand Down Expand Up @@ -141,7 +143,6 @@ require (
github.com/gomodule/redigo v1.8.6 // indirect
github.com/google/go-cmp v0.5.6 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gookit/goutil v0.4.0 // indirect
github.com/gorilla/schema v1.2.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
Expand Down Expand Up @@ -213,7 +214,6 @@ require (
github.com/sony/gobreaker v0.5.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/steveyen/gtreap v0.1.0 // indirect
github.com/studio-b12/gowebdav v0.0.0-20211109083228-3f8721cd4b6f // indirect
github.com/tus/tusd v1.8.0 // indirect
github.com/wk8/go-ordered-map v0.2.0 // indirect
github.com/xanzy/ssh-agent v0.3.1 // indirect
Expand Down Expand Up @@ -242,3 +242,8 @@ require (
stash.kopano.io/kgol/kcc-go/v5 v5.0.1 // indirect
stash.kopano.io/kgol/oidc-go v0.3.2 // indirect
)

//replace github.com/cs3org/reva => github.com/cs3org/reva v1.16.1-0.20211208164450-3abd76eecf8b
//replace github.com/cs3org/reva => ../reva

replace github.com/cs3org/reva => github.com/cs3org/reva v1.16.1-0.20220111150347-1b21aefbf8db
7 changes: 3 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzS
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/CiscoM31/godata v1.0.5 h1:AITXpa/5ybXEq59A0nqUGiS7ZXVJnQtFw5o09tyN/UA=
Expand Down Expand Up @@ -323,8 +324,8 @@ github.com/crewjam/saml v0.4.5/go.mod h1:qCJQpUtZte9R1ZjUBcW8qtCNlinbO363ooNl02S
github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4=
github.com/cs3org/go-cs3apis v0.0.0-20211214102047-7ce3134d7bf8 h1:PqOprF37OvwCbAN5W23znknGk6N/LMayqLAeP904FHE=
github.com/cs3org/go-cs3apis v0.0.0-20211214102047-7ce3134d7bf8/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY=
github.com/cs3org/reva v1.17.1-0.20220105095955-fa1d1fc01d85 h1:4MjQ95MeeffQA9dCraON4YXBwkxVmJpxSNMKnn0ryZA=
github.com/cs3org/reva v1.17.1-0.20220105095955-fa1d1fc01d85/go.mod h1:WqO2/NkAmx1qes09G92lGPxxyroQgnZetJrCPItCcDo=
github.com/cs3org/reva v1.16.1-0.20220111150347-1b21aefbf8db h1:YCzbz8N0OHkO6AcA2SfXHCc02Y/DqSkO+hm8Pj+eDZ4=
github.com/cs3org/reva v1.16.1-0.20220111150347-1b21aefbf8db/go.mod h1:WqO2/NkAmx1qes09G92lGPxxyroQgnZetJrCPItCcDo=
github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI=
github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY=
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
Expand Down Expand Up @@ -1277,8 +1278,6 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/studio-b12/gowebdav v0.0.0-20210917133250-a3a86976a1df/go.mod h1:gCcfDlA1Y7GqOaeEKw5l9dOGx1VLdc/HuQSlQAaZ30s=
github.com/studio-b12/gowebdav v0.0.0-20211109083228-3f8721cd4b6f h1:L2NE7BXnSlSLoNYZ0lCwZDjdnYjCNYC71k9ClZUTFTs=
github.com/studio-b12/gowebdav v0.0.0-20211109083228-3f8721cd4b6f/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/thanhpk/randstr v1.0.4 h1:IN78qu/bR+My+gHCvMEXhR/i5oriVHcTB/BJJIRTsNo=
Expand Down
80 changes: 45 additions & 35 deletions graph/pkg/service/v0/drives.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import (
gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1"
userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
cs3rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
v1beta11 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
storageprovider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1"
ctxpkg "github.com/cs3org/reva/pkg/ctx"
Expand Down Expand Up @@ -213,7 +211,7 @@ func (g Graph) CreateDrive(w http.ResponseWriter, r *http.Request) {
return
}

csr := provider.CreateStorageSpaceRequest{
csr := storageprovider.CreateStorageSpaceRequest{
Owner: us,
Type: driveType,
Name: spaceName,
Expand All @@ -226,7 +224,7 @@ func (g Graph) CreateDrive(w http.ResponseWriter, r *http.Request) {
return
}

if resp.GetStatus().GetCode() != v1beta11.Code_CODE_OK {
if resp.GetStatus().GetCode() != cs3rpc.Code_CODE_OK {
errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, "")
return
}
Expand Down Expand Up @@ -266,32 +264,34 @@ func (g Graph) UpdateDrive(w http.ResponseWriter, r *http.Request) {
return
}

root := &storageprovider.ResourceId{}

identifierParts := strings.Split(driveID, "!")
if len(identifierParts) != 2 {
switch len(identifierParts) {
case 1:
root.StorageId, root.OpaqueId = identifierParts[0], identifierParts[0]
case 2:
root.StorageId, root.OpaqueId = identifierParts[0], identifierParts[1]
default:
errorcode.GeneralException.Render(w, r, http.StatusBadRequest, fmt.Sprintf("invalid resource id: %v", driveID))
w.WriteHeader(http.StatusInternalServerError)
return
}

storageID, opaqueID := identifierParts[0], identifierParts[1]

client, err := g.GetClient()
if err != nil {
errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, err.Error())
return
}

updateSpaceRequest := &provider.UpdateStorageSpaceRequest{
updateSpaceRequest := &storageprovider.UpdateStorageSpaceRequest{
// Prepare the object to apply the diff from. The properties on StorageSpace will overwrite
// the original storage space.
StorageSpace: &provider.StorageSpace{
StorageSpace: &storageprovider.StorageSpace{
Id: &storageprovider.StorageSpaceId{
OpaqueId: driveID,
},
Root: &provider.ResourceId{
StorageId: storageID,
OpaqueId: opaqueID,
OpaqueId: root.StorageId + "!" + root.OpaqueId,
},
Root: root,
},
}

Expand Down Expand Up @@ -321,9 +321,9 @@ func (g Graph) UpdateDrive(w http.ResponseWriter, r *http.Request) {
return
}

if resp.GetStatus().GetCode() != v1beta11.Code_CODE_OK {
if resp.GetStatus().GetCode() != cs3rpc.Code_CODE_OK {
switch resp.Status.GetCode() {
case v1beta11.Code_CODE_NOT_FOUND:
case cs3rpc.Code_CODE_NOT_FOUND:
errorcode.ItemNotFound.Render(w, r, http.StatusNotFound, resp.GetStatus().GetMessage())
return
default:
Expand Down Expand Up @@ -395,17 +395,16 @@ func formatDriveItems(mds []*storageprovider.ResourceInfo) ([]*libregraph.DriveI

func cs3StorageSpaceToDrive(baseURL *url.URL, space *storageprovider.StorageSpace) (*libregraph.Drive, error) {
rootID := space.Root.StorageId + "!" + space.Root.OpaqueId
if space.Root.StorageId == space.Root.OpaqueId {
// omit opaqueid
rootID = space.Root.StorageId
}

drive := &libregraph.Drive{
Id: &space.Id.OpaqueId,
Id: &rootID,
Name: &space.Name,
//"createdDateTime": "string (timestamp)", // TODO read from StorageSpace ... needs Opaque for now
//"description": "string", // TODO read from StorageSpace ... needs Opaque for now
Owner: &libregraph.IdentitySet{
User: &libregraph.Identity{
Id: &space.Owner.Id.OpaqueId,
// DisplayName: , TODO read and cache from users provider
},
},
DriveType: &space.SpaceType,
Root: &libregraph.DriveItem{
Id: &rootID,
Expand All @@ -420,6 +419,15 @@ func cs3StorageSpaceToDrive(baseURL *url.URL, space *storageprovider.StorageSpac
drive.Root.WebDavUrl = &webDavURL
}

// TODO The public space has no owner ... should we even show it?
if space.Owner != nil && space.Owner.Id != nil {
drive.Owner = &libregraph.IdentitySet{
User: &libregraph.Identity{
Id: &space.Owner.Id.OpaqueId,
// DisplayName: , TODO read and cache from users provider
},
}
}
if space.Mtime != nil {
lastModified := cs3TimestampToTime(space.Mtime)
drive.LastModifiedDateTime = &lastModified
Expand Down Expand Up @@ -447,27 +455,26 @@ func (g Graph) formatDrives(ctx context.Context, baseURL *url.URL, mds []*storag
if err != nil {
return nil, err
}
qta, err := g.getDriveQuota(ctx, mds[i])
res.Quota, err = g.getDriveQuota(ctx, mds[i])
if err != nil {
return nil, err
}
res.Quota = &qta
responses = append(responses, res)
}

return responses, nil
}

func (g Graph) getDriveQuota(ctx context.Context, space *storageprovider.StorageSpace) (libregraph.Quota, error) {
func (g Graph) getDriveQuota(ctx context.Context, space *storageprovider.StorageSpace) (*libregraph.Quota, error) {
client, err := g.GetClient()
if err != nil {
g.logger.Error().Err(err).Msg("error creating grpc client")
return libregraph.Quota{}, err
return nil, err
}

req := &gateway.GetQuotaRequest{
Ref: &provider.Reference{
ResourceId: &provider.ResourceId{
Ref: &storageprovider.Reference{
ResourceId: &storageprovider.ResourceId{
StorageId: space.Root.StorageId,
OpaqueId: space.Root.OpaqueId,
},
Expand All @@ -478,10 +485,13 @@ func (g Graph) getDriveQuota(ctx context.Context, space *storageprovider.Storage
switch {
case err != nil:
g.logger.Error().Err(err).Msg("error sending get quota grpc request")
return libregraph.Quota{}, err
return nil, nil
case res.Status.Code == cs3rpc.Code_CODE_UNIMPLEMENTED:
// TODO well duh
return nil, nil
case res.Status.Code != cs3rpc.Code_CODE_OK:
g.logger.Error().Err(err).Msg("error sending sending get quota grpc request")
return libregraph.Quota{}, err
return nil, err
}

total := int64(res.TotalBytes)
Expand All @@ -496,7 +506,7 @@ func (g Graph) getDriveQuota(ctx context.Context, space *storageprovider.Storage
state := calculateQuotaState(total, used)
qta.State = &state

return qta, nil
return &qta, nil
}

func calculateQuotaState(total int64, used int64) (state string) {
Expand All @@ -514,16 +524,16 @@ func calculateQuotaState(total int64, used int64) (state string) {
}
}

func getQuota(quota *libregraph.Quota, defaultQuota string) *provider.Quota {
func getQuota(quota *libregraph.Quota, defaultQuota string) *storageprovider.Quota {
switch {
case quota != nil && quota.Total != nil:
if q := *quota.Total; q >= 0 {
return &provider.Quota{QuotaMaxBytes: uint64(q)}
return &storageprovider.Quota{QuotaMaxBytes: uint64(q)}
}
fallthrough
case defaultQuota != "":
if q, err := strconv.ParseInt(defaultQuota, 10, 64); err == nil && q >= 0 {
return &provider.Quota{QuotaMaxBytes: uint64(q)}
return &storageprovider.Quota{QuotaMaxBytes: uint64(q)}
}
fallthrough
default:
Expand Down
Loading

0 comments on commit 2fc61bd

Please sign in to comment.