[#1307] cli: Introduce object patch
command
Signed-off-by: Airat Arifullin <a.arifullin@yadro.com>
This commit is contained in:
parent
e890f1b4b1
commit
5ed317e24c
4 changed files with 220 additions and 0 deletions
|
@ -2,10 +2,13 @@ package internal
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"cmp"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"slices"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
|
@ -869,3 +872,65 @@ func SyncContainerSettings(ctx context.Context, prm SyncContainerPrm) (*SyncCont
|
|||
|
||||
return new(SyncContainerRes), nil
|
||||
}
|
||||
|
||||
// PatchObjectPrm groups parameters of PatchObject operation.
|
||||
type PatchObjectPrm struct {
|
||||
commonObjectPrm
|
||||
objectAddressPrm
|
||||
|
||||
NewAttributes []objectSDK.Attribute
|
||||
|
||||
ReplaceAttribute bool
|
||||
|
||||
PayloadPatches []PayloadPatch
|
||||
}
|
||||
|
||||
type PayloadPatch struct {
|
||||
Range objectSDK.Range
|
||||
|
||||
PayloadPath string
|
||||
}
|
||||
|
||||
type PatchRes struct {
|
||||
OID oid.ID
|
||||
}
|
||||
|
||||
func Patch(ctx context.Context, prm PatchObjectPrm) (*PatchRes, error) {
|
||||
patchPrm := client.PrmObjectPatch{
|
||||
XHeaders: prm.xHeaders,
|
||||
BearerToken: prm.bearerToken,
|
||||
Session: prm.sessionToken,
|
||||
Address: prm.objAddr,
|
||||
}
|
||||
|
||||
slices.SortFunc(prm.PayloadPatches, func(a, b PayloadPatch) int {
|
||||
return cmp.Compare(a.Range.GetOffset(), b.Range.GetOffset())
|
||||
})
|
||||
|
||||
patcher, err := prm.cli.ObjectPatchInit(ctx, patchPrm)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("init payload reading: %w", err)
|
||||
}
|
||||
|
||||
if patcher.PatchAttributes(ctx, prm.NewAttributes, prm.ReplaceAttribute) {
|
||||
for _, pp := range prm.PayloadPatches {
|
||||
payloadFile, err := os.OpenFile(pp.PayloadPath, os.O_RDONLY, os.ModePerm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
applied := patcher.PatchPayload(ctx, &pp.Range, payloadFile)
|
||||
_ = payloadFile.Close()
|
||||
if !applied {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res, err := patcher.Close(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &PatchRes{
|
||||
OID: res.ObjectID(),
|
||||
}, nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue