[#504] Use bktInfo in tree service to check owner

Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
Denis Kirillov 2022-09-13 12:44:18 +03:00 committed by Alex Vanin
parent 67b01a30b5
commit 80beedf13e
12 changed files with 267 additions and 271 deletions

View file

@ -157,7 +157,7 @@ func (h *handler) PutBucketTaggingHandler(w http.ResponseWriter, r *http.Request
return 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) h.logAndSendError(w, "could not put object tagging", reqInfo, err)
return return
} }
@ -172,7 +172,7 @@ func (h *handler) GetBucketTaggingHandler(w http.ResponseWriter, r *http.Request
return return
} }
tagSet, err := h.obj.GetBucketTagging(r.Context(), bktInfo.CID) tagSet, err := h.obj.GetBucketTagging(r.Context(), bktInfo)
if err != nil { if err != nil {
h.logAndSendError(w, "could not get object tagging", reqInfo, err) h.logAndSendError(w, "could not get object tagging", reqInfo, err)
return return
@ -193,7 +193,7 @@ func (h *handler) DeleteBucketTaggingHandler(w http.ResponseWriter, r *http.Requ
return 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) h.logAndSendError(w, "could not delete bucket tagging", reqInfo, err)
return return
} }

View file

@ -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 err != nil {
if errorsStd.Is(err, ErrNodeNotFound) { if errorsStd.Is(err, ErrNodeNotFound) {
return nil, nil, errors.GetAPIError(errors.ErrNoSuchKey) return nil, nil, errors.GetAPIError(errors.ErrNoSuchKey)

View file

@ -49,7 +49,7 @@ func (n *layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error {
return fmt.Errorf("put system object: %w", err) 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) objIDToDeleteNotFound := errorsStd.Is(err, ErrNoNodeToRemove)
if err != nil && !objIDToDeleteNotFound { if err != nil && !objIDToDeleteNotFound {
return err 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 { 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) objIDNotFound := errorsStd.Is(err, ErrNoNodeToRemove)
if err != nil && !objIDNotFound { if err != nil && !objIDNotFound {
return err return err

View file

@ -220,9 +220,9 @@ type (
GetLockInfo(ctx context.Context, obj *ObjectVersion) (*data.LockInfo, error) GetLockInfo(ctx context.Context, obj *ObjectVersion) (*data.LockInfo, error)
PutLockInfo(ctx context.Context, p *PutLockInfoParams) error PutLockInfo(ctx context.Context, p *PutLockInfoParams) error
GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error)
PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error
DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error
GetObjectTagging(ctx context.Context, p *ObjectVersion) (string, map[string]string, 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) 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 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) n.listsCache.CleanCacheEntriesContainingObject(obj.Name, bkt.CID)
return obj return obj
} }
@ -597,7 +597,7 @@ func (n *layer) deleteObject(ctx context.Context, bkt *data.BucketInfo, settings
IsUnversioned: settings.VersioningSuspended(), 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 return obj
} }

View file

@ -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) { 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 err != nil {
if stderrors.Is(err, ErrNodeNotFound) { if stderrors.Is(err, ErrNodeNotFound) {
return "", errors.GetAPIError(errors.ErrNoSuchUpload) return "", errors.GetAPIError(errors.ErrNoSuchUpload)
@ -237,7 +237,7 @@ func (n *layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf
Created: time.Now(), 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) oldPartIDNotFound := stderrors.Is(err, ErrNoNodeToRemove)
if err != nil && !oldPartIDNotFound { if err != nil && !oldPartIDNotFound {
return nil, err 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) { 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 err != nil {
if stderrors.Is(err, ErrNodeNotFound) { if stderrors.Is(err, ErrNodeNotFound) {
return nil, errors.GetAPIError(errors.ErrNoSuchUpload) return nil, errors.GetAPIError(errors.ErrNoSuchUpload)
@ -464,7 +464,7 @@ func (n *layer) CompleteMultipartUpload(ctx context.Context, p *CompleteMultipar
n.objCache.Delete(addr) 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) { 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 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 { if err != nil {
return nil, err 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) { 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) { 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 err != nil {
if stderrors.Is(err, ErrNodeNotFound) { if stderrors.Is(err, ErrNodeNotFound) {
return nil, nil, errors.GetAPIError(errors.ErrNoSuchUpload) 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 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 { if err != nil {
return nil, nil, err return nil, nil, err
} }

View file

@ -40,7 +40,7 @@ func (n *layer) PutBucketNotificationConfiguration(ctx context.Context, p *PutBu
return err 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) objIDToDeleteNotFound := errorsStd.Is(err, ErrNoNodeToRemove)
if err != nil && !objIDToDeleteNotFound { if err != nil && !objIDToDeleteNotFound {
return err return err
@ -69,7 +69,7 @@ func (n *layer) GetBucketNotificationConfiguration(ctx context.Context, bktInfo
return conf, nil return conf, nil
} }
objID, err := n.treeService.GetNotificationConfigurationNode(ctx, bktInfo.CID) objID, err := n.treeService.GetNotificationConfigurationNode(ctx, bktInfo)
objIDNotFound := errorsStd.Is(err, ErrNodeNotFound) objIDNotFound := errorsStd.Is(err, ErrNodeNotFound)
if err != nil && !objIDNotFound { if err != nil && !objIDNotFound {
return nil, err return nil, err

View file

@ -250,7 +250,7 @@ func (n *layer) PutObject(ctx context.Context, p *PutObjectParams) (*data.Object
newVersion.OID = id newVersion.OID = id
newVersion.ETag = hex.EncodeToString(hash) 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) 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 err != nil {
if errors.Is(err, ErrNodeNotFound) { if errors.Is(err, ErrNodeNotFound) {
return nil, apiErrors.GetAPIError(apiErrors.ErrNoSuchKey) 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 err error
var foundVersion *data.NodeVersion var foundVersion *data.NodeVersion
if p.VersionID == data.UnversionedObjectVersionID { 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 err != nil {
if errors.Is(err, ErrNodeNotFound) { if errors.Is(err, ErrNodeNotFound) {
return nil, apiErrors.GetAPIError(apiErrors.ErrNoSuchVersion) 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 return nil, err
} }
} else { } else {
versions, err := n.treeService.GetVersions(ctx, bkt.CID, p.Object) versions, err := n.treeService.GetVersions(ctx, bkt, p.Object)
if err != nil { if err != nil {
return nil, fmt.Errorf("couldn't get versions: %w", err) 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) nodeVersions := n.listsCache.GetVersions(cacheKey)
if nodeVersions == nil { 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 { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -647,7 +647,7 @@ func (n *layer) bucketNodeVersions(ctx context.Context, bkt *data.BucketInfo, pr
nodeVersions := n.listsCache.GetVersions(cacheKey) nodeVersions := n.listsCache.GetVersions(cacheKey)
if nodeVersions == nil { if nodeVersions == nil {
nodeVersions, err = n.treeService.GetAllVersionsByPrefix(ctx, bkt.CID, prefix) nodeVersions, err = n.treeService.GetAllVersionsByPrefix(ctx, bkt, prefix)
if err != nil { if err != nil {
return nil, fmt.Errorf("get all versions from tree service: %w", err) return nil, fmt.Errorf("get all versions from tree service: %w", err)
} }

View file

@ -27,11 +27,7 @@ type PutLockInfoParams struct {
} }
func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err error) { func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err error) {
var ( newLock := p.NewLock
cnrID = p.ObjVersion.BktInfo.CID
newLock = p.NewLock
)
versionNode := p.NodeVersion versionNode := p.NodeVersion
// sometimes node version can be provided from executing context // sometimes node version can be provided from executing context
// if not, then receive node version from tree service // 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) { if err != nil && !errorsStd.Is(err, ErrNodeNotFound) {
return err 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) 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 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) { if err != nil && !errorsStd.Is(err, ErrNodeNotFound) {
return nil, err 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 { if cors := n.systemCache.GetCORS(systemObjectKey(bkt, sysName)); cors != nil {
return 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) objIDNotFound := errorsStd.Is(err, ErrNodeNotFound)
if err != nil && !objIDNotFound { if err != nil && !objIDNotFound {
return nil, err return nil, err
@ -206,7 +202,7 @@ func (n *layer) GetBucketSettings(ctx context.Context, bktInfo *data.BucketInfo)
return settings, nil return settings, nil
} }
settings, err := n.treeService.GetSettingsNode(ctx, bktInfo.CID) settings, err := n.treeService.GetSettingsNode(ctx, bktInfo)
if err != nil { if err != nil {
if !errorsStd.Is(err, ErrNodeNotFound) { if !errorsStd.Is(err, ErrNodeNotFound) {
return nil, err 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 { 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) return fmt.Errorf("failed to get settings node: %w", err)
} }

View file

@ -35,7 +35,7 @@ func (n *layer) GetObjectTagging(ctx context.Context, p *ObjectVersion) (string,
return p.VersionID, tags, nil 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 err != nil {
if errorsStd.Is(err, ErrNodeNotFound) { if errorsStd.Is(err, ErrNodeNotFound) {
return "", nil, errors.GetAPIError(errors.ErrNoSuchKey) 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() 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 err != nil {
if errorsStd.Is(err, ErrNodeNotFound) { if errorsStd.Is(err, ErrNodeNotFound) {
return nil, errors.GetAPIError(errors.ErrNoSuchKey) return nil, errors.GetAPIError(errors.ErrNoSuchKey)
@ -78,7 +78,7 @@ func (n *layer) DeleteObjectTagging(ctx context.Context, p *ObjectVersion) (*dat
return nil, err return nil, err
} }
err = n.treeService.DeleteObjectTagging(ctx, p.BktInfo.CID, version) err = n.treeService.DeleteObjectTagging(ctx, p.BktInfo, version)
if err != nil { if err != nil {
if errorsStd.Is(err, ErrNodeNotFound) { if errorsStd.Is(err, ErrNodeNotFound) {
return nil, errors.GetAPIError(errors.ErrNoSuchKey) return nil, errors.GetAPIError(errors.ErrNoSuchKey)
@ -93,43 +93,43 @@ func (n *layer) DeleteObjectTagging(ctx context.Context, p *ObjectVersion) (*dat
return version, nil 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 ( var (
err error err error
tags map[string]string tags map[string]string
) )
tags = n.systemCache.GetTagging(bucketTaggingCacheKey(cnrID)) tags = n.systemCache.GetTagging(bucketTaggingCacheKey(bktInfo.CID))
if tags != nil { if tags != nil {
return 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 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)) n.log.Error("couldn't cache system object", zap.Error(err))
} }
return tags, nil return tags, nil
} }
func (n *layer) PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error { func (n *layer) PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error {
if err := n.treeService.PutBucketTagging(ctx, cnrID, tagSet); err != nil { if err := n.treeService.PutBucketTagging(ctx, bktInfo, tagSet); err != nil {
return err 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)) n.log.Error("couldn't cache system object", zap.Error(err))
} }
return nil return nil
} }
func (n *layer) DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error { func (n *layer) DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error {
n.systemCache.Delete(bucketTaggingCacheKey(cnrID)) n.systemCache.Delete(bucketTaggingCacheKey(bktInfo.CID))
return n.treeService.DeleteBucketTagging(ctx, cnrID) return n.treeService.DeleteBucketTagging(ctx, bktInfo)
} }
func objectTaggingCacheKey(p *ObjectVersion) string { func objectTaggingCacheKey(p *ObjectVersion) string {
@ -145,11 +145,11 @@ func (n *layer) getNodeVersion(ctx context.Context, objVersion *ObjectVersion) (
var version *data.NodeVersion var version *data.NodeVersion
if objVersion.VersionID == data.UnversionedObjectVersionID { 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 { } 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 { } 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 { if err2 != nil {
return nil, err2 return nil, err2
} }

View file

@ -7,7 +7,6 @@ import (
"strings" "strings"
"github.com/nspcc-dev/neofs-s3-gw/api/data" "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" oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
) )
@ -21,14 +20,14 @@ type TreeServiceMock struct {
parts map[string]map[int]*data.PartInfo 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 // TODO implement object tagging
lock, err := t.GetLock(ctx, cnrID, objVersion.ID) lock, err := t.GetLock(ctx, bktInfo, objVersion.ID)
return nil, lock, err return nil, lock, err
} }
func (t *TreeServiceMock) GetObjectTagging(_ context.Context, cnrID cid.ID, nodeVersion *data.NodeVersion) (map[string]string, error) { func (t *TreeServiceMock) GetObjectTagging(_ context.Context, bktInfo *data.BucketInfo, nodeVersion *data.NodeVersion) (map[string]string, error) {
cnrTagsMap, ok := t.tags[cnrID.EncodeToString()] cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, nil return nil, nil
} }
@ -36,10 +35,10 @@ func (t *TreeServiceMock) GetObjectTagging(_ context.Context, cnrID cid.ID, node
return cnrTagsMap[nodeVersion.ID], nil return cnrTagsMap[nodeVersion.ID], nil
} }
func (t *TreeServiceMock) PutObjectTagging(_ context.Context, cnrID cid.ID, nodeVersion *data.NodeVersion, tagSet map[string]string) error { func (t *TreeServiceMock) PutObjectTagging(_ context.Context, bktInfo *data.BucketInfo, nodeVersion *data.NodeVersion, tagSet map[string]string) error {
cnrTagsMap, ok := t.tags[cnrID.EncodeToString()] cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
t.tags[cnrID.EncodeToString()] = map[uint64]map[string]string{ t.tags[bktInfo.CID.EncodeToString()] = map[uint64]map[string]string{
nodeVersion.ID: tagSet, nodeVersion.ID: tagSet,
} }
return nil return nil
@ -50,8 +49,8 @@ func (t *TreeServiceMock) PutObjectTagging(_ context.Context, cnrID cid.ID, node
return nil return nil
} }
func (t *TreeServiceMock) DeleteObjectTagging(_ context.Context, cnrID cid.ID, objVersion *data.NodeVersion) error { func (t *TreeServiceMock) DeleteObjectTagging(_ context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error {
cnrTagsMap, ok := t.tags[cnrID.EncodeToString()] cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil return nil
} }
@ -60,17 +59,17 @@ func (t *TreeServiceMock) DeleteObjectTagging(_ context.Context, cnrID cid.ID, o
return nil 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 // TODO implement me
panic("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 // TODO implement me
panic("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 // TODO implement me
panic("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 { func (t *TreeServiceMock) PutSettingsNode(_ context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error {
t.settings[id.EncodeToString()] = settings t.settings[bktInfo.CID.EncodeToString()] = settings
return nil return nil
} }
func (t *TreeServiceMock) GetSettingsNode(_ context.Context, id cid.ID) (*data.BucketSettings, error) { func (t *TreeServiceMock) GetSettingsNode(_ context.Context, bktInfo *data.BucketInfo) (*data.BucketSettings, error) {
settings, ok := t.settings[id.EncodeToString()] settings, ok := t.settings[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
@ -101,28 +100,28 @@ func (t *TreeServiceMock) GetSettingsNode(_ context.Context, id cid.ID) (*data.B
return settings, nil 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") 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") 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") 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") 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") panic("implement me")
} }
func (t *TreeServiceMock) GetVersions(_ context.Context, cnrID cid.ID, objectName string) ([]*data.NodeVersion, error) { func (t *TreeServiceMock) GetVersions(_ context.Context, bktInfo *data.BucketInfo, objectName string) ([]*data.NodeVersion, error) {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
@ -135,8 +134,8 @@ func (t *TreeServiceMock) GetVersions(_ context.Context, cnrID cid.ID, objectNam
return versions, nil return versions, nil
} }
func (t *TreeServiceMock) GetLatestVersion(_ context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) { func (t *TreeServiceMock) GetLatestVersion(_ context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
@ -157,8 +156,8 @@ func (t *TreeServiceMock) GetLatestVersion(_ context.Context, cnrID cid.ID, obje
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
func (t *TreeServiceMock) GetLatestVersionsByPrefix(_ context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { func (t *TreeServiceMock) GetLatestVersionsByPrefix(_ context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
@ -182,8 +181,8 @@ func (t *TreeServiceMock) GetLatestVersionsByPrefix(_ context.Context, cnrID cid
return result, nil return result, nil
} }
func (t *TreeServiceMock) GetUnversioned(_ context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) { func (t *TreeServiceMock) GetUnversioned(_ context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
@ -202,10 +201,10 @@ func (t *TreeServiceMock) GetUnversioned(_ context.Context, cnrID cid.ID, object
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
func (t *TreeServiceMock) AddVersion(_ context.Context, cnrID cid.ID, newVersion *data.NodeVersion) (uint64, error) { func (t *TreeServiceMock) AddVersion(_ context.Context, bktInfo *data.BucketInfo, newVersion *data.NodeVersion) (uint64, error) {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
t.versions[cnrID.EncodeToString()] = map[string][]*data.NodeVersion{ t.versions[bktInfo.CID.EncodeToString()] = map[string][]*data.NodeVersion{
newVersion.FilePath: {newVersion}, newVersion.FilePath: {newVersion},
} }
return newVersion.ID, nil return newVersion.ID, nil
@ -242,8 +241,8 @@ func (t *TreeServiceMock) AddVersion(_ context.Context, cnrID cid.ID, newVersion
return newVersion.ID, nil return newVersion.ID, nil
} }
func (t *TreeServiceMock) RemoveVersion(_ context.Context, cnrID cid.ID, nodeID uint64) error { func (t *TreeServiceMock) RemoveVersion(_ context.Context, bktInfo *data.BucketInfo, nodeID uint64) error {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return ErrNodeNotFound return ErrNodeNotFound
} }
@ -260,8 +259,8 @@ func (t *TreeServiceMock) RemoveVersion(_ context.Context, cnrID cid.ID, nodeID
return ErrNodeNotFound return ErrNodeNotFound
} }
func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) {
cnrVersionsMap, ok := t.versions[cnrID.EncodeToString()] cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, nil return nil, nil
} }
@ -276,10 +275,10 @@ func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, cnrID cid.ID
return result, nil return result, nil
} }
func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, cnrID cid.ID, info *data.MultipartInfo) error { func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error {
cnrMultipartsMap, ok := t.multiparts[cnrID.EncodeToString()] cnrMultipartsMap, ok := t.multiparts[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
t.multiparts[cnrID.EncodeToString()] = map[string][]*data.MultipartInfo{ t.multiparts[bktInfo.CID.EncodeToString()] = map[string][]*data.MultipartInfo{
info.Key: {info}, info.Key: {info},
} }
return nil return nil
@ -294,12 +293,12 @@ func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, cnrID cid.ID,
return nil 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") panic("implement me")
} }
func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, cnrID cid.ID, objectName, uploadID string) (*data.MultipartInfo, error) { func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, objectName, uploadID string) (*data.MultipartInfo, error) {
cnrMultipartsMap, ok := t.multiparts[cnrID.EncodeToString()] cnrMultipartsMap, ok := t.multiparts[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
@ -314,8 +313,8 @@ func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, cnrID cid.ID, ob
return nil, ErrNodeNotFound return nil, ErrNodeNotFound
} }
func (t *TreeServiceMock) AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { 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, cnrID, info.Key, info.UploadID) multipartInfo, err := t.GetMultipartUpload(ctx, bktInfo, info.Key, info.UploadID)
if err != nil { if err != nil {
return oid.ID{}, err return oid.ID{}, err
} }
@ -335,8 +334,8 @@ func (t *TreeServiceMock) AddPart(ctx context.Context, cnrID cid.ID, multipartNo
return oid.ID{}, nil return oid.ID{}, nil
} }
func (t *TreeServiceMock) GetParts(_ context.Context, cnrID cid.ID, multipartNodeID uint64) ([]*data.PartInfo, error) { func (t *TreeServiceMock) GetParts(_ context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) {
cnrMultipartsMap := t.multiparts[cnrID.EncodeToString()] cnrMultipartsMap := t.multiparts[bktInfo.CID.EncodeToString()]
var foundMultipart *data.MultipartInfo var foundMultipart *data.MultipartInfo
@ -363,8 +362,8 @@ LOOP:
return result, nil return result, nil
} }
func (t *TreeServiceMock) DeleteMultipartUpload(_ context.Context, cnrID cid.ID, multipartNodeID uint64) error { func (t *TreeServiceMock) DeleteMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error {
cnrMultipartsMap := t.multiparts[cnrID.EncodeToString()] cnrMultipartsMap := t.multiparts[bktInfo.CID.EncodeToString()]
var uploadID string var uploadID string
@ -387,10 +386,10 @@ LOOP:
return nil return nil
} }
func (t *TreeServiceMock) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint64, lock *data.LockInfo) error { func (t *TreeServiceMock) PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error {
cnrLockMap, ok := t.locks[cnrID.EncodeToString()] cnrLockMap, ok := t.locks[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
t.locks[cnrID.EncodeToString()] = map[uint64]*data.LockInfo{ t.locks[bktInfo.CID.EncodeToString()] = map[uint64]*data.LockInfo{
nodeID: lock, nodeID: lock,
} }
return nil return nil
@ -401,8 +400,8 @@ func (t *TreeServiceMock) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint
return nil return nil
} }
func (t *TreeServiceMock) GetLock(ctx context.Context, cnrID cid.ID, nodeID uint64) (*data.LockInfo, error) { func (t *TreeServiceMock) GetLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) {
cnrLockMap, ok := t.locks[cnrID.EncodeToString()] cnrLockMap, ok := t.locks[bktInfo.CID.EncodeToString()]
if !ok { if !ok {
return nil, nil return nil, nil
} }

View file

@ -5,81 +5,80 @@ import (
"errors" "errors"
"github.com/nspcc-dev/neofs-s3-gw/api/data" "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" oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
) )
// TreeService provide interface to interact with tree service using s3 data models. // TreeService provide interface to interact with tree service using s3 data models.
type TreeService interface { type TreeService interface {
// PutSettingsNode update or create new settings node in tree service. // 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. // GetSettingsNode retrieves the settings node from the tree service and form data.BucketSettings.
// //
// If tree node is not found returns ErrNodeNotFound error. // 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. // GetNotificationConfigurationNode gets an object id that corresponds to object with bucket CORS.
// //
// If tree node is not found returns ErrNodeNotFound error. // 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 // PutNotificationConfigurationNode puts a node to a system tree
// and returns objectID of a previous notif config which must be deleted in NeoFS. // 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. // 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. // GetBucketCORS gets an object id that corresponds to object with bucket CORS.
// //
// If object id is not found returns ErrNodeNotFound error. // 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. // 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. // 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. // 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. // 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) GetObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, error)
PutObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion, tagSet map[string]string) error PutObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion, tagSet map[string]string) error
DeleteObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) error DeleteObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error
GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[string]string, error) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error)
PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error
DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error
GetVersions(ctx context.Context, cnrID cid.ID, objectName string) ([]*data.NodeVersion, error) GetVersions(ctx context.Context, bktInfo *data.BucketInfo, objectName string) ([]*data.NodeVersion, error)
GetLatestVersion(ctx context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) GetLatestVersion(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error)
GetLatestVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) GetLatestVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error)
GetAllVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) GetAllVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error)
GetUnversioned(ctx context.Context, cnrID cid.ID, objectName string) (*data.NodeVersion, error) GetUnversioned(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error)
AddVersion(ctx context.Context, cnrID cid.ID, newVersion *data.NodeVersion) (uint64, error) AddVersion(ctx context.Context, bktInfo *data.BucketInfo, newVersion *data.NodeVersion) (uint64, error)
RemoveVersion(ctx context.Context, cnrID cid.ID, nodeID 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 PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error
GetLock(ctx context.Context, cnrID cid.ID, nodeID uint64) (*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 CreateMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error
DeleteMultipartUpload(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) error DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error
GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.MultipartInfo, error) GetMultipartUploadsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.MultipartInfo, error)
GetMultipartUpload(ctx context.Context, cnrID cid.ID, objectName, uploadID 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 // 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. // and returns objectID of a previous part which must be deleted in NeoFS.
// //
// If object id to remove is not found returns ErrNoNodeToRemove error. // 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) AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error)
GetParts(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) ([]*data.PartInfo, error) GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error)
// Compound methods for optimizations // Compound methods for optimizations
// GetObjectTaggingAndLock unifies GetObjectTagging and GetLock methods in single tree service invocation. // 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 ( var (

View file

@ -15,7 +15,7 @@ import (
"github.com/nspcc-dev/neofs-s3-gw/api/layer" "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/creds/accessbox"
"github.com/nspcc-dev/neofs-s3-gw/internal/neofs/services/tree" "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" oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
"github.com/nspcc-dev/neofs-sdk-go/user" "github.com/nspcc-dev/neofs-sdk-go/user"
"google.golang.org/grpc" "google.golang.org/grpc"
@ -39,7 +39,7 @@ type (
} }
getNodesParams struct { getNodesParams struct {
CnrID cid.ID BktInfo *data.BucketInfo
TreeID string TreeID string
Path []string Path []string
Meta []string Meta []string
@ -267,9 +267,9 @@ func newPartInfo(node NodeResponse) (*data.PartInfo, error) {
return partInfo, nil 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} 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 { if err != nil {
return nil, fmt.Errorf("couldn't get node: %w", err) 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 return settings, nil
} }
func (c *TreeClient) PutSettingsNode(ctx context.Context, cnrID cid.ID, settings *data.BucketSettings) error { func (c *TreeClient) PutSettingsNode(ctx context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error {
node, err := c.getSystemNode(ctx, cnrID, []string{settingsFileName}, []string{}) node, err := c.getSystemNode(ctx, bktInfo, []string{settingsFileName}, []string{})
isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound)
if err != nil && !isErrNotFound { if err != nil && !isErrNotFound {
return fmt.Errorf("couldn't get node: %w", err) 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) meta := metaFromSettings(settings)
if isErrNotFound { if isErrNotFound {
_, err = c.addNode(ctx, cnrID, systemTree, 0, meta) _, err = c.addNode(ctx, bktInfo, systemTree, 0, meta)
return err 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) { func (c *TreeClient) GetNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) {
node, err := c.getSystemNode(ctx, cnrID, []string{notifConfFileName}, []string{oidKV}) node, err := c.getSystemNode(ctx, bktInfo, []string{notifConfFileName}, []string{oidKV})
if err != nil { if err != nil {
return oid.ID{}, err return oid.ID{}, err
} }
@ -314,8 +314,8 @@ func (c *TreeClient) GetNotificationConfigurationNode(ctx context.Context, cnrID
return node.ObjID, nil return node.ObjID, nil
} }
func (c *TreeClient) PutNotificationConfigurationNode(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) { func (c *TreeClient) PutNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) {
node, err := c.getSystemNode(ctx, cnrID, []string{notifConfFileName}, []string{oidKV}) node, err := c.getSystemNode(ctx, bktInfo, []string{notifConfFileName}, []string{oidKV})
isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound)
if err != nil && !isErrNotFound { if err != nil && !isErrNotFound {
return oid.ID{}, fmt.Errorf("couldn't get node: %w", err) 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() meta[oidKV] = objID.EncodeToString()
if isErrNotFound { 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{}, err
} }
return oid.ID{}, layer.ErrNoNodeToRemove 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) { func (c *TreeClient) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) {
node, err := c.getSystemNode(ctx, cnrID, []string{corsFilename}, []string{oidKV}) node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV})
if err != nil { if err != nil {
return oid.ID{}, err 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 return node.ObjID, nil
} }
func (c *TreeClient) PutBucketCORS(ctx context.Context, cnrID cid.ID, objID oid.ID) (oid.ID, error) { func (c *TreeClient) PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) {
node, err := c.getSystemNode(ctx, cnrID, []string{corsFilename}, []string{oidKV}) node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV})
isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound)
if err != nil && !isErrNotFound { if err != nil && !isErrNotFound {
return oid.ID{}, fmt.Errorf("couldn't get node: %w", err) 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() meta[oidKV] = objID.EncodeToString()
if isErrNotFound { 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{}, err
} }
return oid.ID{}, layer.ErrNoNodeToRemove 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) { func (c *TreeClient) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) {
node, err := c.getSystemNode(ctx, cnrID, []string{corsFilename}, []string{oidKV}) node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV})
if err != nil && !errors.Is(err, layer.ErrNodeNotFound) { if err != nil && !errors.Is(err, layer.ErrNodeNotFound) {
return oid.ID{}, err return oid.ID{}, err
} }
if node != nil { 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 return oid.ID{}, layer.ErrNoNodeToRemove
} }
func (c *TreeClient) GetObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, error) { func (c *TreeClient) GetObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, error) {
tagNode, err := c.getTreeNode(ctx, cnrID, objVersion.ID, isTagKV) tagNode, err := c.getTreeNode(ctx, bktInfo, objVersion.ID, isTagKV)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -403,8 +403,8 @@ func getObjectTagging(tagNode *TreeNode) map[string]string {
return meta return meta
} }
func (c *TreeClient) PutObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion, tagSet map[string]string) error { func (c *TreeClient) PutObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion, tagSet map[string]string) error {
tagNode, err := c.getTreeNode(ctx, cnrID, objVersion.ID, isTagKV) tagNode, err := c.getTreeNode(ctx, bktInfo, objVersion.ID, isTagKV)
if err != nil { if err != nil {
return err return err
} }
@ -417,16 +417,16 @@ func (c *TreeClient) PutObjectTagging(ctx context.Context, cnrID cid.ID, objVers
} }
if tagNode == nil { if tagNode == nil {
_, err = c.addNode(ctx, cnrID, versionTree, objVersion.ID, treeTagSet) _, err = c.addNode(ctx, bktInfo, versionTree, objVersion.ID, treeTagSet)
} else { } 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 return err
} }
func (c *TreeClient) DeleteObjectTagging(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) error { func (c *TreeClient) DeleteObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error {
tagNode, err := c.getTreeNode(ctx, cnrID, objVersion.ID, isTagKV) tagNode, err := c.getTreeNode(ctx, bktInfo, objVersion.ID, isTagKV)
if err != nil { if err != nil {
return err return err
} }
@ -435,11 +435,11 @@ func (c *TreeClient) DeleteObjectTagging(ctx context.Context, cnrID cid.ID, objV
return nil 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) { func (c *TreeClient) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) {
node, err := c.getSystemNodeWithAllAttributes(ctx, cnrID, []string{bucketTaggingFilename}) node, err := c.getSystemNodeWithAllAttributes(ctx, bktInfo, []string{bucketTaggingFilename})
if err != nil { if err != nil {
if strings.Contains(err.Error(), "not found") { if strings.Contains(err.Error(), "not found") {
return nil, layer.ErrNodeNotFound return nil, layer.ErrNodeNotFound
@ -458,8 +458,8 @@ func (c *TreeClient) GetBucketTagging(ctx context.Context, cnrID cid.ID) (map[st
return tags, nil return tags, nil
} }
func (c *TreeClient) PutBucketTagging(ctx context.Context, cnrID cid.ID, tagSet map[string]string) error { func (c *TreeClient) PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error {
node, err := c.getSystemNode(ctx, cnrID, []string{bucketTaggingFilename}, []string{}) node, err := c.getSystemNode(ctx, bktInfo, []string{bucketTaggingFilename}, []string{})
isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) isErrNotFound := errors.Is(err, layer.ErrNodeNotFound)
if err != nil && !isErrNotFound { if err != nil && !isErrNotFound {
return fmt.Errorf("couldn't get node: %w", err) 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 { if isErrNotFound {
_, err = c.addNode(ctx, cnrID, systemTree, 0, treeTagSet) _, err = c.addNode(ctx, bktInfo, systemTree, 0, treeTagSet)
} else { } else {
err = c.moveNode(ctx, cnrID, systemTree, node.ID, 0, treeTagSet) err = c.moveNode(ctx, bktInfo, systemTree, node.ID, 0, treeTagSet)
} }
return err return err
} }
func (c *TreeClient) DeleteBucketTagging(ctx context.Context, cnrID cid.ID) error { func (c *TreeClient) DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error {
node, err := c.getSystemNode(ctx, cnrID, []string{bucketTaggingFilename}, nil) node, err := c.getSystemNode(ctx, bktInfo, []string{bucketTaggingFilename}, nil)
if err != nil && !errors.Is(err, layer.ErrNodeNotFound) { if err != nil && !errors.Is(err, layer.ErrNodeNotFound) {
return err return err
} }
if node != nil { if node != nil {
return c.removeNode(ctx, cnrID, systemTree, node.ID) return c.removeNode(ctx, bktInfo, systemTree, node.ID)
} }
return nil return nil
} }
func (c *TreeClient) getTreeNode(ctx context.Context, cnrID cid.ID, nodeID uint64, key string) (*TreeNode, error) { func (c *TreeClient) getTreeNode(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, key string) (*TreeNode, error) {
nodes, err := c.getTreeNodes(ctx, cnrID, nodeID, key) nodes, err := c.getTreeNodes(ctx, bktInfo, nodeID, key)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -504,8 +504,8 @@ func (c *TreeClient) getTreeNode(ctx context.Context, cnrID cid.ID, nodeID uint6
return nodes[key], nil return nodes[key], nil
} }
func (c *TreeClient) getTreeNodes(ctx context.Context, cnrID cid.ID, nodeID uint64, keys ...string) (map[string]*TreeNode, error) { func (c *TreeClient) getTreeNodes(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, keys ...string) (map[string]*TreeNode, error) {
subtree, err := c.getSubTree(ctx, cnrID, versionTree, nodeID, 2) subtree, err := c.getSubTree(ctx, bktInfo, versionTree, nodeID, 2)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -531,16 +531,16 @@ func (c *TreeClient) getTreeNodes(ctx context.Context, cnrID cid.ID, nodeID uint
return treeNodes, nil return treeNodes, nil
} }
func (c *TreeClient) GetVersions(ctx context.Context, cnrID cid.ID, filepath string) ([]*data.NodeVersion, error) { func (c *TreeClient) GetVersions(ctx context.Context, bktInfo *data.BucketInfo, filepath string) ([]*data.NodeVersion, error) {
return c.getVersions(ctx, cnrID, versionTree, filepath, false) 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} meta := []string{oidKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV}
path := pathFromName(objectName) path := pathFromName(objectName)
p := &getNodesParams{ p := &getNodesParams{
CnrID: cnrID, BktInfo: bktInfo,
TreeID: versionTree, TreeID: versionTree,
Path: path, Path: path,
Meta: meta, Meta: meta,
@ -564,18 +564,18 @@ func pathFromName(objectName string) []string {
return strings.Split(objectName, separator) return strings.Split(objectName, separator)
} }
func (c *TreeClient) GetLatestVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { func (c *TreeClient) GetLatestVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) {
return c.getVersionsByPrefix(ctx, cnrID, prefix, true) 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 var rootID uint64
path := strings.Split(prefix, separator) path := strings.Split(prefix, separator)
tailPrefix := path[len(path)-1] tailPrefix := path[len(path)-1]
if len(path) > 1 { if len(path) > 1 {
var err error 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 { if err != nil {
return 0, "", err return 0, "", err
} }
@ -584,9 +584,9 @@ func (c *TreeClient) determinePrefixNode(ctx context.Context, cnrID cid.ID, tree
return rootID, tailPrefix, nil 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{ p := &getNodesParams{
CnrID: cnrID, BktInfo: bktInfo,
TreeID: treeID, TreeID: treeID,
Path: prefixPath, Path: prefixPath,
LatestOnly: false, LatestOnly: false,
@ -614,8 +614,8 @@ func (c *TreeClient) getPrefixNodeID(ctx context.Context, cnrID cid.ID, treeID s
return intermediateNodes[0], nil return intermediateNodes[0], nil
} }
func (c *TreeClient) getSubTreeByPrefix(ctx context.Context, cnrID cid.ID, treeID, prefix string, latestOnly bool) ([]*tree.GetSubTreeResponse_Body, string, error) { 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, cnrID, treeID, prefix) rootID, tailPrefix, err := c.determinePrefixNode(ctx, bktInfo, treeID, prefix)
if err != nil { if err != nil {
if errors.Is(err, layer.ErrNodeNotFound) { if errors.Is(err, layer.ErrNodeNotFound) {
return nil, "", nil return nil, "", nil
@ -623,7 +623,7 @@ func (c *TreeClient) getSubTreeByPrefix(ctx context.Context, cnrID cid.ID, treeI
return nil, "", err 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 err != nil {
if errors.Is(err, layer.ErrNodeNotFound) { if errors.Is(err, layer.ErrNodeNotFound) {
return nil, "", nil return nil, "", nil
@ -686,8 +686,8 @@ func isIntermediate(node NodeResponse) bool {
return node.GetMeta()[0].GetKey() == fileNameKV 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) { func (c *TreeClient) getSubTreeVersions(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, parentFilePath string, latestOnly bool) ([]*data.NodeVersion, error) {
subTree, err := c.getSubTree(ctx, cnrID, versionTree, nodeID, maxGetSubTreeDepth) subTree, err := c.getSubTree(ctx, bktInfo, versionTree, nodeID, maxGetSubTreeDepth)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -775,19 +775,19 @@ func formLatestNodeKey(parentID uint64, fileName string) string {
return strconv.FormatUint(parentID, 10) + "." + fileName return strconv.FormatUint(parentID, 10) + "." + fileName
} }
func (c *TreeClient) GetAllVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.NodeVersion, error) { func (c *TreeClient) GetAllVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) {
return c.getVersionsByPrefix(ctx, cnrID, prefix, false) return c.getVersionsByPrefix(ctx, bktInfo, prefix, false)
} }
func (c *TreeClient) getVersionsByPrefix(ctx context.Context, cnrID cid.ID, prefix string, latestOnly bool) ([]*data.NodeVersion, error) { func (c *TreeClient) getVersionsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string, latestOnly bool) ([]*data.NodeVersion, error) {
prefixNodes, headPrefix, err := c.getSubTreeByPrefix(ctx, cnrID, versionTree, prefix, latestOnly) prefixNodes, headPrefix, err := c.getSubTreeByPrefix(ctx, bktInfo, versionTree, prefix, latestOnly)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var result []*data.NodeVersion var result []*data.NodeVersion
for _, node := range prefixNodes { 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 { if err != nil {
return nil, err return nil, err
} }
@ -797,12 +797,12 @@ func (c *TreeClient) getVersionsByPrefix(ctx context.Context, cnrID cid.ID, pref
return result, nil return result, nil
} }
func (c *TreeClient) GetUnversioned(ctx context.Context, cnrID cid.ID, filepath string) (*data.NodeVersion, error) { func (c *TreeClient) GetUnversioned(ctx context.Context, bktInfo *data.BucketInfo, filepath string) (*data.NodeVersion, error) {
return c.getUnversioned(ctx, cnrID, versionTree, filepath) return c.getUnversioned(ctx, bktInfo, versionTree, filepath)
} }
func (c *TreeClient) getUnversioned(ctx context.Context, cnrID cid.ID, treeID, filepath string) (*data.NodeVersion, error) { func (c *TreeClient) getUnversioned(ctx context.Context, bktInfo *data.BucketInfo, treeID, filepath string) (*data.NodeVersion, error) {
nodes, err := c.getVersions(ctx, cnrID, treeID, filepath, true) nodes, err := c.getVersions(ctx, bktInfo, treeID, filepath, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -818,31 +818,31 @@ func (c *TreeClient) getUnversioned(ctx context.Context, cnrID cid.ID, treeID, f
return nodes[0], nil return nodes[0], nil
} }
func (c *TreeClient) AddVersion(ctx context.Context, cnrID cid.ID, version *data.NodeVersion) (uint64, error) { func (c *TreeClient) AddVersion(ctx context.Context, bktInfo *data.BucketInfo, version *data.NodeVersion) (uint64, error) {
return c.addVersion(ctx, cnrID, versionTree, version) return c.addVersion(ctx, bktInfo, versionTree, version)
} }
func (c *TreeClient) RemoveVersion(ctx context.Context, cnrID cid.ID, id uint64) error { func (c *TreeClient) RemoveVersion(ctx context.Context, bktInfo *data.BucketInfo, id uint64) error {
return c.removeNode(ctx, cnrID, versionTree, id) 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) path := pathFromName(info.Key)
meta := metaFromMultipart(info, path[len(path)-1]) 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 return err
} }
func (c *TreeClient) GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid.ID, prefix string) ([]*data.MultipartInfo, error) { func (c *TreeClient) GetMultipartUploadsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.MultipartInfo, error) {
subTreeNodes, _, err := c.getSubTreeByPrefix(ctx, cnrID, systemTree, prefix, false) subTreeNodes, _, err := c.getSubTreeByPrefix(ctx, bktInfo, systemTree, prefix, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var result []*data.MultipartInfo var result []*data.MultipartInfo
for _, node := range subTreeNodes { for _, node := range subTreeNodes {
multipartUploads, err := c.getSubTreeMultipartUploads(ctx, cnrID, node.GetNodeId()) multipartUploads, err := c.getSubTreeMultipartUploads(ctx, bktInfo, node.GetNodeId())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -852,8 +852,8 @@ func (c *TreeClient) GetMultipartUploadsByPrefix(ctx context.Context, cnrID cid.
return result, nil return result, nil
} }
func (c *TreeClient) getSubTreeMultipartUploads(ctx context.Context, cnrID cid.ID, nodeID uint64) ([]*data.MultipartInfo, error) { func (c *TreeClient) getSubTreeMultipartUploads(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) ([]*data.MultipartInfo, error) {
subTree, err := c.getSubTree(ctx, cnrID, systemTree, nodeID, maxGetSubTreeDepth) subTree, err := c.getSubTree(ctx, bktInfo, systemTree, nodeID, maxGetSubTreeDepth)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -870,10 +870,10 @@ func (c *TreeClient) getSubTreeMultipartUploads(ctx context.Context, cnrID cid.I
return result, nil 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) path := pathFromName(objectName)
p := &getNodesParams{ p := &getNodesParams{
CnrID: cnrID, BktInfo: bktInfo,
TreeID: systemTree, TreeID: systemTree,
Path: path, Path: path,
AllAttrs: true, AllAttrs: true,
@ -897,8 +897,8 @@ func (c *TreeClient) GetMultipartUpload(ctx context.Context, cnrID cid.ID, objec
return nil, layer.ErrNodeNotFound return nil, layer.ErrNodeNotFound
} }
func (c *TreeClient) AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { 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, cnrID, systemTree, multipartNodeID, 2) parts, err := c.getSubTree(ctx, bktInfo, systemTree, multipartNodeID, 2)
if err != nil { if err != nil {
return oid.ID{}, err return oid.ID{}, err
} }
@ -928,17 +928,17 @@ func (c *TreeClient) AddPart(ctx context.Context, cnrID cid.ID, multipartNodeID
} }
if foundPartID != 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{}, err
} }
return oid.ID{}, layer.ErrNoNodeToRemove 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) { func (c *TreeClient) GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) {
parts, err := c.getSubTree(ctx, cnrID, systemTree, multipartNodeID, 2) parts, err := c.getSubTree(ctx, bktInfo, systemTree, multipartNodeID, 2)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -958,11 +958,11 @@ func (c *TreeClient) GetParts(ctx context.Context, cnrID cid.ID, multipartNodeID
return result, nil return result, nil
} }
func (c *TreeClient) DeleteMultipartUpload(ctx context.Context, cnrID cid.ID, multipartNodeID uint64) error { func (c *TreeClient) DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error {
return c.removeNode(ctx, cnrID, systemTree, multipartNodeID) 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"} meta := map[string]string{isLockKV: "true"}
if lock.IsLegalHoldSet() { if lock.IsLegalHoldSet() {
@ -977,15 +977,15 @@ func (c *TreeClient) PutLock(ctx context.Context, cnrID cid.ID, nodeID uint64, l
} }
if lock.ID() == 0 { if lock.ID() == 0 {
_, err := c.addNode(ctx, cnrID, versionTree, nodeID, meta) _, err := c.addNode(ctx, bktInfo, versionTree, nodeID, meta)
return err 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) { func (c *TreeClient) GetLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) {
lockNode, err := c.getTreeNode(ctx, cnrID, nodeID, isLockKV) lockNode, err := c.getTreeNode(ctx, bktInfo, nodeID, isLockKV)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1020,8 +1020,8 @@ func getLock(lockNode *TreeNode) (*data.LockInfo, error) {
return lockInfo, nil return lockInfo, nil
} }
func (c *TreeClient) GetObjectTaggingAndLock(ctx context.Context, cnrID cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { func (c *TreeClient) GetObjectTaggingAndLock(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) {
nodes, err := c.getTreeNodes(ctx, cnrID, objVersion.ID, isTagKV, isLockKV) nodes, err := c.getTreeNodes(ctx, bktInfo, objVersion.ID, isTagKV, isLockKV)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -1042,7 +1042,7 @@ func (c *TreeClient) Close() error {
return nil 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) path := pathFromName(version.FilePath)
meta := map[string]string{ meta := map[string]string{
oidKV: version.OID.EncodeToString(), oidKV: version.OID.EncodeToString(),
@ -1065,13 +1065,13 @@ func (c *TreeClient) addVersion(ctx context.Context, cnrID cid.ID, treeID string
if version.IsUnversioned { if version.IsUnversioned {
meta[isUnversionedKV] = "true" 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 == 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 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) { 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 { func (c *TreeClient) clearOutdatedVersionInfo(ctx context.Context, bktInfo *data.BucketInfo, treeID string, nodeID uint64) error {
taggingNode, err := c.getTreeNode(ctx, cnrID, nodeID, isTagKV) taggingNode, err := c.getTreeNode(ctx, bktInfo, nodeID, isTagKV)
if err != nil { if err != nil {
return err return err
} }
if taggingNode != nil { if taggingNode != nil {
return c.removeNode(ctx, cnrID, treeID, taggingNode.ID) return c.removeNode(ctx, bktInfo, treeID, taggingNode.ID)
} }
return nil 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} keysToReturn := []string{oidKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV}
path := pathFromName(filepath) path := pathFromName(filepath)
p := &getNodesParams{ p := &getNodesParams{
CnrID: cnrID, BktInfo: bktInfo,
TreeID: treeID, TreeID: treeID,
Path: path, Path: path,
Meta: keysToReturn, Meta: keysToReturn,
@ -1130,14 +1130,14 @@ func (c *TreeClient) getVersions(ctx context.Context, cnrID cid.ID, treeID, file
return result, nil 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{ request := &tree.GetSubTreeRequest{
Body: &tree.GetSubTreeRequest_Body{ Body: &tree.GetSubTreeRequest_Body{
ContainerId: cnrID[:], ContainerId: bktInfo.CID[:],
TreeId: treeID, TreeId: treeID,
RootId: rootID, RootId: rootID,
Depth: depth, 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 return info.Meta
} }
func (c *TreeClient) getSystemNode(ctx context.Context, cnrID cid.ID, path, meta []string) (*TreeNode, error) { func (c *TreeClient) getSystemNode(ctx context.Context, bktInfo *data.BucketInfo, path, meta []string) (*TreeNode, error) {
return c.getNode(ctx, cnrID, systemTree, path, meta, false) return c.getNode(ctx, bktInfo, systemTree, path, meta, false)
} }
func (c *TreeClient) getSystemNodeWithAllAttributes(ctx context.Context, cnrID cid.ID, path []string) (*TreeNode, error) { func (c *TreeClient) getSystemNodeWithAllAttributes(ctx context.Context, bktInfo *data.BucketInfo, path []string) (*TreeNode, error) {
return c.getNode(ctx, cnrID, systemTree, path, []string{}, true) 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{ p := &getNodesParams{
CnrID: cnrID, BktInfo: bktInfo,
TreeID: treeID, TreeID: treeID,
Path: path, Path: path,
Meta: meta, 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) { func (c *TreeClient) getNodes(ctx context.Context, p *getNodesParams) ([]*tree.GetNodeByPathResponse_Info, error) {
request := &tree.GetNodeByPathRequest{ request := &tree.GetNodeByPathRequest{
Body: &tree.GetNodeByPathRequest_Body{ Body: &tree.GetNodeByPathRequest_Body{
ContainerId: p.CnrID[:], ContainerId: p.BktInfo.CID[:],
TreeId: p.TreeID, TreeId: p.TreeID,
Path: p.Path, Path: p.Path,
Attributes: p.Meta, Attributes: p.Meta,
PathAttribute: fileNameKV, PathAttribute: fileNameKV,
LatestOnly: p.LatestOnly, LatestOnly: p.LatestOnly,
AllAttributes: p.AllAttrs, 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 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, ok := ctx.Value(api.BoxData).(*accessbox.Box); ok && bd != nil && bd.Gate != nil {
if bd.Gate.BearerToken != 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 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{ request := &tree.AddRequest{
Body: &tree.AddRequest_Body{ Body: &tree.AddRequest_Body{
ContainerId: cnrID[:], ContainerId: bktInfo.CID[:],
TreeId: treeID, TreeId: treeID,
ParentId: parent, ParentId: parent,
Meta: metaToKV(meta), Meta: metaToKV(meta),
BearerToken: getBearer(ctx), BearerToken: getBearer(ctx, bktInfo),
}, },
} }
if err := c.signRequest(request.Body, func(key, sign []byte) { 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 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{ request := &tree.AddByPathRequest{
Body: &tree.AddByPathRequest_Body{ Body: &tree.AddByPathRequest_Body{
ContainerId: cnrID[:], ContainerId: bktInfo.CID[:],
TreeId: treeID, TreeId: treeID,
Path: path, Path: path,
Meta: metaToKV(meta), Meta: metaToKV(meta),
PathAttribute: fileNameKV, 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 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{ request := &tree.MoveRequest{
Body: &tree.MoveRequest_Body{ Body: &tree.MoveRequest_Body{
ContainerId: cnrID[:], ContainerId: bktInfo.CID[:],
TreeId: treeID, TreeId: treeID,
NodeId: nodeID, NodeId: nodeID,
ParentId: parentID, ParentId: parentID,
Meta: metaToKV(meta), 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 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{ request := &tree.RemoveRequest{
Body: &tree.RemoveRequest_Body{ Body: &tree.RemoveRequest_Body{
ContainerId: cnrID[:], ContainerId: bktInfo.CID[:],
TreeId: treeID, TreeId: treeID,
NodeId: nodeID, NodeId: nodeID,
BearerToken: getBearer(ctx), BearerToken: getBearer(ctx, bktInfo),
}, },
} }
if err := c.signRequest(request.Body, func(key, sign []byte) { if err := c.signRequest(request.Body, func(key, sign []byte) {