From af33dd65b288b86349d1a4638feca6d5a04b5b39 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Fri, 12 Nov 2021 18:14:55 +0300 Subject: [PATCH] [#971] morph/container: Add optional parameters Add optional parameters to the client call signature. Signed-off-by: Pavel Karpy --- pkg/morph/client/container/delete.go | 3 + pkg/morph/client/container/eacl_set.go | 3 + pkg/morph/client/container/estimations.go | 7 + pkg/morph/client/container/load.go | 3 + pkg/morph/client/container/put.go | 3 + .../client/container/wrapper/container.go | 138 +++++++++++++++--- pkg/morph/client/container/wrapper/eacl.go | 52 ++++++- .../client/container/wrapper/estimations.go | 35 ++++- 8 files changed, 214 insertions(+), 30 deletions(-) diff --git a/pkg/morph/client/container/delete.go b/pkg/morph/client/container/delete.go index 429251e3d..3606a626a 100644 --- a/pkg/morph/client/container/delete.go +++ b/pkg/morph/client/container/delete.go @@ -14,6 +14,8 @@ type DeleteArgs struct { sig []byte // container identifier signature token []byte // binary session token + + client.InvokePrmOptional } // SetCID sets the container identifier @@ -42,6 +44,7 @@ func (c *Client) Delete(args DeleteArgs) error { prm.SetMethod(c.deleteMethod) prm.SetArgs(args.cid, args.sig, args.token) + prm.InvokePrmOptional = args.InvokePrmOptional err := c.client.Invoke(prm) diff --git a/pkg/morph/client/container/eacl_set.go b/pkg/morph/client/container/eacl_set.go index c9929d794..6412f95ae 100644 --- a/pkg/morph/client/container/eacl_set.go +++ b/pkg/morph/client/container/eacl_set.go @@ -16,6 +16,8 @@ type SetEACLArgs struct { pubkey []byte // binary public key token []byte // binary session token + + client.InvokePrmOptional } // SetEACL sets the extended ACL table @@ -50,6 +52,7 @@ func (c *Client) SetEACL(args SetEACLArgs) error { prm.SetMethod(c.setEACLMethod) prm.SetArgs(args.eacl, args.sig, args.pubkey, args.token) + prm.InvokePrmOptional = args.InvokePrmOptional err := c.client.Invoke(prm) diff --git a/pkg/morph/client/container/estimations.go b/pkg/morph/client/container/estimations.go index 9681cbed1..69deee226 100644 --- a/pkg/morph/client/container/estimations.go +++ b/pkg/morph/client/container/estimations.go @@ -6,8 +6,11 @@ import ( "github.com/nspcc-dev/neofs-node/pkg/morph/client" ) +// StartEstimation groups parameters of StartEstimation operation. type StartEstimation struct { epoch int64 + + client.InvokePrmOptional } func (e *StartEstimation) SetEpoch(v int64) { @@ -16,6 +19,8 @@ func (e *StartEstimation) SetEpoch(v int64) { type StopEstimation struct { epoch int64 + + client.InvokePrmOptional } func (e *StopEstimation) SetEpoch(v int64) { @@ -27,6 +32,7 @@ func (c *Client) StartEstimation(args StartEstimation) error { prm.SetMethod(c.startEstimation) prm.SetArgs(args.epoch) + prm.InvokePrmOptional = args.InvokePrmOptional if err := c.client.Invoke(prm); err != nil { return fmt.Errorf("could not invoke method (%s): %w", c.startEstimation, err) @@ -39,6 +45,7 @@ func (c *Client) StopEstimation(args StopEstimation) error { prm.SetMethod(c.stopEstimation) prm.SetArgs(args.epoch) + prm.InvokePrmOptional = args.InvokePrmOptional if err := c.client.Invoke(prm); err != nil { return fmt.Errorf("could not invoke method (%s): %w", c.stopEstimation, err) diff --git a/pkg/morph/client/container/load.go b/pkg/morph/client/container/load.go index 7a9d18623..8b0bdbcf7 100644 --- a/pkg/morph/client/container/load.go +++ b/pkg/morph/client/container/load.go @@ -16,6 +16,8 @@ type PutSizeArgs struct { cid []byte reporterKey []byte + + client.InvokePrmOptional } // SetEpoch sets the number of the epoch when @@ -48,6 +50,7 @@ func (c *Client) PutSize(args PutSizeArgs) error { prm.SetMethod(c.putSizeMethod) prm.SetArgs(args.epoch, args.cid, args.size, args.reporterKey) + prm.InvokePrmOptional = args.InvokePrmOptional err := c.client.Invoke(prm) diff --git a/pkg/morph/client/container/put.go b/pkg/morph/client/container/put.go index cd89e89bd..9f4f0faeb 100644 --- a/pkg/morph/client/container/put.go +++ b/pkg/morph/client/container/put.go @@ -18,6 +18,8 @@ type PutArgs struct { token []byte // binary session token name, zone string // native name and zone + + client.InvokePrmOptional } // SetPublicKey sets the public key of container owner @@ -69,6 +71,7 @@ func (c *Client) Put(args PutArgs) error { } prm.SetMethod(method) + prm.InvokePrmOptional = args.InvokePrmOptional err := c.client.Invoke(prm) if err != nil { diff --git a/pkg/morph/client/container/wrapper/container.go b/pkg/morph/client/container/wrapper/container.go index f14131cc0..806c2c963 100644 --- a/pkg/morph/client/container/wrapper/container.go +++ b/pkg/morph/client/container/wrapper/container.go @@ -7,6 +7,7 @@ import ( v2refs "github.com/nspcc-dev/neofs-api-go/v2/refs" core "github.com/nspcc-dev/neofs-node/pkg/core/container" + staticli "github.com/nspcc-dev/neofs-node/pkg/morph/client" client "github.com/nspcc-dev/neofs-node/pkg/morph/client/container" "github.com/nspcc-dev/neofs-sdk-go/container" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" @@ -43,7 +44,14 @@ func Put(w *Wrapper, cnr *container.Container) (*cid.ID, error) { name, zone := container.GetNativeNameWithZone(cnr) - err = w.Put(data, sig.Key(), sig.Sign(), binToken, name, zone) + err = w.Put(PutPrm{ + cnr: data, + key: sig.Key(), + sig: sig.Sign(), + token: binToken, + name: name, + zone: zone, + }) if err != nil { return nil, err } @@ -54,6 +62,48 @@ func Put(w *Wrapper, cnr *container.Container) (*cid.ID, error) { return id, nil } +// PutPrm groups parameters of Put operation. +type PutPrm struct { + cnr []byte + key []byte + sig []byte + token []byte + name string + zone string + + staticli.InvokePrmOptional +} + +// SetContainer sets container data. +func (p *PutPrm) SetContainer(cnr []byte) { + p.cnr = cnr +} + +// SetKey sets public key. +func (p *PutPrm) SetKey(key []byte) { + p.key = key +} + +// SetSignature sets signature. +func (p *PutPrm) SetSignature(sig []byte) { + p.sig = sig +} + +// SetToken sets session token. +func (p *PutPrm) SetToken(token []byte) { + p.token = token +} + +// SetName sets native name. +func (p *PutPrm) SetName(name string) { + p.name = name +} + +// SetZone sets zone. +func (p *PutPrm) SetZone(zone string) { + p.zone = zone +} + // Put saves binary container with its session token, key and signature // in NeoFS system through Container contract call. // @@ -61,18 +111,19 @@ func Put(w *Wrapper, cnr *container.Container) (*cid.ID, error) { // encountered that caused the saving to interrupt. // // If TryNotary is provided, calls notary contract. -func (w *Wrapper) Put(cnr, key, sig, token []byte, name, zone string) error { - if len(sig) == 0 || len(key) == 0 { +func (w *Wrapper) Put(prm PutPrm) error { + if len(prm.sig) == 0 || len(prm.key) == 0 { return errNilArgument } var args client.PutArgs - args.SetContainer(cnr) - args.SetSignature(sig) - args.SetPublicKey(key) - args.SetSessionToken(token) - args.SetNativeNameWithZone(name, zone) + args.SetContainer(prm.cnr) + args.SetSignature(prm.sig) + args.SetPublicKey(prm.key) + args.SetSessionToken(prm.token) + args.SetNativeNameWithZone(prm.name, prm.zone) + args.InvokePrmOptional = prm.InvokePrmOptional err := w.client.Put(args) if err != nil { @@ -167,7 +218,36 @@ func Delete(w *Wrapper, witness core.RemovalWitness) error { return fmt.Errorf("could not marshal session token: %w", err) } - return w.Delete(id.ToV2().GetValue(), witness.Signature(), binToken) + return w.Delete( + DeletePrm{ + cid: id.ToV2().GetValue(), + signature: witness.Signature(), + token: binToken, + }) +} + +// DeletePrm groups parameters of Delete client operation. +type DeletePrm struct { + cid []byte + signature []byte + token []byte + + staticli.InvokePrmOptional +} + +// SetCID sets container ID. +func (d *DeletePrm) SetCID(cid []byte) { + d.cid = cid +} + +// SetSignature sets signature. +func (d *DeletePrm) SetSignature(signature []byte) { + d.signature = signature +} + +// SetToken sets session token. +func (d *DeletePrm) SetToken(token []byte) { + d.token = token } // Delete removes the container from NeoFS system @@ -177,16 +257,17 @@ func Delete(w *Wrapper, witness core.RemovalWitness) error { // the removal to interrupt. // // If TryNotary is provided, calls notary contract. -func (w *Wrapper) Delete(cid, signature, token []byte) error { - if len(signature) == 0 { +func (w *Wrapper) Delete(prm DeletePrm) error { + if len(prm.signature) == 0 { return errNilArgument } var args client.DeleteArgs - args.SetSignature(signature) - args.SetCID(cid) - args.SetSessionToken(token) + args.SetSignature(prm.signature) + args.SetCID(prm.cid) + args.SetSessionToken(prm.token) + args.InvokePrmOptional = prm.InvokePrmOptional return w.client.Delete(args) } @@ -229,21 +310,40 @@ func (w *Wrapper) List(ownerID *owner.ID) ([]*cid.ID, error) { return result, nil } +// AnnounceLoadPrm groups parameters of AnnounceLoad operation. +type AnnounceLoadPrm struct { + a container.UsedSpaceAnnouncement + key []byte + + staticli.InvokePrmOptional +} + +// SetAnnouncement sets announcement. +func (a2 *AnnounceLoadPrm) SetAnnouncement(a container.UsedSpaceAnnouncement) { + a2.a = a +} + +// SetReporter sets public key of the reporter. +func (a2 *AnnounceLoadPrm) SetReporter(key []byte) { + a2.key = key +} + // AnnounceLoad saves container size estimation calculated by storage node // with key in NeoFS system through Container contract call. // // Returns any error encountered that caused the saving to interrupt. -func (w *Wrapper) AnnounceLoad(a container.UsedSpaceAnnouncement, key []byte) error { - v2 := a.ContainerID().ToV2() +func (w *Wrapper) AnnounceLoad(prm AnnounceLoadPrm) error { + v2 := prm.a.ContainerID().ToV2() if v2 == nil { return errUnsupported // use other major version if there any } args := client.PutSizeArgs{} args.SetContainerID(v2.GetValue()) - args.SetEpoch(a.Epoch()) - args.SetSize(a.UsedSpace()) - args.SetReporterKey(key) + args.SetEpoch(prm.a.Epoch()) + args.SetSize(prm.a.UsedSpace()) + args.SetReporterKey(prm.key) + args.InvokePrmOptional = prm.InvokePrmOptional return w.client.PutSize(args) } diff --git a/pkg/morph/client/container/wrapper/eacl.go b/pkg/morph/client/container/wrapper/eacl.go index 7d09e0501..d2f80562c 100644 --- a/pkg/morph/client/container/wrapper/eacl.go +++ b/pkg/morph/client/container/wrapper/eacl.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/nspcc-dev/neofs-node/pkg/core/container" + staticli "github.com/nspcc-dev/neofs-node/pkg/morph/client" client "github.com/nspcc-dev/neofs-node/pkg/morph/client/container" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" "github.com/nspcc-dev/neofs-sdk-go/eacl" @@ -90,23 +91,60 @@ func PutEACL(w *Wrapper, table *eacl.Table) error { sig := table.Signature() - return w.PutEACL(data, sig.Key(), sig.Sign(), binToken) + return w.PutEACL( + PutEACLPrm{ + table: data, + key: sig.Key(), + sig: sig.Sign(), + token: binToken, + }) +} + +// PutEACLPrm groups parameters of PutEACL operation. +type PutEACLPrm struct { + table []byte + key []byte + sig []byte + token []byte + + staticli.InvokePrmOptional +} + +// SetTable sets table. +func (p *PutEACLPrm) SetTable(table []byte) { + p.table = table +} + +// SetKey sets key. +func (p *PutEACLPrm) SetKey(key []byte) { + p.key = key +} + +// SetSignature sets signature. +func (p *PutEACLPrm) SetSignature(sig []byte) { + p.sig = sig +} + +// SetToken sets session token. +func (p *PutEACLPrm) SetToken(token []byte) { + p.token = token } // PutEACL saves binary eACL table with its session token, key and signature // in NeoFS system through Container contract call. // // Returns any error encountered that caused the saving to interrupt. -func (w *Wrapper) PutEACL(table, key, sig, token []byte) error { - if len(sig) == 0 || len(key) == 0 { +func (w *Wrapper) PutEACL(prm PutEACLPrm) error { + if len(prm.sig) == 0 || len(prm.key) == 0 { return errNilArgument } args := client.SetEACLArgs{} - args.SetSignature(sig) - args.SetPublicKey(key) - args.SetEACL(table) - args.SetSessionToken(token) + args.SetSignature(prm.sig) + args.SetPublicKey(prm.key) + args.SetEACL(prm.table) + args.SetSessionToken(prm.token) + args.InvokePrmOptional = prm.InvokePrmOptional return w.client.SetEACL(args) } diff --git a/pkg/morph/client/container/wrapper/estimations.go b/pkg/morph/client/container/wrapper/estimations.go index 49785992e..a606a2fee 100644 --- a/pkg/morph/client/container/wrapper/estimations.go +++ b/pkg/morph/client/container/wrapper/estimations.go @@ -1,21 +1,48 @@ package wrapper import ( + "github.com/nspcc-dev/neofs-node/pkg/morph/client" "github.com/nspcc-dev/neofs-node/pkg/morph/client/container" ) +// StartEstimationPrm groups parameters of StartEstimation operation. +type StartEstimationPrm struct { + epoch uint64 + + client.InvokePrmOptional +} + +// SetEpoch sets epoch. +func (s *StartEstimationPrm) SetEpoch(epoch uint64) { + s.epoch = epoch +} + // StartEstimation votes to produce start estimation notification. -func (w *Wrapper) StartEstimation(epoch uint64) error { +func (w *Wrapper) StartEstimation(prm StartEstimationPrm) error { args := container.StartEstimation{} - args.SetEpoch(int64(epoch)) + args.SetEpoch(int64(prm.epoch)) + args.InvokePrmOptional = prm.InvokePrmOptional return w.client.StartEstimation(args) } +// StopEstimationPrm groups parameters of StopEstimation operation. +type StopEstimationPrm struct { + epoch uint64 + + client.InvokePrmOptional +} + +// SetEpoch sets epoch. +func (s *StopEstimationPrm) SetEpoch(epoch uint64) { + s.epoch = epoch +} + // StopEstimation votes to produce stop estimation notification. -func (w *Wrapper) StopEstimation(epoch uint64) error { +func (w *Wrapper) StopEstimation(prm StopEstimationPrm) error { args := container.StopEstimation{} - args.SetEpoch(int64(epoch)) + args.SetEpoch(int64(prm.epoch)) + args.InvokePrmOptional = prm.InvokePrmOptional return w.client.StopEstimation(args) }