forked from TrueCloudLab/frostfs-s3-gw
[#641] Rework CORS bucket behaviour
Signed-off-by: Marina Biryukova <m.biryukova@yadro.com>
This commit is contained in:
parent
1fac8e3ef2
commit
9edec7d573
16 changed files with 490 additions and 138 deletions
|
@ -46,41 +46,36 @@ func (n *Layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error {
|
|||
}
|
||||
|
||||
prm := frostfs.PrmObjectCreate{
|
||||
Container: n.corsCnrInfo.CID,
|
||||
Payload: &buf,
|
||||
Filepath: p.BktInfo.CORSObjectName(),
|
||||
Filepath: p.BktInfo.CORSObjectFilePath(),
|
||||
CreationTime: TimeNow(ctx),
|
||||
CopiesNumber: p.CopiesNumbers,
|
||||
PrmAuth: frostfs.PrmAuth{
|
||||
PrivateKey: &n.gateKey.PrivateKey,
|
||||
},
|
||||
}
|
||||
|
||||
var corsBkt *data.BucketInfo
|
||||
if n.corsCnrInfo == nil {
|
||||
corsBkt = p.BktInfo
|
||||
prm.CopiesNumber = p.CopiesNumbers
|
||||
} else {
|
||||
corsBkt = n.corsCnrInfo
|
||||
prm.PrmAuth.PrivateKey = &n.gateKey.PrivateKey
|
||||
}
|
||||
|
||||
prm.Container = corsBkt.CID
|
||||
|
||||
createdObj, err := n.objectPutAndHash(ctx, prm, corsBkt)
|
||||
_, err := n.objectPutAndHash(ctx, prm, n.corsCnrInfo)
|
||||
if err != nil {
|
||||
return fmt.Errorf("put cors object: %w", err)
|
||||
}
|
||||
|
||||
objsToDelete, err := n.treeService.PutBucketCORS(ctx, p.BktInfo, newAddress(corsBkt.CID, createdObj.ID))
|
||||
objToDeleteNotFound := errors.Is(err, tree.ErrNoNodeToRemove)
|
||||
if err != nil && !objToDeleteNotFound {
|
||||
return err
|
||||
n.cache.PutCORS(n.BearerOwner(ctx), p.BktInfo, cors)
|
||||
|
||||
objs, err := n.treeService.DeleteBucketCORS(ctx, p.BktInfo)
|
||||
objNotFound := errors.Is(err, tree.ErrNoNodeToRemove)
|
||||
if err != nil && !objNotFound {
|
||||
n.reqLogger(ctx).Error(logs.CouldntDeleteBucketCORS, zap.Error(err), logs.TagField(logs.TagExternalStorageTree))
|
||||
return nil
|
||||
}
|
||||
|
||||
if !objToDeleteNotFound {
|
||||
for _, addr := range objsToDelete {
|
||||
if !objNotFound {
|
||||
for _, addr := range objs {
|
||||
n.deleteCORSObject(ctx, p.BktInfo, addr)
|
||||
}
|
||||
}
|
||||
|
||||
n.cache.PutCORS(n.BearerOwner(ctx), p.BktInfo, cors)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -117,10 +112,22 @@ func (n *Layer) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo)
|
|||
ctx, span := tracing.StartSpanFromContext(ctx, "layer.DeleteBucketCORS")
|
||||
defer span.End()
|
||||
|
||||
corsVersions, err := n.getCORSVersions(ctx, bktInfo)
|
||||
if err != nil {
|
||||
return fmt.Errorf("get cors versions: %w", err)
|
||||
}
|
||||
|
||||
sortedVersions := corsVersions.GetSorted()
|
||||
for _, version := range sortedVersions {
|
||||
if err = n.objectDeleteWithAuth(ctx, n.corsCnrInfo, version.ObjID, frostfs.PrmAuth{PrivateKey: &n.gateKey.PrivateKey}); err != nil {
|
||||
return fmt.Errorf("delete cors object '%s': %w", version.VersionID(), err)
|
||||
}
|
||||
}
|
||||
|
||||
objs, err := n.treeService.DeleteBucketCORS(ctx, bktInfo)
|
||||
objNotFound := errors.Is(err, tree.ErrNoNodeToRemove)
|
||||
if err != nil && !objNotFound {
|
||||
return err
|
||||
return fmt.Errorf("delete cors from tree: %w", err)
|
||||
}
|
||||
|
||||
if !objNotFound {
|
||||
|
@ -134,6 +141,22 @@ func (n *Layer) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo)
|
|||
return nil
|
||||
}
|
||||
|
||||
func (n *Layer) deleteCORSVersions(ctx context.Context, bktInfo *data.BucketInfo) {
|
||||
corsVersions, err := n.getCORSVersions(ctx, bktInfo)
|
||||
if err != nil {
|
||||
n.reqLogger(ctx).Error(logs.CouldntGetCORSObjectVersions, zap.Error(err), logs.TagField(logs.TagExternalStorage))
|
||||
return
|
||||
}
|
||||
|
||||
var addr oid.Address
|
||||
addr.SetContainer(n.corsCnrInfo.CID)
|
||||
sortedVersions := corsVersions.GetSorted()
|
||||
for _, version := range sortedVersions {
|
||||
addr.SetObject(version.ObjID)
|
||||
n.deleteCORSObject(ctx, bktInfo, addr)
|
||||
}
|
||||
}
|
||||
|
||||
func checkCORS(cors *data.CORSConfiguration) error {
|
||||
for _, r := range cors.CORSRules {
|
||||
for _, m := range r.AllowedMethods {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue