forked from TrueCloudLab/frostfs-sdk-go
[#165] pool: replace options with parameters
Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
parent
ec5c223f29
commit
d03523a3bc
2 changed files with 331 additions and 170 deletions
479
pool/pool.go
479
pool/pool.go
|
@ -103,60 +103,222 @@ type clientPack struct {
|
|||
address string
|
||||
}
|
||||
|
||||
type CallOption func(config *callConfig)
|
||||
|
||||
type callConfig struct {
|
||||
useDefaultSession bool
|
||||
verb sessionv2.ObjectSessionVerb
|
||||
addr *address.Address
|
||||
type prmCommon struct {
|
||||
defaultSession bool
|
||||
verb sessionv2.ObjectSessionVerb
|
||||
addr *address.Address
|
||||
|
||||
key *ecdsa.PrivateKey
|
||||
btoken *token.BearerToken
|
||||
stoken *session.Token
|
||||
}
|
||||
|
||||
func WithKey(key *ecdsa.PrivateKey) CallOption {
|
||||
return func(config *callConfig) {
|
||||
config.key = key
|
||||
}
|
||||
func (x *prmCommon) useDefaultSession() {
|
||||
x.defaultSession = true
|
||||
}
|
||||
|
||||
func WithBearer(token *token.BearerToken) CallOption {
|
||||
return func(config *callConfig) {
|
||||
config.btoken = token
|
||||
}
|
||||
func (x *prmCommon) useAddress(addr *address.Address) {
|
||||
x.addr = addr
|
||||
}
|
||||
|
||||
func WithSession(token *session.Token) CallOption {
|
||||
return func(config *callConfig) {
|
||||
config.stoken = token
|
||||
}
|
||||
func (x *prmCommon) useVerb(verb sessionv2.ObjectSessionVerb) {
|
||||
x.verb = verb
|
||||
}
|
||||
|
||||
func useDefaultSession() CallOption {
|
||||
return func(config *callConfig) {
|
||||
config.useDefaultSession = true
|
||||
}
|
||||
// UseKey specifies private key to sign the requests.
|
||||
// If key is not provided, then Pool default key is used.
|
||||
func (x *prmCommon) UseKey(key *ecdsa.PrivateKey) {
|
||||
x.key = key
|
||||
}
|
||||
|
||||
func useAddress(addr *address.Address) CallOption {
|
||||
return func(config *callConfig) {
|
||||
config.addr = addr
|
||||
}
|
||||
// UseBearer attaches bearer token to be used for the operation.
|
||||
func (x *prmCommon) UseBearer(token *token.BearerToken) {
|
||||
x.btoken = token
|
||||
}
|
||||
|
||||
func useVerb(verb sessionv2.ObjectSessionVerb) CallOption {
|
||||
return func(config *callConfig) {
|
||||
config.verb = verb
|
||||
}
|
||||
// UseSession specifies session within which object should be read.
|
||||
func (x *prmCommon) UseSession(token *session.Token) {
|
||||
x.stoken = token
|
||||
}
|
||||
|
||||
func cfgFromOpts(opts ...CallOption) *callConfig {
|
||||
var cfg = new(callConfig)
|
||||
for _, opt := range opts {
|
||||
opt(cfg)
|
||||
}
|
||||
return cfg
|
||||
// PrmObjectPut groups parameters of PutObject operation.
|
||||
type PrmObjectPut struct {
|
||||
prmCommon
|
||||
|
||||
hdr object.Object
|
||||
|
||||
payload io.Reader
|
||||
}
|
||||
|
||||
// SetHeader specifies header of the object.
|
||||
func (x *PrmObjectPut) SetHeader(hdr object.Object) {
|
||||
x.hdr = hdr
|
||||
}
|
||||
|
||||
// SetPayload specifies payload of the object.
|
||||
func (x *PrmObjectPut) SetPayload(payload io.Reader) {
|
||||
x.payload = payload
|
||||
}
|
||||
|
||||
// PrmObjectDelete groups parameters of DeleteObject operation.
|
||||
type PrmObjectDelete struct {
|
||||
prmCommon
|
||||
|
||||
addr address.Address
|
||||
}
|
||||
|
||||
// SetAddress specifies NeoFS address of the object.
|
||||
func (x *PrmObjectDelete) SetAddress(addr address.Address) {
|
||||
x.addr = addr
|
||||
}
|
||||
|
||||
// PrmObjectGet groups parameters of GetObject operation.
|
||||
type PrmObjectGet struct {
|
||||
prmCommon
|
||||
|
||||
addr address.Address
|
||||
}
|
||||
|
||||
// SetAddress specifies NeoFS address of the object.
|
||||
func (x *PrmObjectGet) SetAddress(addr address.Address) {
|
||||
x.addr = addr
|
||||
}
|
||||
|
||||
// PrmObjectHead groups parameters of HeadObject operation.
|
||||
type PrmObjectHead struct {
|
||||
prmCommon
|
||||
|
||||
addr address.Address
|
||||
}
|
||||
|
||||
// SetAddress specifies NeoFS address of the object.
|
||||
func (x *PrmObjectHead) SetAddress(addr address.Address) {
|
||||
x.addr = addr
|
||||
}
|
||||
|
||||
// PrmObjectRange groups parameters of RangeObject operation.
|
||||
type PrmObjectRange struct {
|
||||
prmCommon
|
||||
|
||||
addr address.Address
|
||||
off, ln uint64
|
||||
}
|
||||
|
||||
// SetAddress specifies NeoFS address of the object.
|
||||
func (x *PrmObjectRange) SetAddress(addr address.Address) {
|
||||
x.addr = addr
|
||||
}
|
||||
|
||||
// SetOffset sets offset of the payload range to be read.
|
||||
func (x *PrmObjectRange) SetOffset(offset uint64) {
|
||||
x.off = offset
|
||||
}
|
||||
|
||||
// SetLength sets length of the payload range to be read.
|
||||
func (x *PrmObjectRange) SetLength(length uint64) {
|
||||
x.ln = length
|
||||
}
|
||||
|
||||
// PrmObjectSearch groups parameters of SearchObjects operation.
|
||||
type PrmObjectSearch struct {
|
||||
prmCommon
|
||||
|
||||
cnrID cid.ID
|
||||
filters object.SearchFilters
|
||||
}
|
||||
|
||||
// SetContainerID specifies the container in which to look for objects.
|
||||
func (x *PrmObjectSearch) SetContainerID(cnrID cid.ID) {
|
||||
x.cnrID = cnrID
|
||||
}
|
||||
|
||||
// SetFilters specifies filters by which to select objects.
|
||||
func (x *PrmObjectSearch) SetFilters(filters object.SearchFilters) {
|
||||
x.filters = filters
|
||||
}
|
||||
|
||||
// PrmContainerPut groups parameters of PutContainer operation.
|
||||
type PrmContainerPut struct {
|
||||
prmCommon
|
||||
|
||||
cnr *container.Container
|
||||
}
|
||||
|
||||
// SetContainer specifies structured information about new NeoFS container.
|
||||
func (x *PrmContainerPut) SetContainer(cnr *container.Container) {
|
||||
x.cnr = cnr
|
||||
}
|
||||
|
||||
// PrmContainerGet groups parameters of GetContainer operation.
|
||||
type PrmContainerGet struct {
|
||||
prmCommon
|
||||
|
||||
cnrID *cid.ID
|
||||
}
|
||||
|
||||
// SetContainerID specifies identifier of the container to be read.
|
||||
func (x *PrmContainerGet) SetContainerID(cnrID *cid.ID) {
|
||||
x.cnrID = cnrID
|
||||
}
|
||||
|
||||
// PrmContainerList groups parameters of ListContainers operation.
|
||||
type PrmContainerList struct {
|
||||
prmCommon
|
||||
|
||||
ownerID *owner.ID
|
||||
}
|
||||
|
||||
// SetOwnerID specifies identifier of the NeoFS account to list the containers.
|
||||
func (x *PrmContainerList) SetOwnerID(ownerID *owner.ID) {
|
||||
x.ownerID = ownerID
|
||||
}
|
||||
|
||||
// PrmContainerDelete groups parameters of DeleteContainer operation.
|
||||
type PrmContainerDelete struct {
|
||||
prmCommon
|
||||
|
||||
cnrID *cid.ID
|
||||
}
|
||||
|
||||
// SetContainerID specifies identifier of the NeoFS container to be removed.
|
||||
func (x *PrmContainerDelete) SetContainerID(cnrID *cid.ID) {
|
||||
x.cnrID = cnrID
|
||||
}
|
||||
|
||||
// PrmContainerEACL groups parameters of GetEACL operation.
|
||||
type PrmContainerEACL struct {
|
||||
prmCommon
|
||||
|
||||
cnrID *cid.ID
|
||||
}
|
||||
|
||||
// SetContainerID specifies identifier of the NeoFS container to read the eACL table.
|
||||
func (x *PrmContainerEACL) SetContainerID(cnrID *cid.ID) {
|
||||
x.cnrID = cnrID
|
||||
}
|
||||
|
||||
// PrmContainerSetEACL groups parameters of SetEACL operation.
|
||||
type PrmContainerSetEACL struct {
|
||||
prmCommon
|
||||
|
||||
table *eacl.Table
|
||||
}
|
||||
|
||||
// SetTable specifies eACL table structure to be set for the container.
|
||||
func (x *PrmContainerSetEACL) SetTable(table *eacl.Table) {
|
||||
x.table = table
|
||||
}
|
||||
|
||||
// PrmBalanceGet groups parameters of Balance operation.
|
||||
type PrmBalanceGet struct {
|
||||
prmCommon
|
||||
|
||||
ownerID *owner.ID
|
||||
}
|
||||
|
||||
// SetOwnerID specifies identifier of the NeoFS account for which the balance is requested.
|
||||
func (x *PrmBalanceGet) SetOwnerID(ownerID *owner.ID) {
|
||||
x.ownerID = ownerID
|
||||
}
|
||||
|
||||
type Pool struct {
|
||||
|
@ -490,7 +652,7 @@ func formCacheKey(address string, key *ecdsa.PrivateKey) string {
|
|||
return address + k.String()
|
||||
}
|
||||
|
||||
func (p *Pool) conn(ctx context.Context, cfg *callConfig) (*clientPack, error) {
|
||||
func (p *Pool) conn(ctx context.Context, cfg prmCommon) (*clientPack, error) {
|
||||
cp, err := p.connection()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -502,7 +664,7 @@ func (p *Pool) conn(ctx context.Context, cfg *callConfig) (*clientPack, error) {
|
|||
}
|
||||
|
||||
sessionToken := cfg.stoken
|
||||
if sessionToken == nil && cfg.useDefaultSession {
|
||||
if sessionToken == nil && cfg.defaultSession {
|
||||
cacheKey := formCacheKey(cp.address, key)
|
||||
sessionToken = p.cache.Get(cacheKey)
|
||||
if sessionToken == nil {
|
||||
|
@ -555,7 +717,7 @@ func createSessionTokenForDuration(ctx context.Context, c Client, dur uint64) (*
|
|||
return c.SessionCreate(ctx, prm)
|
||||
}
|
||||
|
||||
func (p *Pool) removeSessionTokenAfterThreshold(cfg *callConfig) error {
|
||||
func (p *Pool) removeSessionTokenAfterThreshold(cfg prmCommon) error {
|
||||
cp, err := p.connection()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -592,7 +754,7 @@ type callContext struct {
|
|||
sessionContext *session.ObjectContext
|
||||
}
|
||||
|
||||
func (p *Pool) initCallContext(ctx *callContext, cfg *callConfig) error {
|
||||
func (p *Pool) initCallContext(ctx *callContext, cfg prmCommon) error {
|
||||
cp, err := p.connection()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -612,7 +774,7 @@ func (p *Pool) initCallContext(ctx *callContext, cfg *callConfig) error {
|
|||
}
|
||||
|
||||
// note that we don't override session provided by the caller
|
||||
ctx.sessionDefault = cfg.stoken == nil && cfg.useDefaultSession
|
||||
ctx.sessionDefault = cfg.stoken == nil && cfg.defaultSession
|
||||
if ctx.sessionDefault {
|
||||
ctx.sessionContext = session.NewObjectContext()
|
||||
ctx.sessionContext.ToV2().SetVerb(cfg.verb)
|
||||
|
@ -628,7 +790,7 @@ type callContextWithRetry struct {
|
|||
noRetry bool
|
||||
}
|
||||
|
||||
func (p *Pool) initCallContextWithRetry(ctx *callContextWithRetry, cfg *callConfig) error {
|
||||
func (p *Pool) initCallContextWithRetry(ctx *callContextWithRetry, cfg prmCommon) error {
|
||||
err := p.initCallContext(&ctx.callContext, cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -696,11 +858,10 @@ func (p *Pool) callWithRetry(ctx *callContextWithRetry, f func() error) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (p *Pool) PutObject(ctx context.Context, hdr object.Object, payload io.Reader, opts ...CallOption) (*oid.ID, error) {
|
||||
cfg := cfgFromOpts(append(opts,
|
||||
useDefaultSession(),
|
||||
useVerb(sessionv2.ObjectVerbPut),
|
||||
useAddress(newAddressFromCnrID(hdr.ContainerID())))...)
|
||||
func (p *Pool) PutObject(ctx context.Context, prm PrmObjectPut) (*oid.ID, error) {
|
||||
prm.useDefaultSession()
|
||||
prm.useVerb(sessionv2.ObjectVerbPut)
|
||||
prm.useAddress(newAddressFromCnrID(prm.hdr.ContainerID()))
|
||||
|
||||
// Put object is different from other object service methods. Put request
|
||||
// can't be resent in case of session token failures (i.e. session token is
|
||||
|
@ -712,7 +873,7 @@ func (p *Pool) PutObject(ctx context.Context, hdr object.Object, payload io.Read
|
|||
// by checking when the session token was accessed for the last time. If it
|
||||
// hits a threshold, session token is removed from cache for a new one to be
|
||||
// issued.
|
||||
err := p.removeSessionTokenAfterThreshold(cfg)
|
||||
err := p.removeSessionTokenAfterThreshold(prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -721,14 +882,14 @@ func (p *Pool) PutObject(ctx context.Context, hdr object.Object, payload io.Read
|
|||
|
||||
ctxCall.Context = ctx
|
||||
|
||||
err = p.initCallContext(&ctxCall, cfg)
|
||||
err = p.initCallContext(&ctxCall, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("init call context")
|
||||
}
|
||||
|
||||
var prm client.PrmObjectPutInit
|
||||
var cliPrm client.PrmObjectPutInit
|
||||
|
||||
wObj, err := ctxCall.client.ObjectPutInit(ctx, prm)
|
||||
wObj, err := ctxCall.client.ObjectPutInit(ctx, cliPrm)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("init writing on API client: %w", err)
|
||||
}
|
||||
|
@ -743,23 +904,23 @@ func (p *Pool) PutObject(ctx context.Context, hdr object.Object, payload io.Read
|
|||
|
||||
wObj.UseKey(*ctxCall.key)
|
||||
|
||||
if cfg.btoken != nil {
|
||||
wObj.WithBearerToken(*cfg.btoken)
|
||||
if prm.btoken != nil {
|
||||
wObj.WithBearerToken(*prm.btoken)
|
||||
}
|
||||
|
||||
if wObj.WriteHeader(hdr) {
|
||||
sz := hdr.PayloadSize()
|
||||
if wObj.WriteHeader(prm.hdr) {
|
||||
sz := prm.hdr.PayloadSize()
|
||||
|
||||
if data := hdr.Payload(); len(data) > 0 {
|
||||
if payload != nil {
|
||||
payload = io.MultiReader(bytes.NewReader(data), payload)
|
||||
if data := prm.hdr.Payload(); len(data) > 0 {
|
||||
if prm.payload != nil {
|
||||
prm.payload = io.MultiReader(bytes.NewReader(data), prm.payload)
|
||||
} else {
|
||||
payload = bytes.NewReader(data)
|
||||
prm.payload = bytes.NewReader(data)
|
||||
sz = uint64(len(data))
|
||||
}
|
||||
}
|
||||
|
||||
if payload != nil {
|
||||
if prm.payload != nil {
|
||||
const defaultBufferSizePut = 3 << 20 // configure?
|
||||
|
||||
if sz == 0 || sz > defaultBufferSizePut {
|
||||
|
@ -771,7 +932,7 @@ func (p *Pool) PutObject(ctx context.Context, hdr object.Object, payload io.Read
|
|||
var n int
|
||||
|
||||
for {
|
||||
n, err = payload.Read(buf)
|
||||
n, err = prm.payload.Read(buf)
|
||||
if n > 0 {
|
||||
if !wObj.WritePayloadChunk(buf[:n]) {
|
||||
break
|
||||
|
@ -805,36 +966,35 @@ func (p *Pool) PutObject(ctx context.Context, hdr object.Object, payload io.Read
|
|||
return &id, nil
|
||||
}
|
||||
|
||||
func (p *Pool) DeleteObject(ctx context.Context, addr address.Address, opts ...CallOption) error {
|
||||
cfg := cfgFromOpts(append(opts,
|
||||
useDefaultSession(),
|
||||
useVerb(sessionv2.ObjectVerbDelete),
|
||||
useAddress(&addr))...)
|
||||
func (p *Pool) DeleteObject(ctx context.Context, prm PrmObjectDelete) error {
|
||||
prm.useDefaultSession()
|
||||
prm.useVerb(sessionv2.ObjectVerbDelete)
|
||||
prm.useAddress(&prm.addr)
|
||||
|
||||
var prm client.PrmObjectDelete
|
||||
var cliPrm client.PrmObjectDelete
|
||||
|
||||
var cc callContextWithRetry
|
||||
|
||||
cc.Context = ctx
|
||||
cc.sessionTarget = prm.WithinSession
|
||||
cc.sessionTarget = cliPrm.WithinSession
|
||||
|
||||
err := p.initCallContextWithRetry(&cc, cfg)
|
||||
err := p.initCallContextWithRetry(&cc, prm.prmCommon)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if cnr := addr.ContainerID(); cnr != nil {
|
||||
prm.FromContainer(*cnr)
|
||||
if cnr := prm.addr.ContainerID(); cnr != nil {
|
||||
cliPrm.FromContainer(*cnr)
|
||||
}
|
||||
|
||||
if obj := addr.ObjectID(); obj != nil {
|
||||
prm.ByID(*obj)
|
||||
if obj := prm.addr.ObjectID(); obj != nil {
|
||||
cliPrm.ByID(*obj)
|
||||
}
|
||||
|
||||
prm.UseKey(*cc.key)
|
||||
cliPrm.UseKey(*cc.key)
|
||||
|
||||
return p.callWithRetry(&cc, func() error {
|
||||
_, err := cc.client.ObjectDelete(ctx, prm)
|
||||
_, err := cc.client.ObjectDelete(ctx, cliPrm)
|
||||
if err != nil {
|
||||
return fmt.Errorf("remove object via client: %w", err)
|
||||
}
|
||||
|
@ -860,36 +1020,35 @@ type ResGetObject struct {
|
|||
Payload io.ReadCloser
|
||||
}
|
||||
|
||||
func (p *Pool) GetObject(ctx context.Context, addr address.Address, opts ...CallOption) (*ResGetObject, error) {
|
||||
cfg := cfgFromOpts(append(opts,
|
||||
useDefaultSession(),
|
||||
useVerb(sessionv2.ObjectVerbGet),
|
||||
useAddress(&addr))...)
|
||||
func (p *Pool) GetObject(ctx context.Context, prm PrmObjectGet) (*ResGetObject, error) {
|
||||
prm.useDefaultSession()
|
||||
prm.useVerb(sessionv2.ObjectVerbGet)
|
||||
prm.useAddress(&prm.addr)
|
||||
|
||||
var prm client.PrmObjectGet
|
||||
var cliPrm client.PrmObjectGet
|
||||
|
||||
var cc callContextWithRetry
|
||||
|
||||
cc.Context = ctx
|
||||
cc.sessionTarget = prm.WithinSession
|
||||
cc.sessionTarget = cliPrm.WithinSession
|
||||
|
||||
err := p.initCallContextWithRetry(&cc, cfg)
|
||||
err := p.initCallContextWithRetry(&cc, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cnr := addr.ContainerID(); cnr != nil {
|
||||
prm.FromContainer(*cnr)
|
||||
if cnr := prm.addr.ContainerID(); cnr != nil {
|
||||
cliPrm.FromContainer(*cnr)
|
||||
}
|
||||
|
||||
if obj := addr.ObjectID(); obj != nil {
|
||||
prm.ByID(*obj)
|
||||
if obj := prm.addr.ObjectID(); obj != nil {
|
||||
cliPrm.ByID(*obj)
|
||||
}
|
||||
|
||||
var res ResGetObject
|
||||
|
||||
err = p.callWithRetry(&cc, func() error {
|
||||
rObj, err := cc.client.ObjectGetInit(ctx, prm)
|
||||
rObj, err := cc.client.ObjectGetInit(ctx, cliPrm)
|
||||
if err != nil {
|
||||
return fmt.Errorf("init object reading on client: %w", err)
|
||||
}
|
||||
|
@ -912,38 +1071,37 @@ func (p *Pool) GetObject(ctx context.Context, addr address.Address, opts ...Call
|
|||
return &res, nil
|
||||
}
|
||||
|
||||
func (p *Pool) HeadObject(ctx context.Context, addr address.Address, opts ...CallOption) (*object.Object, error) {
|
||||
cfg := cfgFromOpts(append(opts,
|
||||
useDefaultSession(),
|
||||
useVerb(sessionv2.ObjectVerbHead),
|
||||
useAddress(&addr))...)
|
||||
func (p *Pool) HeadObject(ctx context.Context, prm PrmObjectHead) (*object.Object, error) {
|
||||
prm.useDefaultSession()
|
||||
prm.useVerb(sessionv2.ObjectVerbHead)
|
||||
prm.useAddress(&prm.addr)
|
||||
|
||||
var prm client.PrmObjectHead
|
||||
var cliPrm client.PrmObjectHead
|
||||
|
||||
var cc callContextWithRetry
|
||||
|
||||
cc.Context = ctx
|
||||
cc.sessionTarget = prm.WithinSession
|
||||
cc.sessionTarget = cliPrm.WithinSession
|
||||
|
||||
err := p.initCallContextWithRetry(&cc, cfg)
|
||||
err := p.initCallContextWithRetry(&cc, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cnr := addr.ContainerID(); cnr != nil {
|
||||
prm.FromContainer(*cnr)
|
||||
if cnr := prm.addr.ContainerID(); cnr != nil {
|
||||
cliPrm.FromContainer(*cnr)
|
||||
}
|
||||
|
||||
if obj := addr.ObjectID(); obj != nil {
|
||||
prm.ByID(*obj)
|
||||
if obj := prm.addr.ObjectID(); obj != nil {
|
||||
cliPrm.ByID(*obj)
|
||||
}
|
||||
|
||||
prm.UseKey(*cc.key)
|
||||
cliPrm.UseKey(*cc.key)
|
||||
|
||||
var obj object.Object
|
||||
|
||||
err = p.callWithRetry(&cc, func() error {
|
||||
res, err := cc.client.ObjectHead(ctx, prm)
|
||||
res, err := cc.client.ObjectHead(ctx, cliPrm)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read object header via client: %w", err)
|
||||
}
|
||||
|
@ -974,33 +1132,32 @@ func (x *ResObjectRange) Close() error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (p *Pool) ObjectRange(ctx context.Context, addr address.Address, off, ln uint64, opts ...CallOption) (*ResObjectRange, error) {
|
||||
cfg := cfgFromOpts(append(opts,
|
||||
useDefaultSession(),
|
||||
useVerb(sessionv2.ObjectVerbRange),
|
||||
useAddress(&addr))...)
|
||||
func (p *Pool) ObjectRange(ctx context.Context, prm PrmObjectRange) (*ResObjectRange, error) {
|
||||
prm.useDefaultSession()
|
||||
prm.useVerb(sessionv2.ObjectVerbRange)
|
||||
prm.useAddress(&prm.addr)
|
||||
|
||||
var prm client.PrmObjectRange
|
||||
var cliPrm client.PrmObjectRange
|
||||
|
||||
prm.SetOffset(off)
|
||||
prm.SetLength(ln)
|
||||
cliPrm.SetOffset(prm.off)
|
||||
cliPrm.SetLength(prm.ln)
|
||||
|
||||
var cc callContextWithRetry
|
||||
|
||||
cc.Context = ctx
|
||||
cc.sessionTarget = prm.WithinSession
|
||||
cc.sessionTarget = cliPrm.WithinSession
|
||||
|
||||
err := p.initCallContextWithRetry(&cc, cfg)
|
||||
err := p.initCallContextWithRetry(&cc, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cnr := addr.ContainerID(); cnr != nil {
|
||||
prm.FromContainer(*cnr)
|
||||
if cnr := prm.addr.ContainerID(); cnr != nil {
|
||||
cliPrm.FromContainer(*cnr)
|
||||
}
|
||||
|
||||
if obj := addr.ObjectID(); obj != nil {
|
||||
prm.ByID(*obj)
|
||||
if obj := prm.addr.ObjectID(); obj != nil {
|
||||
cliPrm.ByID(*obj)
|
||||
}
|
||||
|
||||
var res ResObjectRange
|
||||
|
@ -1008,7 +1165,7 @@ func (p *Pool) ObjectRange(ctx context.Context, addr address.Address, off, ln ui
|
|||
err = p.callWithRetry(&cc, func() error {
|
||||
var err error
|
||||
|
||||
res.payload, err = cc.client.ObjectRangeInit(ctx, prm)
|
||||
res.payload, err = cc.client.ObjectRangeInit(ctx, cliPrm)
|
||||
if err != nil {
|
||||
return fmt.Errorf("init payload range reading on client: %w", err)
|
||||
}
|
||||
|
@ -1050,23 +1207,22 @@ func (x *ResObjectSearch) Close() {
|
|||
_, _ = x.r.Close()
|
||||
}
|
||||
|
||||
func (p *Pool) SearchObjects(ctx context.Context, idCnr cid.ID, filters object.SearchFilters, opts ...CallOption) (*ResObjectSearch, error) {
|
||||
cfg := cfgFromOpts(append(opts,
|
||||
useDefaultSession(),
|
||||
useVerb(sessionv2.ObjectVerbSearch),
|
||||
useAddress(newAddressFromCnrID(&idCnr)))...)
|
||||
func (p *Pool) SearchObjects(ctx context.Context, prm PrmObjectSearch) (*ResObjectSearch, error) {
|
||||
prm.useDefaultSession()
|
||||
prm.useVerb(sessionv2.ObjectVerbSearch)
|
||||
prm.useAddress(newAddressFromCnrID(&prm.cnrID))
|
||||
|
||||
var prm client.PrmObjectSearch
|
||||
var cliPrm client.PrmObjectSearch
|
||||
|
||||
prm.InContainer(idCnr)
|
||||
prm.SetFilters(filters)
|
||||
cliPrm.InContainer(prm.cnrID)
|
||||
cliPrm.SetFilters(prm.filters)
|
||||
|
||||
var cc callContextWithRetry
|
||||
|
||||
cc.Context = ctx
|
||||
cc.sessionTarget = prm.WithinSession
|
||||
cc.sessionTarget = cliPrm.WithinSession
|
||||
|
||||
err := p.initCallContextWithRetry(&cc, cfg)
|
||||
err := p.initCallContextWithRetry(&cc, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -1076,7 +1232,7 @@ func (p *Pool) SearchObjects(ctx context.Context, idCnr cid.ID, filters object.S
|
|||
err = p.callWithRetry(&cc, func() error {
|
||||
var err error
|
||||
|
||||
res.r, err = cc.client.ObjectSearchInit(ctx, prm)
|
||||
res.r, err = cc.client.ObjectSearchInit(ctx, cliPrm)
|
||||
if err != nil {
|
||||
return fmt.Errorf("init object searching on client: %w", err)
|
||||
}
|
||||
|
@ -1092,17 +1248,16 @@ func (p *Pool) SearchObjects(ctx context.Context, idCnr cid.ID, filters object.S
|
|||
return &res, nil
|
||||
}
|
||||
|
||||
func (p *Pool) PutContainer(ctx context.Context, cnr *container.Container, opts ...CallOption) (*cid.ID, error) {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) PutContainer(ctx context.Context, prm PrmContainerPut) (*cid.ID, error) {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmContainerPut
|
||||
|
||||
if cnr != nil {
|
||||
cliPrm.SetContainer(*cnr)
|
||||
if prm.cnr != nil {
|
||||
cliPrm.SetContainer(*prm.cnr)
|
||||
}
|
||||
|
||||
res, err := cp.client.ContainerPut(ctx, cliPrm)
|
||||
|
@ -1113,17 +1268,16 @@ func (p *Pool) PutContainer(ctx context.Context, cnr *container.Container, opts
|
|||
return res.ID(), nil
|
||||
}
|
||||
|
||||
func (p *Pool) GetContainer(ctx context.Context, cid *cid.ID, opts ...CallOption) (*container.Container, error) {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) GetContainer(ctx context.Context, prm PrmContainerGet) (*container.Container, error) {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmContainerGet
|
||||
|
||||
if cid != nil {
|
||||
cliPrm.SetContainer(*cid)
|
||||
if prm.cnrID != nil {
|
||||
cliPrm.SetContainer(*prm.cnrID)
|
||||
}
|
||||
|
||||
res, err := cp.client.ContainerGet(ctx, cliPrm)
|
||||
|
@ -1134,17 +1288,16 @@ func (p *Pool) GetContainer(ctx context.Context, cid *cid.ID, opts ...CallOption
|
|||
return res.Container(), nil
|
||||
}
|
||||
|
||||
func (p *Pool) ListContainers(ctx context.Context, ownerID *owner.ID, opts ...CallOption) ([]cid.ID, error) {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) ListContainers(ctx context.Context, prm PrmContainerList) ([]cid.ID, error) {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmContainerList
|
||||
|
||||
if ownerID != nil {
|
||||
cliPrm.SetAccount(*ownerID)
|
||||
if prm.ownerID != nil {
|
||||
cliPrm.SetAccount(*prm.ownerID)
|
||||
}
|
||||
|
||||
res, err := cp.client.ContainerList(ctx, cliPrm)
|
||||
|
@ -1155,21 +1308,20 @@ func (p *Pool) ListContainers(ctx context.Context, ownerID *owner.ID, opts ...Ca
|
|||
return res.Containers(), nil
|
||||
}
|
||||
|
||||
func (p *Pool) DeleteContainer(ctx context.Context, cid *cid.ID, opts ...CallOption) error {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) DeleteContainer(ctx context.Context, prm PrmContainerDelete) error {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmContainerDelete
|
||||
|
||||
if cid != nil {
|
||||
cliPrm.SetContainer(*cid)
|
||||
if prm.cnrID != nil {
|
||||
cliPrm.SetContainer(*prm.cnrID)
|
||||
}
|
||||
|
||||
if cfg.stoken != nil {
|
||||
cliPrm.SetSessionToken(*cfg.stoken)
|
||||
if prm.stoken != nil {
|
||||
cliPrm.SetSessionToken(*prm.stoken)
|
||||
}
|
||||
|
||||
_, err = cp.client.ContainerDelete(ctx, cliPrm)
|
||||
|
@ -1179,17 +1331,16 @@ func (p *Pool) DeleteContainer(ctx context.Context, cid *cid.ID, opts ...CallOpt
|
|||
return err
|
||||
}
|
||||
|
||||
func (p *Pool) GetEACL(ctx context.Context, cid *cid.ID, opts ...CallOption) (*eacl.Table, error) {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) GetEACL(ctx context.Context, prm PrmContainerEACL) (*eacl.Table, error) {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmContainerEACL
|
||||
|
||||
if cid != nil {
|
||||
cliPrm.SetContainer(*cid)
|
||||
if prm.cnrID != nil {
|
||||
cliPrm.SetContainer(*prm.cnrID)
|
||||
}
|
||||
|
||||
res, err := cp.client.ContainerEACL(ctx, cliPrm)
|
||||
|
@ -1200,17 +1351,16 @@ func (p *Pool) GetEACL(ctx context.Context, cid *cid.ID, opts ...CallOption) (*e
|
|||
return res.Table(), nil
|
||||
}
|
||||
|
||||
func (p *Pool) SetEACL(ctx context.Context, table *eacl.Table, opts ...CallOption) error {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) SetEACL(ctx context.Context, prm PrmContainerSetEACL) error {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmContainerSetEACL
|
||||
|
||||
if table != nil {
|
||||
cliPrm.SetTable(*table)
|
||||
if prm.table != nil {
|
||||
cliPrm.SetTable(*prm.table)
|
||||
}
|
||||
|
||||
_, err = cp.client.ContainerSetEACL(ctx, cliPrm)
|
||||
|
@ -1220,17 +1370,16 @@ func (p *Pool) SetEACL(ctx context.Context, table *eacl.Table, opts ...CallOptio
|
|||
return err
|
||||
}
|
||||
|
||||
func (p *Pool) Balance(ctx context.Context, o *owner.ID, opts ...CallOption) (*accounting.Decimal, error) {
|
||||
cfg := cfgFromOpts(opts...)
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
func (p *Pool) Balance(ctx context.Context, prm PrmBalanceGet) (*accounting.Decimal, error) {
|
||||
cp, err := p.conn(ctx, prm.prmCommon)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cliPrm client.PrmBalanceGet
|
||||
|
||||
if o != nil {
|
||||
cliPrm.SetAccount(*o)
|
||||
if prm.ownerID != nil {
|
||||
cliPrm.SetAccount(*prm.ownerID)
|
||||
}
|
||||
|
||||
res, err := cp.client.BalanceGet(ctx, cliPrm)
|
||||
|
|
|
@ -351,7 +351,10 @@ func TestSessionCache(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Contains(t, tokens, st)
|
||||
|
||||
_, err = pool.GetObject(ctx, address.Address{})
|
||||
var prm PrmObjectGet
|
||||
prm.SetAddress(address.Address{})
|
||||
|
||||
_, err = pool.GetObject(ctx, prm)
|
||||
require.Error(t, err)
|
||||
|
||||
// cache must not contain session token
|
||||
|
@ -359,7 +362,10 @@ func TestSessionCache(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Nil(t, st)
|
||||
|
||||
_, err = pool.PutObject(ctx, object.Object{}, nil)
|
||||
var prm2 PrmObjectPut
|
||||
prm2.SetHeader(object.Object{})
|
||||
|
||||
_, err = pool.PutObject(ctx, prm2)
|
||||
require.NoError(t, err)
|
||||
|
||||
// cache must contain session token
|
||||
|
@ -477,7 +483,11 @@ func TestSessionCacheWithKey(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Contains(t, tokens, st)
|
||||
|
||||
_, err = pool.GetObject(ctx, address.Address{}, WithKey(newPrivateKey(t)))
|
||||
var prm PrmObjectGet
|
||||
prm.SetAddress(address.Address{})
|
||||
prm.UseKey(newPrivateKey(t))
|
||||
|
||||
_, err = pool.GetObject(ctx, prm)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, tokens, 2)
|
||||
}
|
||||
|
@ -519,8 +529,10 @@ func TestSessionTokenOwner(t *testing.T) {
|
|||
anonKey := newPrivateKey(t)
|
||||
anonOwner := owner.NewIDFromPublicKey(&anonKey.PublicKey)
|
||||
|
||||
cfg := cfgFromOpts(WithKey(anonKey), useDefaultSession())
|
||||
cp, err := p.conn(ctx, cfg)
|
||||
var prm prmCommon
|
||||
prm.UseKey(anonKey)
|
||||
prm.useDefaultSession()
|
||||
cp, err := p.conn(ctx, prm)
|
||||
require.NoError(t, err)
|
||||
|
||||
tkn := p.cache.Get(formCacheKey(cp.address, anonKey))
|
||||
|
|
Loading…
Reference in a new issue