From 80beedf13e92aa41aacf0e90524bf27053d4d15e Mon Sep 17 00:00:00 2001 From: Denis Kirillov Date: Tue, 13 Sep 2022 12:44:18 +0300 Subject: [PATCH] [#504] Use bktInfo in tree service to check owner Signed-off-by: Denis Kirillov --- api/handler/tagging.go | 6 +- api/layer/compound.go | 2 +- api/layer/cors.go | 4 +- api/layer/layer.go | 10 +- api/layer/multipart_upload.go | 18 +-- api/layer/notifications.go | 4 +- api/layer/object.go | 12 +- api/layer/system_object.go | 18 +-- api/layer/tagging.go | 32 ++-- api/layer/tree_mock.go | 107 +++++++------- api/layer/tree_service.go | 59 ++++---- internal/neofs/tree.go | 266 +++++++++++++++++----------------- 12 files changed, 267 insertions(+), 271 deletions(-) diff --git a/api/handler/tagging.go b/api/handler/tagging.go index 27843658..106383c9 100644 --- a/api/handler/tagging.go +++ b/api/handler/tagging.go @@ -157,7 +157,7 @@ func (h *handler) PutBucketTaggingHandler(w http.ResponseWriter, r *http.Request return } - if err = h.obj.PutBucketTagging(r.Context(), bktInfo.CID, tagSet); err != nil { + if err = h.obj.PutBucketTagging(r.Context(), bktInfo, tagSet); err != nil { h.logAndSendError(w, "could not put object tagging", reqInfo, err) return } @@ -172,7 +172,7 @@ func (h *handler) GetBucketTaggingHandler(w http.ResponseWriter, r *http.Request return } - tagSet, err := h.obj.GetBucketTagging(r.Context(), bktInfo.CID) + tagSet, err := h.obj.GetBucketTagging(r.Context(), bktInfo) if err != nil { h.logAndSendError(w, "could not get object tagging", reqInfo, err) return @@ -193,7 +193,7 @@ func (h *handler) DeleteBucketTaggingHandler(w http.ResponseWriter, r *http.Requ return } - if err = h.obj.DeleteBucketTagging(r.Context(), bktInfo.CID); err != nil { + if err = h.obj.DeleteBucketTagging(r.Context(), bktInfo); err != nil { h.logAndSendError(w, "could not delete bucket tagging", reqInfo, err) return } diff --git a/api/layer/compound.go b/api/layer/compound.go index c42abae5..1665cb4c 100644 --- a/api/layer/compound.go +++ b/api/layer/compound.go @@ -29,7 +29,7 @@ func (n *layer) GetObjectTaggingAndLock(ctx context.Context, objVersion *ObjectV } } - tags, lockInfo, err = n.treeService.GetObjectTaggingAndLock(ctx, objVersion.BktInfo.CID, nodeVersion) + tags, lockInfo, err = n.treeService.GetObjectTaggingAndLock(ctx, objVersion.BktInfo, nodeVersion) if err != nil { if errorsStd.Is(err, ErrNodeNotFound) { return nil, nil, errors.GetAPIError(errors.ErrNoSuchKey) diff --git a/api/layer/cors.go b/api/layer/cors.go index 05a6b289..5590d9ba 100644 --- a/api/layer/cors.go +++ b/api/layer/cors.go @@ -49,7 +49,7 @@ func (n *layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error { return fmt.Errorf("put system object: %w", err) } - objIDToDelete, err := n.treeService.PutBucketCORS(ctx, p.BktInfo.CID, objID) + objIDToDelete, err := n.treeService.PutBucketCORS(ctx, p.BktInfo, objID) objIDToDeleteNotFound := errorsStd.Is(err, ErrNoNodeToRemove) if err != nil && !objIDToDeleteNotFound { return err @@ -84,7 +84,7 @@ func (n *layer) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (*d } func (n *layer) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) error { - objID, err := n.treeService.DeleteBucketCORS(ctx, bktInfo.CID) + objID, err := n.treeService.DeleteBucketCORS(ctx, bktInfo) objIDNotFound := errorsStd.Is(err, ErrNoNodeToRemove) if err != nil && !objIDNotFound { return err diff --git a/api/layer/layer.go b/api/layer/layer.go index eb731293..91752a0d 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -220,9 +220,9 @@ type ( GetLockInfo(ctx context.Context, obj *ObjectVersion) (*data.LockInfo, error) PutLockInfo(ctx context.Context, p *PutLockInfoParams) error - GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) - PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error - DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error + GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) + PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error + DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error GetObjectTagging(ctx context.Context, p *ObjectVersion) (string, map[string]string, error) PutObjectTagging(ctx context.Context, p *ObjectVersion, tagSet map[string]string) (*data.NodeVersion, error) @@ -557,7 +557,7 @@ func (n *layer) deleteObject(ctx context.Context, bkt *data.BucketInfo, settings return obj } - obj.Error = n.treeService.RemoveVersion(ctx, bkt.CID, nodeVersion.ID) + obj.Error = n.treeService.RemoveVersion(ctx, bkt, nodeVersion.ID) n.listsCache.CleanCacheEntriesContainingObject(obj.Name, bkt.CID) return obj } @@ -597,7 +597,7 @@ func (n *layer) deleteObject(ctx context.Context, bkt *data.BucketInfo, settings IsUnversioned: settings.VersioningSuspended(), } - if _, obj.Error = n.treeService.AddVersion(ctx, bkt.CID, newVersion); obj.Error != nil { + if _, obj.Error = n.treeService.AddVersion(ctx, bkt, newVersion); obj.Error != nil { return obj } diff --git a/api/layer/multipart_upload.go b/api/layer/multipart_upload.go index 2d749a64..d2b4329f 100644 --- a/api/layer/multipart_upload.go +++ b/api/layer/multipart_upload.go @@ -168,11 +168,11 @@ func (n *layer) CreateMultipartUpload(ctx context.Context, p *CreateMultipartPar } } - return n.treeService.CreateMultipartUpload(ctx, p.Info.Bkt.CID, info) + return n.treeService.CreateMultipartUpload(ctx, p.Info.Bkt, info) } func (n *layer) UploadPart(ctx context.Context, p *UploadPartParams) (string, error) { - multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Info.Bkt.CID, p.Info.Key, p.Info.UploadID) + multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Info.Bkt, p.Info.Key, p.Info.UploadID) if err != nil { if stderrors.Is(err, ErrNodeNotFound) { return "", errors.GetAPIError(errors.ErrNoSuchUpload) @@ -237,7 +237,7 @@ func (n *layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf Created: time.Now(), } - oldPartID, err := n.treeService.AddPart(ctx, bktInfo.CID, multipartInfo.ID, partInfo) + oldPartID, err := n.treeService.AddPart(ctx, bktInfo, multipartInfo.ID, partInfo) oldPartIDNotFound := stderrors.Is(err, ErrNoNodeToRemove) if err != nil && !oldPartIDNotFound { return nil, err @@ -266,7 +266,7 @@ func (n *layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf } func (n *layer) UploadPartCopy(ctx context.Context, p *UploadCopyParams) (*data.ObjectInfo, error) { - multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Info.Bkt.CID, p.Info.Key, p.Info.UploadID) + multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Info.Bkt, p.Info.Key, p.Info.UploadID) if err != nil { if stderrors.Is(err, ErrNodeNotFound) { return nil, errors.GetAPIError(errors.ErrNoSuchUpload) @@ -464,7 +464,7 @@ func (n *layer) CompleteMultipartUpload(ctx context.Context, p *CompleteMultipar n.objCache.Delete(addr) } - return uploadData, obj, n.treeService.DeleteMultipartUpload(ctx, p.Info.Bkt.CID, multipartInfo.ID) + return uploadData, obj, n.treeService.DeleteMultipartUpload(ctx, p.Info.Bkt, multipartInfo.ID) } func (n *layer) ListMultipartUploads(ctx context.Context, p *ListMultipartUploadsParams) (*ListMultipartUploadsInfo, error) { @@ -473,7 +473,7 @@ func (n *layer) ListMultipartUploads(ctx context.Context, p *ListMultipartUpload return &result, nil } - multipartInfos, err := n.treeService.GetMultipartUploadsByPrefix(ctx, p.Bkt.CID, p.Prefix) + multipartInfos, err := n.treeService.GetMultipartUploadsByPrefix(ctx, p.Bkt, p.Prefix) if err != nil { return nil, err } @@ -540,7 +540,7 @@ func (n *layer) AbortMultipartUpload(ctx context.Context, p *UploadInfoParams) e } } - return n.treeService.DeleteMultipartUpload(ctx, p.Bkt.CID, multipartInfo.ID) + return n.treeService.DeleteMultipartUpload(ctx, p.Bkt, multipartInfo.ID) } func (n *layer) ListParts(ctx context.Context, p *ListPartsParams) (*ListPartsInfo, error) { @@ -594,7 +594,7 @@ func (n *layer) ListParts(ctx context.Context, p *ListPartsParams) (*ListPartsIn } func (n *layer) getUploadParts(ctx context.Context, p *UploadInfoParams) (*data.MultipartInfo, map[int]*data.PartInfo, error) { - multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Bkt.CID, p.Key, p.UploadID) + multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Bkt, p.Key, p.UploadID) if err != nil { if stderrors.Is(err, ErrNodeNotFound) { return nil, nil, errors.GetAPIError(errors.ErrNoSuchUpload) @@ -602,7 +602,7 @@ func (n *layer) getUploadParts(ctx context.Context, p *UploadInfoParams) (*data. return nil, nil, err } - parts, err := n.treeService.GetParts(ctx, p.Bkt.CID, multipartInfo.ID) + parts, err := n.treeService.GetParts(ctx, p.Bkt, multipartInfo.ID) if err != nil { return nil, nil, err } diff --git a/api/layer/notifications.go b/api/layer/notifications.go index 62909907..b4cc2e2a 100644 --- a/api/layer/notifications.go +++ b/api/layer/notifications.go @@ -40,7 +40,7 @@ func (n *layer) PutBucketNotificationConfiguration(ctx context.Context, p *PutBu return err } - objIDToDelete, err := n.treeService.PutNotificationConfigurationNode(ctx, p.BktInfo.CID, objID) + objIDToDelete, err := n.treeService.PutNotificationConfigurationNode(ctx, p.BktInfo, objID) objIDToDeleteNotFound := errorsStd.Is(err, ErrNoNodeToRemove) if err != nil && !objIDToDeleteNotFound { return err @@ -69,7 +69,7 @@ func (n *layer) GetBucketNotificationConfiguration(ctx context.Context, bktInfo return conf, nil } - objID, err := n.treeService.GetNotificationConfigurationNode(ctx, bktInfo.CID) + objID, err := n.treeService.GetNotificationConfigurationNode(ctx, bktInfo) objIDNotFound := errorsStd.Is(err, ErrNodeNotFound) if err != nil && !objIDNotFound { return nil, err diff --git a/api/layer/object.go b/api/layer/object.go index f36fab99..ddf88403 100644 --- a/api/layer/object.go +++ b/api/layer/object.go @@ -250,7 +250,7 @@ func (n *layer) PutObject(ctx context.Context, p *PutObjectParams) (*data.Object newVersion.OID = id newVersion.ETag = hex.EncodeToString(hash) - if newVersion.ID, err = n.treeService.AddVersion(ctx, p.BktInfo.CID, newVersion); err != nil { + if newVersion.ID, err = n.treeService.AddVersion(ctx, p.BktInfo, newVersion); err != nil { return nil, fmt.Errorf("couldn't add new verion to tree service: %w", err) } @@ -313,7 +313,7 @@ func (n *layer) headLastVersionIfNotDeleted(ctx context.Context, bkt *data.Bucke } } - node, err := n.treeService.GetLatestVersion(ctx, bkt.CID, objectName) + node, err := n.treeService.GetLatestVersion(ctx, bkt, objectName) if err != nil { if errors.Is(err, ErrNodeNotFound) { return nil, apiErrors.GetAPIError(apiErrors.ErrNoSuchKey) @@ -355,7 +355,7 @@ func (n *layer) headVersion(ctx context.Context, bkt *data.BucketInfo, p *HeadOb var err error var foundVersion *data.NodeVersion if p.VersionID == data.UnversionedObjectVersionID { - foundVersion, err = n.treeService.GetUnversioned(ctx, bkt.CID, p.Object) + foundVersion, err = n.treeService.GetUnversioned(ctx, bkt, p.Object) if err != nil { if errors.Is(err, ErrNodeNotFound) { return nil, apiErrors.GetAPIError(apiErrors.ErrNoSuchVersion) @@ -363,7 +363,7 @@ func (n *layer) headVersion(ctx context.Context, bkt *data.BucketInfo, p *HeadOb return nil, err } } else { - versions, err := n.treeService.GetVersions(ctx, bkt.CID, p.Object) + versions, err := n.treeService.GetVersions(ctx, bkt, p.Object) if err != nil { return nil, fmt.Errorf("couldn't get versions: %w", err) } @@ -507,7 +507,7 @@ func (n *layer) getLatestObjectsVersions(ctx context.Context, p allObjectParams) nodeVersions := n.listsCache.GetVersions(cacheKey) if nodeVersions == nil { - nodeVersions, err = n.treeService.GetLatestVersionsByPrefix(ctx, p.Bucket.CID, p.Prefix) + nodeVersions, err = n.treeService.GetLatestVersionsByPrefix(ctx, p.Bucket, p.Prefix) if err != nil { return nil, nil, err } @@ -647,7 +647,7 @@ func (n *layer) bucketNodeVersions(ctx context.Context, bkt *data.BucketInfo, pr nodeVersions := n.listsCache.GetVersions(cacheKey) if nodeVersions == nil { - nodeVersions, err = n.treeService.GetAllVersionsByPrefix(ctx, bkt.CID, prefix) + nodeVersions, err = n.treeService.GetAllVersionsByPrefix(ctx, bkt, prefix) if err != nil { return nil, fmt.Errorf("get all versions from tree service: %w", err) } diff --git a/api/layer/system_object.go b/api/layer/system_object.go index 5783ee75..9186ddeb 100644 --- a/api/layer/system_object.go +++ b/api/layer/system_object.go @@ -27,11 +27,7 @@ type PutLockInfoParams struct { } func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err error) { - var ( - cnrID = p.ObjVersion.BktInfo.CID - newLock = p.NewLock - ) - + newLock := p.NewLock versionNode := p.NodeVersion // sometimes node version can be provided from executing context // if not, then receive node version from tree service @@ -47,7 +43,7 @@ func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err erro } } - lockInfo, err := n.treeService.GetLock(ctx, cnrID, versionNode.ID) + lockInfo, err := n.treeService.GetLock(ctx, p.ObjVersion.BktInfo, versionNode.ID) if err != nil && !errorsStd.Is(err, ErrNodeNotFound) { return err } @@ -100,7 +96,7 @@ func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err erro } } - if err = n.treeService.PutLock(ctx, cnrID, versionNode.ID, lockInfo); err != nil { + if err = n.treeService.PutLock(ctx, p.ObjVersion.BktInfo, versionNode.ID, lockInfo); err != nil { return fmt.Errorf("couldn't put lock into tree: %w", err) } @@ -139,7 +135,7 @@ func (n *layer) GetLockInfo(ctx context.Context, objVersion *ObjectVersion) (*da return nil, err } - lockInfo, err := n.treeService.GetLock(ctx, objVersion.BktInfo.CID, versionNode.ID) + lockInfo, err := n.treeService.GetLock(ctx, objVersion.BktInfo, versionNode.ID) if err != nil && !errorsStd.Is(err, ErrNodeNotFound) { return nil, err } @@ -158,7 +154,7 @@ func (n *layer) getCORS(ctx context.Context, bkt *data.BucketInfo, sysName strin if cors := n.systemCache.GetCORS(systemObjectKey(bkt, sysName)); cors != nil { return cors, nil } - objID, err := n.treeService.GetBucketCORS(ctx, bkt.CID) + objID, err := n.treeService.GetBucketCORS(ctx, bkt) objIDNotFound := errorsStd.Is(err, ErrNodeNotFound) if err != nil && !objIDNotFound { return nil, err @@ -206,7 +202,7 @@ func (n *layer) GetBucketSettings(ctx context.Context, bktInfo *data.BucketInfo) return settings, nil } - settings, err := n.treeService.GetSettingsNode(ctx, bktInfo.CID) + settings, err := n.treeService.GetSettingsNode(ctx, bktInfo) if err != nil { if !errorsStd.Is(err, ErrNodeNotFound) { return nil, err @@ -224,7 +220,7 @@ func (n *layer) GetBucketSettings(ctx context.Context, bktInfo *data.BucketInfo) } func (n *layer) PutBucketSettings(ctx context.Context, p *PutSettingsParams) error { - if err := n.treeService.PutSettingsNode(ctx, p.BktInfo.CID, p.Settings); err != nil { + if err := n.treeService.PutSettingsNode(ctx, p.BktInfo, p.Settings); err != nil { return fmt.Errorf("failed to get settings node: %w", err) } diff --git a/api/layer/tagging.go b/api/layer/tagging.go index 001ff5e6..af303343 100644 --- a/api/layer/tagging.go +++ b/api/layer/tagging.go @@ -35,7 +35,7 @@ func (n *layer) GetObjectTagging(ctx context.Context, p *ObjectVersion) (string, return p.VersionID, tags, nil } - tags, err = n.treeService.GetObjectTagging(ctx, p.BktInfo.CID, version) + tags, err = n.treeService.GetObjectTagging(ctx, p.BktInfo, version) if err != nil { if errorsStd.Is(err, ErrNodeNotFound) { return "", nil, errors.GetAPIError(errors.ErrNoSuchKey) @@ -57,7 +57,7 @@ func (n *layer) PutObjectTagging(ctx context.Context, p *ObjectVersion, tagSet m } p.VersionID = version.OID.EncodeToString() - err = n.treeService.PutObjectTagging(ctx, p.BktInfo.CID, version, tagSet) + err = n.treeService.PutObjectTagging(ctx, p.BktInfo, version, tagSet) if err != nil { if errorsStd.Is(err, ErrNodeNotFound) { return nil, errors.GetAPIError(errors.ErrNoSuchKey) @@ -78,7 +78,7 @@ func (n *layer) DeleteObjectTagging(ctx context.Context, p *ObjectVersion) (*dat return nil, err } - err = n.treeService.DeleteObjectTagging(ctx, p.BktInfo.CID, version) + err = n.treeService.DeleteObjectTagging(ctx, p.BktInfo, version) if err != nil { if errorsStd.Is(err, ErrNodeNotFound) { return nil, errors.GetAPIError(errors.ErrNoSuchKey) @@ -93,43 +93,43 @@ func (n *layer) DeleteObjectTagging(ctx context.Context, p *ObjectVersion) (*dat return version, nil } -func (n *layer) GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) { +func (n *layer) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) { var ( err error tags map[string]string ) - tags = n.systemCache.GetTagging(bucketTaggingCacheKey(cnrID)) + tags = n.systemCache.GetTagging(bucketTaggingCacheKey(bktInfo.CID)) if tags != nil { return tags, nil } - if tags, err = n.treeService.GetBucketTagging(ctx, cnrID); err != nil && !errorsStd.Is(err, ErrNodeNotFound) { + if tags, err = n.treeService.GetBucketTagging(ctx, bktInfo); err != nil && !errorsStd.Is(err, ErrNodeNotFound) { return nil, err } - if err := n.systemCache.PutTagging(bucketTaggingCacheKey(cnrID), tags); err != nil { + if err := n.systemCache.PutTagging(bucketTaggingCacheKey(bktInfo.CID), tags); err != nil { n.log.Error("couldn't cache system object", zap.Error(err)) } return tags, nil } -func (n *layer) PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error { - if err := n.treeService.PutBucketTagging(ctx, cnrID, tagSet); err != nil { +func (n *layer) PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error { + if err := n.treeService.PutBucketTagging(ctx, bktInfo, tagSet); err != nil { return err } - if err := n.systemCache.PutTagging(bucketTaggingCacheKey(cnrID), tagSet); err != nil { + if err := n.systemCache.PutTagging(bucketTaggingCacheKey(bktInfo.CID), tagSet); err != nil { n.log.Error("couldn't cache system object", zap.Error(err)) } return nil } -func (n *layer) DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error { - n.systemCache.Delete(bucketTaggingCacheKey(cnrID)) +func (n *layer) DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error { + n.systemCache.Delete(bucketTaggingCacheKey(bktInfo.CID)) - return n.treeService.DeleteBucketTagging(ctx, cnrID) + return n.treeService.DeleteBucketTagging(ctx, bktInfo) } func objectTaggingCacheKey(p *ObjectVersion) string { @@ -145,11 +145,11 @@ func (n *layer) getNodeVersion(ctx context.Context, objVersion *ObjectVersion) ( var version *data.NodeVersion if objVersion.VersionID == data.UnversionedObjectVersionID { - version, err = n.treeService.GetUnversioned(ctx, objVersion.BktInfo.CID, objVersion.ObjectName) + version, err = n.treeService.GetUnversioned(ctx, objVersion.BktInfo, objVersion.ObjectName) } else if len(objVersion.VersionID) == 0 { - version, err = n.treeService.GetLatestVersion(ctx, objVersion.BktInfo.CID, objVersion.ObjectName) + version, err = n.treeService.GetLatestVersion(ctx, objVersion.BktInfo, objVersion.ObjectName) } else { - versions, err2 := n.treeService.GetVersions(ctx, objVersion.BktInfo.CID, objVersion.ObjectName) + versions, err2 := n.treeService.GetVersions(ctx, objVersion.BktInfo, objVersion.ObjectName) if err2 != nil { return nil, err2 } diff --git a/api/layer/tree_mock.go b/api/layer/tree_mock.go index 07f2bb6c..058b5edf 100644 --- a/api/layer/tree_mock.go +++ b/api/layer/tree_mock.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/nspcc-dev/neofs-s3-gw/api/data" - cid "github.com/nspcc-dev/neofs-sdk-go/container/id" oid "github.com/nspcc-dev/neofs-sdk-go/object/id" ) @@ -21,14 +20,14 @@ type TreeServiceMock struct { parts map[string]map[int]*data.PartInfo } -func (t *TreeServiceMock) GetObjectTaggingAndLock(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { +func (t *TreeServiceMock) GetObjectTaggingAndLock(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { // TODO implement object tagging - lock, err := t.GetLock(ctx, cnrID, objVersion.ID) + lock, err := t.GetLock(ctx, bktInfo, objVersion.ID) return nil, lock, err } -func (t *TreeServiceMock) GetObjectTagging(_ context.Context, cnrID cid.ID, nodeVersion *data.NodeVersion) (map[string]string, error) { - cnrTagsMap, ok := t.tags[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetObjectTagging(_ context.Context, bktInfo *data.BucketInfo, nodeVersion *data.NodeVersion) (map[string]string, error) { + cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()] if !ok { return nil, nil } @@ -36,10 +35,10 @@ func (t *TreeServiceMock) GetObjectTagging(_ context.Context, cnrID cid.ID, node return cnrTagsMap[nodeVersion.ID], nil } -func (t *TreeServiceMock) PutObjectTagging(_ context.Context, cnrID cid.ID, nodeVersion *data.NodeVersion, tagSet map[string]string) error { - cnrTagsMap, ok := t.tags[cnrID.EncodeToString()] +func (t *TreeServiceMock) PutObjectTagging(_ context.Context, bktInfo *data.BucketInfo, nodeVersion *data.NodeVersion, tagSet map[string]string) error { + cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()] if !ok { - t.tags[cnrID.EncodeToString()] = map[uint64]map[string]string{ + t.tags[bktInfo.CID.EncodeToString()] = map[uint64]map[string]string{ nodeVersion.ID: tagSet, } return nil @@ -50,8 +49,8 @@ func (t *TreeServiceMock) PutObjectTagging(_ context.Context, cnrID cid.ID, node return nil } -func (t *TreeServiceMock) DeleteObjectTagging(_ context.Context, cnrID cid.ID, objVersion *data.NodeVersion) error { - cnrTagsMap, ok := t.tags[cnrID.EncodeToString()] +func (t *TreeServiceMock) DeleteObjectTagging(_ context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error { + cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()] if !ok { return nil } @@ -60,17 +59,17 @@ func (t *TreeServiceMock) DeleteObjectTagging(_ context.Context, cnrID cid.ID, o return nil } -func (t *TreeServiceMock) GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) { +func (t *TreeServiceMock) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) { // TODO implement me panic("implement me") } -func (t *TreeServiceMock) PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error { +func (t *TreeServiceMock) PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error { // TODO implement me panic("implement me") } -func (t *TreeServiceMock) DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error { +func (t *TreeServiceMock) DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error { // TODO implement me panic("implement me") } @@ -87,13 +86,13 @@ func NewTreeService() *TreeServiceMock { } } -func (t *TreeServiceMock) PutSettingsNode(_ context.Context, id cid.ID, settings *data.BucketSettings) error { - t.settings[id.EncodeToString()] = settings +func (t *TreeServiceMock) PutSettingsNode(_ context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error { + t.settings[bktInfo.CID.EncodeToString()] = settings return nil } -func (t *TreeServiceMock) GetSettingsNode(_ context.Context, id cid.ID) (*data.BucketSettings, error) { - settings, ok := t.settings[id.EncodeToString()] +func (t *TreeServiceMock) GetSettingsNode(_ context.Context, bktInfo *data.BucketInfo) (*data.BucketSettings, error) { + settings, ok := t.settings[bktInfo.CID.EncodeToString()] if !ok { return nil, ErrNodeNotFound } @@ -101,28 +100,28 @@ func (t *TreeServiceMock) GetSettingsNode(_ context.Context, id cid.ID) (*data.B return settings, nil } -func (t *TreeServiceMock) GetNotificationConfigurationNode(ctx context.Context, cnrID cid.ID) (oid.ID, error) { +func (t *TreeServiceMock) GetNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { panic("implement me") } -func (t *TreeServiceMock) PutNotificationConfigurationNode(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) { +func (t *TreeServiceMock) PutNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { panic("implement me") } -func (t *TreeServiceMock) GetBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, error) { +func (t *TreeServiceMock) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { panic("implement me") } -func (t *TreeServiceMock) PutBucketCORS(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) { +func (t *TreeServiceMock) PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { panic("implement me") } -func (t *TreeServiceMock) DeleteBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, error) { +func (t *TreeServiceMock) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { panic("implement me") } -func (t *TreeServiceMock) GetVersions(_ context.Context, cnrID cid.ID, objectName string) ([]*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetVersions(_ context.Context, bktInfo *data.BucketInfo, objectName string) ([]*data.NodeVersion, error) { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { return nil, ErrNodeNotFound } @@ -135,8 +134,8 @@ func (t *TreeServiceMock) GetVersions(_ context.Context, cnrID cid.ID, objectNam return versions, nil } -func (t *TreeServiceMock) GetLatestVersion(_ context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetLatestVersion(_ context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { return nil, ErrNodeNotFound } @@ -157,8 +156,8 @@ func (t *TreeServiceMock) GetLatestVersion(_ context.Context, cnrID cid.ID, obje return nil, ErrNodeNotFound } -func (t *TreeServiceMock) GetLatestVersionsByPrefix(_ context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetLatestVersionsByPrefix(_ context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { return nil, ErrNodeNotFound } @@ -182,8 +181,8 @@ func (t *TreeServiceMock) GetLatestVersionsByPrefix(_ context.Context, cnrID cid return result, nil } -func (t *TreeServiceMock) GetUnversioned(_ context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetUnversioned(_ context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { return nil, ErrNodeNotFound } @@ -202,10 +201,10 @@ func (t *TreeServiceMock) GetUnversioned(_ context.Context, cnrID cid.ID, object return nil, ErrNodeNotFound } -func (t *TreeServiceMock) AddVersion(_ context.Context, cnrID cid.ID, newVersion *data.NodeVersion) (uint64, error) { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) AddVersion(_ context.Context, bktInfo *data.BucketInfo, newVersion *data.NodeVersion) (uint64, error) { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { - t.versions[cnrID.EncodeToString()] = map[string][]*data.NodeVersion{ + t.versions[bktInfo.CID.EncodeToString()] = map[string][]*data.NodeVersion{ newVersion.FilePath: {newVersion}, } return newVersion.ID, nil @@ -242,8 +241,8 @@ func (t *TreeServiceMock) AddVersion(_ context.Context, cnrID cid.ID, newVersion return newVersion.ID, nil } -func (t *TreeServiceMock) RemoveVersion(_ context.Context, cnrID cid.ID, nodeID uint64) error { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) RemoveVersion(_ context.Context, bktInfo *data.BucketInfo, nodeID uint64) error { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { return ErrNodeNotFound } @@ -260,8 +259,8 @@ func (t *TreeServiceMock) RemoveVersion(_ context.Context, cnrID cid.ID, nodeID return ErrNodeNotFound } -func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) { + cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] if !ok { return nil, nil } @@ -276,10 +275,10 @@ func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, cnrID cid.ID return result, nil } -func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, cnrID cid.ID, info *data.MultipartInfo) error { - cnrMultipartsMap, ok := t.multiparts[cnrID.EncodeToString()] +func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error { + cnrMultipartsMap, ok := t.multiparts[bktInfo.CID.EncodeToString()] if !ok { - t.multiparts[cnrID.EncodeToString()] = map[string][]*data.MultipartInfo{ + t.multiparts[bktInfo.CID.EncodeToString()] = map[string][]*data.MultipartInfo{ info.Key: {info}, } return nil @@ -294,12 +293,12 @@ func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, cnrID cid.ID, return nil } -func (t *TreeServiceMock) GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.MultipartInfo, error) { +func (t *TreeServiceMock) GetMultipartUploadsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.MultipartInfo, error) { panic("implement me") } -func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, cnrID cid.ID, objectName, uploadID string) (*data.MultipartInfo, error) { - cnrMultipartsMap, ok := t.multiparts[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, objectName, uploadID string) (*data.MultipartInfo, error) { + cnrMultipartsMap, ok := t.multiparts[bktInfo.CID.EncodeToString()] if !ok { return nil, ErrNodeNotFound } @@ -314,8 +313,8 @@ func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, cnrID cid.ID, ob return nil, ErrNodeNotFound } -func (t *TreeServiceMock) AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { - multipartInfo, err := t.GetMultipartUpload(ctx, cnrID, info.Key, info.UploadID) +func (t *TreeServiceMock) AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { + multipartInfo, err := t.GetMultipartUpload(ctx, bktInfo, info.Key, info.UploadID) if err != nil { return oid.ID{}, err } @@ -335,8 +334,8 @@ func (t *TreeServiceMock) AddPart(ctx context.Context, cnrID cid.ID, multipartNo return oid.ID{}, nil } -func (t *TreeServiceMock) GetParts(_ context.Context, cnrID cid.ID, multipartNodeID uint64) ([]*data.PartInfo, error) { - cnrMultipartsMap := t.multiparts[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetParts(_ context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) { + cnrMultipartsMap := t.multiparts[bktInfo.CID.EncodeToString()] var foundMultipart *data.MultipartInfo @@ -363,8 +362,8 @@ LOOP: return result, nil } -func (t *TreeServiceMock) DeleteMultipartUpload(_ context.Context, cnrID cid.ID, multipartNodeID uint64) error { - cnrMultipartsMap := t.multiparts[cnrID.EncodeToString()] +func (t *TreeServiceMock) DeleteMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error { + cnrMultipartsMap := t.multiparts[bktInfo.CID.EncodeToString()] var uploadID string @@ -387,10 +386,10 @@ LOOP: return nil } -func (t *TreeServiceMock) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint64, lock *data.LockInfo) error { - cnrLockMap, ok := t.locks[cnrID.EncodeToString()] +func (t *TreeServiceMock) PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error { + cnrLockMap, ok := t.locks[bktInfo.CID.EncodeToString()] if !ok { - t.locks[cnrID.EncodeToString()] = map[uint64]*data.LockInfo{ + t.locks[bktInfo.CID.EncodeToString()] = map[uint64]*data.LockInfo{ nodeID: lock, } return nil @@ -401,8 +400,8 @@ func (t *TreeServiceMock) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint return nil } -func (t *TreeServiceMock) GetLock(ctx context.Context, cnrID cid.ID, nodeID uint64) (*data.LockInfo, error) { - cnrLockMap, ok := t.locks[cnrID.EncodeToString()] +func (t *TreeServiceMock) GetLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) { + cnrLockMap, ok := t.locks[bktInfo.CID.EncodeToString()] if !ok { return nil, nil } diff --git a/api/layer/tree_service.go b/api/layer/tree_service.go index ef100570..72529f37 100644 --- a/api/layer/tree_service.go +++ b/api/layer/tree_service.go @@ -5,81 +5,80 @@ import ( "errors" "github.com/nspcc-dev/neofs-s3-gw/api/data" - cid "github.com/nspcc-dev/neofs-sdk-go/container/id" oid "github.com/nspcc-dev/neofs-sdk-go/object/id" ) // TreeService provide interface to interact with tree service using s3 data models. type TreeService interface { // PutSettingsNode update or create new settings node in tree service. - PutSettingsNode(context.Context, cid.ID, *data.BucketSettings) error + PutSettingsNode(ctx context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error // GetSettingsNode retrieves the settings node from the tree service and form data.BucketSettings. // // If tree node is not found returns ErrNodeNotFound error. - GetSettingsNode(context.Context, cid.ID) (*data.BucketSettings, error) + GetSettingsNode(ctx context.Context, bktInfo *data.BucketInfo) (*data.BucketSettings, error) // GetNotificationConfigurationNode gets an object id that corresponds to object with bucket CORS. // // If tree node is not found returns ErrNodeNotFound error. - GetNotificationConfigurationNode(ctx context.Context, cnrID cid.ID) (oid.ID, error) + GetNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) // PutNotificationConfigurationNode puts a node to a system tree // and returns objectID of a previous notif config which must be deleted in NeoFS. // // If object id to remove is not found returns ErrNoNodeToRemove error. - PutNotificationConfigurationNode(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) + PutNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) // GetBucketCORS gets an object id that corresponds to object with bucket CORS. // // If object id is not found returns ErrNodeNotFound error. - GetBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, error) + GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) // PutBucketCORS puts a node to a system tree and returns objectID of a previous cors config which must be deleted in NeoFS. // // If object id to remove is not found returns ErrNoNodeToRemove error. - PutBucketCORS(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) + PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) // DeleteBucketCORS removes a node from a system tree and returns objID which must be deleted in NeoFS. // // If object id to remove is not found returns ErrNoNodeToRemove error. - DeleteBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, error) + DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) - GetObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, error) - PutObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion, tagSet map[string]string) error - DeleteObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) error + GetObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, error) + PutObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion, tagSet map[string]string) error + DeleteObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error - GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) - PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error - DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error + GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) + PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error + DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error - GetVersions(ctx context.Context, cnrID cid.ID, objectName string) ([]*data.NodeVersion, error) - GetLatestVersion(ctx context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) - GetLatestVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) - GetAllVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) - GetUnversioned(ctx context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) - AddVersion(ctx context.Context, cnrID cid.ID, newVersion *data.NodeVersion) (uint64, error) - RemoveVersion(ctx context.Context, cnrID cid.ID, nodeID uint64) error + GetVersions(ctx context.Context, bktInfo *data.BucketInfo, objectName string) ([]*data.NodeVersion, error) + GetLatestVersion(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) + GetLatestVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) + GetAllVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) + GetUnversioned(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) + AddVersion(ctx context.Context, bktInfo *data.BucketInfo, newVersion *data.NodeVersion) (uint64, error) + RemoveVersion(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) error - PutLock(ctx context.Context, cnrID cid.ID, nodeID uint64, lock *data.LockInfo) error - GetLock(ctx context.Context, cnrID cid.ID, nodeID uint64) (*data.LockInfo, error) + PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error + GetLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) - CreateMultipartUpload(ctx context.Context, cnrID cid.ID, info *data.MultipartInfo) error - DeleteMultipartUpload(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) error - GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.MultipartInfo, error) - GetMultipartUpload(ctx context.Context, cnrID cid.ID, objectName, uploadID string) (*data.MultipartInfo, error) + CreateMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error + DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error + GetMultipartUploadsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.MultipartInfo, error) + GetMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, objectName, uploadID string) (*data.MultipartInfo, error) // AddPart puts a node to a system tree as a child of appropriate multipart upload // and returns objectID of a previous part which must be deleted in NeoFS. // // If object id to remove is not found returns ErrNoNodeToRemove error. - AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) - GetParts(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) ([]*data.PartInfo, error) + AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) + GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) // Compound methods for optimizations // GetObjectTaggingAndLock unifies GetObjectTagging and GetLock methods in single tree service invocation. - GetObjectTaggingAndLock(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) + GetObjectTaggingAndLock(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) } var ( diff --git a/internal/neofs/tree.go b/internal/neofs/tree.go index 8dc4d438..705a1c73 100644 --- a/internal/neofs/tree.go +++ b/internal/neofs/tree.go @@ -15,7 +15,7 @@ import ( "github.com/nspcc-dev/neofs-s3-gw/api/layer" "github.com/nspcc-dev/neofs-s3-gw/creds/accessbox" "github.com/nspcc-dev/neofs-s3-gw/internal/neofs/services/tree" - cid "github.com/nspcc-dev/neofs-sdk-go/container/id" + "github.com/nspcc-dev/neofs-sdk-go/bearer" oid "github.com/nspcc-dev/neofs-sdk-go/object/id" "github.com/nspcc-dev/neofs-sdk-go/user" "google.golang.org/grpc" @@ -39,7 +39,7 @@ type ( } getNodesParams struct { - CnrID cid.ID + BktInfo *data.BucketInfo TreeID string Path []string Meta []string @@ -267,9 +267,9 @@ func newPartInfo(node NodeResponse) (*data.PartInfo, error) { return partInfo, nil } -func (c *TreeClient) GetSettingsNode(ctx context.Context, cnrID cid.ID) (*data.BucketSettings, error) { +func (c *TreeClient) GetSettingsNode(ctx context.Context, bktInfo *data.BucketInfo) (*data.BucketSettings, error) { keysToReturn := []string{versioningKV, lockConfigurationKV} - node, err := c.getSystemNode(ctx, cnrID, []string{settingsFileName}, keysToReturn) + node, err := c.getSystemNode(ctx, bktInfo, []string{settingsFileName}, keysToReturn) if err != nil { return nil, fmt.Errorf("couldn't get node: %w", err) } @@ -288,8 +288,8 @@ func (c *TreeClient) GetSettingsNode(ctx context.Context, cnrID cid.ID) (*data.B return settings, nil } -func (c *TreeClient) PutSettingsNode(ctx context.Context, cnrID cid.ID, settings *data.BucketSettings) error { - node, err := c.getSystemNode(ctx, cnrID, []string{settingsFileName}, []string{}) +func (c *TreeClient) PutSettingsNode(ctx context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error { + node, err := c.getSystemNode(ctx, bktInfo, []string{settingsFileName}, []string{}) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) if err != nil && !isErrNotFound { return fmt.Errorf("couldn't get node: %w", err) @@ -298,15 +298,15 @@ func (c *TreeClient) PutSettingsNode(ctx context.Context, cnrID cid.ID, settings meta := metaFromSettings(settings) if isErrNotFound { - _, err = c.addNode(ctx, cnrID, systemTree, 0, meta) + _, err = c.addNode(ctx, bktInfo, systemTree, 0, meta) return err } - return c.moveNode(ctx, cnrID, systemTree, node.ID, 0, meta) + return c.moveNode(ctx, bktInfo, systemTree, node.ID, 0, meta) } -func (c *TreeClient) GetNotificationConfigurationNode(ctx context.Context, cnrID cid.ID) (oid.ID, error) { - node, err := c.getSystemNode(ctx, cnrID, []string{notifConfFileName}, []string{oidKV}) +func (c *TreeClient) GetNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { + node, err := c.getSystemNode(ctx, bktInfo, []string{notifConfFileName}, []string{oidKV}) if err != nil { return oid.ID{}, err } @@ -314,8 +314,8 @@ func (c *TreeClient) GetNotificationConfigurationNode(ctx context.Context, cnrID return node.ObjID, nil } -func (c *TreeClient) PutNotificationConfigurationNode(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) { - node, err := c.getSystemNode(ctx, cnrID, []string{notifConfFileName}, []string{oidKV}) +func (c *TreeClient) PutNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { + node, err := c.getSystemNode(ctx, bktInfo, []string{notifConfFileName}, []string{oidKV}) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) if err != nil && !isErrNotFound { return oid.ID{}, fmt.Errorf("couldn't get node: %w", err) @@ -326,17 +326,17 @@ func (c *TreeClient) PutNotificationConfigurationNode(ctx context.Context, cnrID meta[oidKV] = objID.EncodeToString() if isErrNotFound { - if _, err = c.addNode(ctx, cnrID, systemTree, 0, meta); err != nil { + if _, err = c.addNode(ctx, bktInfo, systemTree, 0, meta); err != nil { return oid.ID{}, err } return oid.ID{}, layer.ErrNoNodeToRemove } - return node.ObjID, c.moveNode(ctx, cnrID, systemTree, node.ID, 0, meta) + return node.ObjID, c.moveNode(ctx, bktInfo, systemTree, node.ID, 0, meta) } -func (c *TreeClient) GetBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, error) { - node, err := c.getSystemNode(ctx, cnrID, []string{corsFilename}, []string{oidKV}) +func (c *TreeClient) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { + node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV}) if err != nil { return oid.ID{}, err } @@ -344,8 +344,8 @@ func (c *TreeClient) GetBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, e return node.ObjID, nil } -func (c *TreeClient) PutBucketCORS(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) { - node, err := c.getSystemNode(ctx, cnrID, []string{corsFilename}, []string{oidKV}) +func (c *TreeClient) PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { + node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV}) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) if err != nil && !isErrNotFound { return oid.ID{}, fmt.Errorf("couldn't get node: %w", err) @@ -356,30 +356,30 @@ func (c *TreeClient) PutBucketCORS(ctx context.Context, cnrID cid.ID, objID oid. meta[oidKV] = objID.EncodeToString() if isErrNotFound { - if _, err = c.addNode(ctx, cnrID, systemTree, 0, meta); err != nil { + if _, err = c.addNode(ctx, bktInfo, systemTree, 0, meta); err != nil { return oid.ID{}, err } return oid.ID{}, layer.ErrNoNodeToRemove } - return node.ObjID, c.moveNode(ctx, cnrID, systemTree, node.ID, 0, meta) + return node.ObjID, c.moveNode(ctx, bktInfo, systemTree, node.ID, 0, meta) } -func (c *TreeClient) DeleteBucketCORS(ctx context.Context, cnrID cid.ID) (oid.ID, error) { - node, err := c.getSystemNode(ctx, cnrID, []string{corsFilename}, []string{oidKV}) +func (c *TreeClient) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { + node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV}) if err != nil && !errors.Is(err, layer.ErrNodeNotFound) { return oid.ID{}, err } if node != nil { - return node.ObjID, c.removeNode(ctx, cnrID, systemTree, node.ID) + return node.ObjID, c.removeNode(ctx, bktInfo, systemTree, node.ID) } return oid.ID{}, layer.ErrNoNodeToRemove } -func (c *TreeClient) GetObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, error) { - tagNode, err := c.getTreeNode(ctx, cnrID, objVersion.ID, isTagKV) +func (c *TreeClient) GetObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, error) { + tagNode, err := c.getTreeNode(ctx, bktInfo, objVersion.ID, isTagKV) if err != nil { return nil, err } @@ -403,8 +403,8 @@ func getObjectTagging(tagNode *TreeNode) map[string]string { return meta } -func (c *TreeClient) PutObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion, tagSet map[string]string) error { - tagNode, err := c.getTreeNode(ctx, cnrID, objVersion.ID, isTagKV) +func (c *TreeClient) PutObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion, tagSet map[string]string) error { + tagNode, err := c.getTreeNode(ctx, bktInfo, objVersion.ID, isTagKV) if err != nil { return err } @@ -417,16 +417,16 @@ func (c *TreeClient) PutObjectTagging(ctx context.Context, cnrID cid.ID, objVers } if tagNode == nil { - _, err = c.addNode(ctx, cnrID, versionTree, objVersion.ID, treeTagSet) + _, err = c.addNode(ctx, bktInfo, versionTree, objVersion.ID, treeTagSet) } else { - err = c.moveNode(ctx, cnrID, versionTree, tagNode.ID, objVersion.ID, treeTagSet) + err = c.moveNode(ctx, bktInfo, versionTree, tagNode.ID, objVersion.ID, treeTagSet) } return err } -func (c *TreeClient) DeleteObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) error { - tagNode, err := c.getTreeNode(ctx, cnrID, objVersion.ID, isTagKV) +func (c *TreeClient) DeleteObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error { + tagNode, err := c.getTreeNode(ctx, bktInfo, objVersion.ID, isTagKV) if err != nil { return err } @@ -435,11 +435,11 @@ func (c *TreeClient) DeleteObjectTagging(ctx context.Context, cnrID cid.ID, objV return nil } - return c.removeNode(ctx, cnrID, versionTree, tagNode.ID) + return c.removeNode(ctx, bktInfo, versionTree, tagNode.ID) } -func (c *TreeClient) GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) { - node, err := c.getSystemNodeWithAllAttributes(ctx, cnrID, []string{bucketTaggingFilename}) +func (c *TreeClient) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) { + node, err := c.getSystemNodeWithAllAttributes(ctx, bktInfo, []string{bucketTaggingFilename}) if err != nil { if strings.Contains(err.Error(), "not found") { return nil, layer.ErrNodeNotFound @@ -458,8 +458,8 @@ func (c *TreeClient) GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[st return tags, nil } -func (c *TreeClient) PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error { - node, err := c.getSystemNode(ctx, cnrID, []string{bucketTaggingFilename}, []string{}) +func (c *TreeClient) PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error { + node, err := c.getSystemNode(ctx, bktInfo, []string{bucketTaggingFilename}, []string{}) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) if err != nil && !isErrNotFound { return fmt.Errorf("couldn't get node: %w", err) @@ -473,29 +473,29 @@ func (c *TreeClient) PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet } if isErrNotFound { - _, err = c.addNode(ctx, cnrID, systemTree, 0, treeTagSet) + _, err = c.addNode(ctx, bktInfo, systemTree, 0, treeTagSet) } else { - err = c.moveNode(ctx, cnrID, systemTree, node.ID, 0, treeTagSet) + err = c.moveNode(ctx, bktInfo, systemTree, node.ID, 0, treeTagSet) } return err } -func (c *TreeClient) DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error { - node, err := c.getSystemNode(ctx, cnrID, []string{bucketTaggingFilename}, nil) +func (c *TreeClient) DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error { + node, err := c.getSystemNode(ctx, bktInfo, []string{bucketTaggingFilename}, nil) if err != nil && !errors.Is(err, layer.ErrNodeNotFound) { return err } if node != nil { - return c.removeNode(ctx, cnrID, systemTree, node.ID) + return c.removeNode(ctx, bktInfo, systemTree, node.ID) } return nil } -func (c *TreeClient) getTreeNode(ctx context.Context, cnrID cid.ID, nodeID uint64, key string) (*TreeNode, error) { - nodes, err := c.getTreeNodes(ctx, cnrID, nodeID, key) +func (c *TreeClient) getTreeNode(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, key string) (*TreeNode, error) { + nodes, err := c.getTreeNodes(ctx, bktInfo, nodeID, key) if err != nil { return nil, err } @@ -504,8 +504,8 @@ func (c *TreeClient) getTreeNode(ctx context.Context, cnrID cid.ID, nodeID uint6 return nodes[key], nil } -func (c *TreeClient) getTreeNodes(ctx context.Context, cnrID cid.ID, nodeID uint64, keys ...string) (map[string]*TreeNode, error) { - subtree, err := c.getSubTree(ctx, cnrID, versionTree, nodeID, 2) +func (c *TreeClient) getTreeNodes(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, keys ...string) (map[string]*TreeNode, error) { + subtree, err := c.getSubTree(ctx, bktInfo, versionTree, nodeID, 2) if err != nil { return nil, err } @@ -531,16 +531,16 @@ func (c *TreeClient) getTreeNodes(ctx context.Context, cnrID cid.ID, nodeID uint return treeNodes, nil } -func (c *TreeClient) GetVersions(ctx context.Context, cnrID cid.ID, filepath string) ([]*data.NodeVersion, error) { - return c.getVersions(ctx, cnrID, versionTree, filepath, false) +func (c *TreeClient) GetVersions(ctx context.Context, bktInfo *data.BucketInfo, filepath string) ([]*data.NodeVersion, error) { + return c.getVersions(ctx, bktInfo, versionTree, filepath, false) } -func (c *TreeClient) GetLatestVersion(ctx context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) { +func (c *TreeClient) GetLatestVersion(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) { meta := []string{oidKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV} path := pathFromName(objectName) p := &getNodesParams{ - CnrID: cnrID, + BktInfo: bktInfo, TreeID: versionTree, Path: path, Meta: meta, @@ -564,18 +564,18 @@ func pathFromName(objectName string) []string { return strings.Split(objectName, separator) } -func (c *TreeClient) GetLatestVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { - return c.getVersionsByPrefix(ctx, cnrID, prefix, true) +func (c *TreeClient) GetLatestVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) { + return c.getVersionsByPrefix(ctx, bktInfo, prefix, true) } -func (c *TreeClient) determinePrefixNode(ctx context.Context, cnrID cid.ID, treeID, prefix string) (uint64, string, error) { +func (c *TreeClient) determinePrefixNode(ctx context.Context, bktInfo *data.BucketInfo, treeID, prefix string) (uint64, string, error) { var rootID uint64 path := strings.Split(prefix, separator) tailPrefix := path[len(path)-1] if len(path) > 1 { var err error - rootID, err = c.getPrefixNodeID(ctx, cnrID, treeID, path[:len(path)-1]) + rootID, err = c.getPrefixNodeID(ctx, bktInfo, treeID, path[:len(path)-1]) if err != nil { return 0, "", err } @@ -584,9 +584,9 @@ func (c *TreeClient) determinePrefixNode(ctx context.Context, cnrID cid.ID, tree return rootID, tailPrefix, nil } -func (c *TreeClient) getPrefixNodeID(ctx context.Context, cnrID cid.ID, treeID string, prefixPath []string) (uint64, error) { +func (c *TreeClient) getPrefixNodeID(ctx context.Context, bktInfo *data.BucketInfo, treeID string, prefixPath []string) (uint64, error) { p := &getNodesParams{ - CnrID: cnrID, + BktInfo: bktInfo, TreeID: treeID, Path: prefixPath, LatestOnly: false, @@ -614,8 +614,8 @@ func (c *TreeClient) getPrefixNodeID(ctx context.Context, cnrID cid.ID, treeID s return intermediateNodes[0], nil } -func (c *TreeClient) getSubTreeByPrefix(ctx context.Context, cnrID cid.ID, treeID, prefix string, latestOnly bool) ([]*tree.GetSubTreeResponse_Body, string, error) { - rootID, tailPrefix, err := c.determinePrefixNode(ctx, cnrID, treeID, prefix) +func (c *TreeClient) getSubTreeByPrefix(ctx context.Context, bktInfo *data.BucketInfo, treeID, prefix string, latestOnly bool) ([]*tree.GetSubTreeResponse_Body, string, error) { + rootID, tailPrefix, err := c.determinePrefixNode(ctx, bktInfo, treeID, prefix) if err != nil { if errors.Is(err, layer.ErrNodeNotFound) { return nil, "", nil @@ -623,7 +623,7 @@ func (c *TreeClient) getSubTreeByPrefix(ctx context.Context, cnrID cid.ID, treeI return nil, "", err } - subTree, err := c.getSubTree(ctx, cnrID, treeID, rootID, 2) + subTree, err := c.getSubTree(ctx, bktInfo, treeID, rootID, 2) if err != nil { if errors.Is(err, layer.ErrNodeNotFound) { return nil, "", nil @@ -686,8 +686,8 @@ func isIntermediate(node NodeResponse) bool { return node.GetMeta()[0].GetKey() == fileNameKV } -func (c *TreeClient) getSubTreeVersions(ctx context.Context, cnrID cid.ID, nodeID uint64, parentFilePath string, latestOnly bool) ([]*data.NodeVersion, error) { - subTree, err := c.getSubTree(ctx, cnrID, versionTree, nodeID, maxGetSubTreeDepth) +func (c *TreeClient) getSubTreeVersions(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, parentFilePath string, latestOnly bool) ([]*data.NodeVersion, error) { + subTree, err := c.getSubTree(ctx, bktInfo, versionTree, nodeID, maxGetSubTreeDepth) if err != nil { return nil, err } @@ -775,19 +775,19 @@ func formLatestNodeKey(parentID uint64, fileName string) string { return strconv.FormatUint(parentID, 10) + "." + fileName } -func (c *TreeClient) GetAllVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { - return c.getVersionsByPrefix(ctx, cnrID, prefix, false) +func (c *TreeClient) GetAllVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) { + return c.getVersionsByPrefix(ctx, bktInfo, prefix, false) } -func (c *TreeClient) getVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string, latestOnly bool) ([]*data.NodeVersion, error) { - prefixNodes, headPrefix, err := c.getSubTreeByPrefix(ctx, cnrID, versionTree, prefix, latestOnly) +func (c *TreeClient) getVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string, latestOnly bool) ([]*data.NodeVersion, error) { + prefixNodes, headPrefix, err := c.getSubTreeByPrefix(ctx, bktInfo, versionTree, prefix, latestOnly) if err != nil { return nil, err } var result []*data.NodeVersion for _, node := range prefixNodes { - versions, err := c.getSubTreeVersions(ctx, cnrID, node.GetNodeId(), headPrefix, latestOnly) + versions, err := c.getSubTreeVersions(ctx, bktInfo, node.GetNodeId(), headPrefix, latestOnly) if err != nil { return nil, err } @@ -797,12 +797,12 @@ func (c *TreeClient) getVersionsByPrefix(ctx context.Context, cnrID cid.ID, pref return result, nil } -func (c *TreeClient) GetUnversioned(ctx context.Context, cnrID cid.ID, filepath string) (*data.NodeVersion, error) { - return c.getUnversioned(ctx, cnrID, versionTree, filepath) +func (c *TreeClient) GetUnversioned(ctx context.Context, bktInfo *data.BucketInfo, filepath string) (*data.NodeVersion, error) { + return c.getUnversioned(ctx, bktInfo, versionTree, filepath) } -func (c *TreeClient) getUnversioned(ctx context.Context, cnrID cid.ID, treeID, filepath string) (*data.NodeVersion, error) { - nodes, err := c.getVersions(ctx, cnrID, treeID, filepath, true) +func (c *TreeClient) getUnversioned(ctx context.Context, bktInfo *data.BucketInfo, treeID, filepath string) (*data.NodeVersion, error) { + nodes, err := c.getVersions(ctx, bktInfo, treeID, filepath, true) if err != nil { return nil, err } @@ -818,31 +818,31 @@ func (c *TreeClient) getUnversioned(ctx context.Context, cnrID cid.ID, treeID, f return nodes[0], nil } -func (c *TreeClient) AddVersion(ctx context.Context, cnrID cid.ID, version *data.NodeVersion) (uint64, error) { - return c.addVersion(ctx, cnrID, versionTree, version) +func (c *TreeClient) AddVersion(ctx context.Context, bktInfo *data.BucketInfo, version *data.NodeVersion) (uint64, error) { + return c.addVersion(ctx, bktInfo, versionTree, version) } -func (c *TreeClient) RemoveVersion(ctx context.Context, cnrID cid.ID, id uint64) error { - return c.removeNode(ctx, cnrID, versionTree, id) +func (c *TreeClient) RemoveVersion(ctx context.Context, bktInfo *data.BucketInfo, id uint64) error { + return c.removeNode(ctx, bktInfo, versionTree, id) } -func (c *TreeClient) CreateMultipartUpload(ctx context.Context, cnrID cid.ID, info *data.MultipartInfo) error { +func (c *TreeClient) CreateMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error { path := pathFromName(info.Key) meta := metaFromMultipart(info, path[len(path)-1]) - _, err := c.addNodeByPath(ctx, cnrID, systemTree, path[:len(path)-1], meta) + _, err := c.addNodeByPath(ctx, bktInfo, systemTree, path[:len(path)-1], meta) return err } -func (c *TreeClient) GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.MultipartInfo, error) { - subTreeNodes, _, err := c.getSubTreeByPrefix(ctx, cnrID, systemTree, prefix, false) +func (c *TreeClient) GetMultipartUploadsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.MultipartInfo, error) { + subTreeNodes, _, err := c.getSubTreeByPrefix(ctx, bktInfo, systemTree, prefix, false) if err != nil { return nil, err } var result []*data.MultipartInfo for _, node := range subTreeNodes { - multipartUploads, err := c.getSubTreeMultipartUploads(ctx, cnrID, node.GetNodeId()) + multipartUploads, err := c.getSubTreeMultipartUploads(ctx, bktInfo, node.GetNodeId()) if err != nil { return nil, err } @@ -852,8 +852,8 @@ func (c *TreeClient) GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid. return result, nil } -func (c *TreeClient) getSubTreeMultipartUploads(ctx context.Context, cnrID cid.ID, nodeID uint64) ([]*data.MultipartInfo, error) { - subTree, err := c.getSubTree(ctx, cnrID, systemTree, nodeID, maxGetSubTreeDepth) +func (c *TreeClient) getSubTreeMultipartUploads(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) ([]*data.MultipartInfo, error) { + subTree, err := c.getSubTree(ctx, bktInfo, systemTree, nodeID, maxGetSubTreeDepth) if err != nil { return nil, err } @@ -870,10 +870,10 @@ func (c *TreeClient) getSubTreeMultipartUploads(ctx context.Context, cnrID cid.I return result, nil } -func (c *TreeClient) GetMultipartUpload(ctx context.Context, cnrID cid.ID, objectName, uploadID string) (*data.MultipartInfo, error) { +func (c *TreeClient) GetMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, objectName, uploadID string) (*data.MultipartInfo, error) { path := pathFromName(objectName) p := &getNodesParams{ - CnrID: cnrID, + BktInfo: bktInfo, TreeID: systemTree, Path: path, AllAttrs: true, @@ -897,8 +897,8 @@ func (c *TreeClient) GetMultipartUpload(ctx context.Context, cnrID cid.ID, objec return nil, layer.ErrNodeNotFound } -func (c *TreeClient) AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { - parts, err := c.getSubTree(ctx, cnrID, systemTree, multipartNodeID, 2) +func (c *TreeClient) AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { + parts, err := c.getSubTree(ctx, bktInfo, systemTree, multipartNodeID, 2) if err != nil { return oid.ID{}, err } @@ -928,17 +928,17 @@ func (c *TreeClient) AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID } if foundPartID != multipartNodeID { - if _, err = c.addNode(ctx, cnrID, systemTree, multipartNodeID, meta); err != nil { + if _, err = c.addNode(ctx, bktInfo, systemTree, multipartNodeID, meta); err != nil { return oid.ID{}, err } return oid.ID{}, layer.ErrNoNodeToRemove } - return oldObjIDToDelete, c.moveNode(ctx, cnrID, systemTree, foundPartID, multipartNodeID, meta) + return oldObjIDToDelete, c.moveNode(ctx, bktInfo, systemTree, foundPartID, multipartNodeID, meta) } -func (c *TreeClient) GetParts(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) ([]*data.PartInfo, error) { - parts, err := c.getSubTree(ctx, cnrID, systemTree, multipartNodeID, 2) +func (c *TreeClient) GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) { + parts, err := c.getSubTree(ctx, bktInfo, systemTree, multipartNodeID, 2) if err != nil { return nil, err } @@ -958,11 +958,11 @@ func (c *TreeClient) GetParts(ctx context.Context, cnrID cid.ID, multipartNodeID return result, nil } -func (c *TreeClient) DeleteMultipartUpload(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) error { - return c.removeNode(ctx, cnrID, systemTree, multipartNodeID) +func (c *TreeClient) DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error { + return c.removeNode(ctx, bktInfo, systemTree, multipartNodeID) } -func (c *TreeClient) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint64, lock *data.LockInfo) error { +func (c *TreeClient) PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error { meta := map[string]string{isLockKV: "true"} if lock.IsLegalHoldSet() { @@ -977,15 +977,15 @@ func (c *TreeClient) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint64, l } if lock.ID() == 0 { - _, err := c.addNode(ctx, cnrID, versionTree, nodeID, meta) + _, err := c.addNode(ctx, bktInfo, versionTree, nodeID, meta) return err } - return c.moveNode(ctx, cnrID, versionTree, lock.ID(), nodeID, meta) + return c.moveNode(ctx, bktInfo, versionTree, lock.ID(), nodeID, meta) } -func (c *TreeClient) GetLock(ctx context.Context, cnrID cid.ID, nodeID uint64) (*data.LockInfo, error) { - lockNode, err := c.getTreeNode(ctx, cnrID, nodeID, isLockKV) +func (c *TreeClient) GetLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) { + lockNode, err := c.getTreeNode(ctx, bktInfo, nodeID, isLockKV) if err != nil { return nil, err } @@ -1020,8 +1020,8 @@ func getLock(lockNode *TreeNode) (*data.LockInfo, error) { return lockInfo, nil } -func (c *TreeClient) GetObjectTaggingAndLock(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { - nodes, err := c.getTreeNodes(ctx, cnrID, objVersion.ID, isTagKV, isLockKV) +func (c *TreeClient) GetObjectTaggingAndLock(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { + nodes, err := c.getTreeNodes(ctx, bktInfo, objVersion.ID, isTagKV, isLockKV) if err != nil { return nil, nil, err } @@ -1042,7 +1042,7 @@ func (c *TreeClient) Close() error { return nil } -func (c *TreeClient) addVersion(ctx context.Context, cnrID cid.ID, treeID string, version *data.NodeVersion) (uint64, error) { +func (c *TreeClient) addVersion(ctx context.Context, bktInfo *data.BucketInfo, treeID string, version *data.NodeVersion) (uint64, error) { path := pathFromName(version.FilePath) meta := map[string]string{ oidKV: version.OID.EncodeToString(), @@ -1065,13 +1065,13 @@ func (c *TreeClient) addVersion(ctx context.Context, cnrID cid.ID, treeID string if version.IsUnversioned { meta[isUnversionedKV] = "true" - node, err := c.getUnversioned(ctx, cnrID, treeID, version.FilePath) + node, err := c.getUnversioned(ctx, bktInfo, treeID, version.FilePath) if err == nil { - if err = c.moveNode(ctx, cnrID, treeID, node.ID, node.ParenID, meta); err != nil { + if err = c.moveNode(ctx, bktInfo, treeID, node.ID, node.ParenID, meta); err != nil { return 0, err } - return node.ID, c.clearOutdatedVersionInfo(ctx, cnrID, treeID, node.ID) + return node.ID, c.clearOutdatedVersionInfo(ctx, bktInfo, treeID, node.ID) } if !errors.Is(err, layer.ErrNodeNotFound) { @@ -1079,26 +1079,26 @@ func (c *TreeClient) addVersion(ctx context.Context, cnrID cid.ID, treeID string } } - return c.addNodeByPath(ctx, cnrID, treeID, path[:len(path)-1], meta) + return c.addNodeByPath(ctx, bktInfo, treeID, path[:len(path)-1], meta) } -func (c *TreeClient) clearOutdatedVersionInfo(ctx context.Context, cnrID cid.ID, treeID string, nodeID uint64) error { - taggingNode, err := c.getTreeNode(ctx, cnrID, nodeID, isTagKV) +func (c *TreeClient) clearOutdatedVersionInfo(ctx context.Context, bktInfo *data.BucketInfo, treeID string, nodeID uint64) error { + taggingNode, err := c.getTreeNode(ctx, bktInfo, nodeID, isTagKV) if err != nil { return err } if taggingNode != nil { - return c.removeNode(ctx, cnrID, treeID, taggingNode.ID) + return c.removeNode(ctx, bktInfo, treeID, taggingNode.ID) } return nil } -func (c *TreeClient) getVersions(ctx context.Context, cnrID cid.ID, treeID, filepath string, onlyUnversioned bool) ([]*data.NodeVersion, error) { +func (c *TreeClient) getVersions(ctx context.Context, bktInfo *data.BucketInfo, treeID, filepath string, onlyUnversioned bool) ([]*data.NodeVersion, error) { keysToReturn := []string{oidKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV} path := pathFromName(filepath) p := &getNodesParams{ - CnrID: cnrID, + BktInfo: bktInfo, TreeID: treeID, Path: path, Meta: keysToReturn, @@ -1130,14 +1130,14 @@ func (c *TreeClient) getVersions(ctx context.Context, cnrID cid.ID, treeID, file return result, nil } -func (c *TreeClient) getSubTree(ctx context.Context, cnrID cid.ID, treeID string, rootID uint64, depth uint32) ([]*tree.GetSubTreeResponse_Body, error) { +func (c *TreeClient) getSubTree(ctx context.Context, bktInfo *data.BucketInfo, treeID string, rootID uint64, depth uint32) ([]*tree.GetSubTreeResponse_Body, error) { request := &tree.GetSubTreeRequest{ Body: &tree.GetSubTreeRequest_Body{ - ContainerId: cnrID[:], + ContainerId: bktInfo.CID[:], TreeId: treeID, RootId: rootID, Depth: depth, - BearerToken: getBearer(ctx), + BearerToken: getBearer(ctx, bktInfo), }, } @@ -1194,17 +1194,17 @@ func metaFromMultipart(info *data.MultipartInfo, fileName string) map[string]str return info.Meta } -func (c *TreeClient) getSystemNode(ctx context.Context, cnrID cid.ID, path, meta []string) (*TreeNode, error) { - return c.getNode(ctx, cnrID, systemTree, path, meta, false) +func (c *TreeClient) getSystemNode(ctx context.Context, bktInfo *data.BucketInfo, path, meta []string) (*TreeNode, error) { + return c.getNode(ctx, bktInfo, systemTree, path, meta, false) } -func (c *TreeClient) getSystemNodeWithAllAttributes(ctx context.Context, cnrID cid.ID, path []string) (*TreeNode, error) { - return c.getNode(ctx, cnrID, systemTree, path, []string{}, true) +func (c *TreeClient) getSystemNodeWithAllAttributes(ctx context.Context, bktInfo *data.BucketInfo, path []string) (*TreeNode, error) { + return c.getNode(ctx, bktInfo, systemTree, path, []string{}, true) } -func (c *TreeClient) getNode(ctx context.Context, cnrID cid.ID, treeID string, path, meta []string, allAttrs bool) (*TreeNode, error) { +func (c *TreeClient) getNode(ctx context.Context, bktInfo *data.BucketInfo, treeID string, path, meta []string, allAttrs bool) (*TreeNode, error) { p := &getNodesParams{ - CnrID: cnrID, + BktInfo: bktInfo, TreeID: treeID, Path: path, Meta: meta, @@ -1228,14 +1228,14 @@ func (c *TreeClient) getNode(ctx context.Context, cnrID cid.ID, treeID string, p func (c *TreeClient) getNodes(ctx context.Context, p *getNodesParams) ([]*tree.GetNodeByPathResponse_Info, error) { request := &tree.GetNodeByPathRequest{ Body: &tree.GetNodeByPathRequest_Body{ - ContainerId: p.CnrID[:], + ContainerId: p.BktInfo.CID[:], TreeId: p.TreeID, Path: p.Path, Attributes: p.Meta, PathAttribute: fileNameKV, LatestOnly: p.LatestOnly, AllAttributes: p.AllAttrs, - BearerToken: getBearer(ctx), + BearerToken: getBearer(ctx, p.BktInfo), }, } @@ -1259,23 +1259,25 @@ func (c *TreeClient) getNodes(ctx context.Context, p *getNodesParams) ([]*tree.G return resp.GetBody().GetNodes(), nil } -func getBearer(ctx context.Context) []byte { +func getBearer(ctx context.Context, bktInfo *data.BucketInfo) []byte { if bd, ok := ctx.Value(api.BoxData).(*accessbox.Box); ok && bd != nil && bd.Gate != nil { if bd.Gate.BearerToken != nil { - return bd.Gate.BearerToken.Marshal() + if bktInfo.Owner.Equals(bearer.ResolveIssuer(*bd.Gate.BearerToken)) { + return bd.Gate.BearerToken.Marshal() + } } } return nil } -func (c *TreeClient) addNode(ctx context.Context, cnrID cid.ID, treeID string, parent uint64, meta map[string]string) (uint64, error) { +func (c *TreeClient) addNode(ctx context.Context, bktInfo *data.BucketInfo, treeID string, parent uint64, meta map[string]string) (uint64, error) { request := &tree.AddRequest{ Body: &tree.AddRequest_Body{ - ContainerId: cnrID[:], + ContainerId: bktInfo.CID[:], TreeId: treeID, ParentId: parent, Meta: metaToKV(meta), - BearerToken: getBearer(ctx), + BearerToken: getBearer(ctx, bktInfo), }, } if err := c.signRequest(request.Body, func(key, sign []byte) { @@ -1295,15 +1297,15 @@ func (c *TreeClient) addNode(ctx context.Context, cnrID cid.ID, treeID string, p return resp.GetBody().GetNodeId(), nil } -func (c *TreeClient) addNodeByPath(ctx context.Context, cnrID cid.ID, treeID string, path []string, meta map[string]string) (uint64, error) { +func (c *TreeClient) addNodeByPath(ctx context.Context, bktInfo *data.BucketInfo, treeID string, path []string, meta map[string]string) (uint64, error) { request := &tree.AddByPathRequest{ Body: &tree.AddByPathRequest_Body{ - ContainerId: cnrID[:], + ContainerId: bktInfo.CID[:], TreeId: treeID, Path: path, Meta: metaToKV(meta), PathAttribute: fileNameKV, - BearerToken: getBearer(ctx), + BearerToken: getBearer(ctx, bktInfo), }, } @@ -1332,15 +1334,15 @@ func (c *TreeClient) addNodeByPath(ctx context.Context, cnrID cid.ID, treeID str return body.Nodes[0], nil } -func (c *TreeClient) moveNode(ctx context.Context, cnrID cid.ID, treeID string, nodeID, parentID uint64, meta map[string]string) error { +func (c *TreeClient) moveNode(ctx context.Context, bktInfo *data.BucketInfo, treeID string, nodeID, parentID uint64, meta map[string]string) error { request := &tree.MoveRequest{ Body: &tree.MoveRequest_Body{ - ContainerId: cnrID[:], + ContainerId: bktInfo.CID[:], TreeId: treeID, NodeId: nodeID, ParentId: parentID, Meta: metaToKV(meta), - BearerToken: getBearer(ctx), + BearerToken: getBearer(ctx, bktInfo), }, } @@ -1357,13 +1359,13 @@ func (c *TreeClient) moveNode(ctx context.Context, cnrID cid.ID, treeID string, return err } -func (c *TreeClient) removeNode(ctx context.Context, cnrID cid.ID, treeID string, nodeID uint64) error { +func (c *TreeClient) removeNode(ctx context.Context, bktInfo *data.BucketInfo, treeID string, nodeID uint64) error { request := &tree.RemoveRequest{ Body: &tree.RemoveRequest_Body{ - ContainerId: cnrID[:], + ContainerId: bktInfo.CID[:], TreeId: treeID, NodeId: nodeID, - BearerToken: getBearer(ctx), + BearerToken: getBearer(ctx, bktInfo), }, } if err := c.signRequest(request.Body, func(key, sign []byte) {