From 83c27f6e8a44eaa58af5c00c76b0cc5a663a4e68 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Wed, 19 May 2021 19:32:25 +0300 Subject: [PATCH] [#505] morph/container: Change get container API Make `Get` method of the wrapper over Container contract's client to accept binary container ID. Create `Get` function similar to the previous `Get` variation. Use this function in Container service server in the place where `Get` method was used. Additionally implement `AsContainerSource` function which allows to simply compose container Source interface from the wrapper. Signed-off-by: Leonard Lyubich --- cmd/neofs-node/container.go | 6 ++-- pkg/innerring/innerring.go | 2 +- pkg/innerring/processors/audit/process.go | 3 +- .../processors/container/process_eacl.go | 3 +- .../client/container/wrapper/container.go | 36 ++++++++++++------- pkg/services/container/morph/executor.go | 2 +- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/cmd/neofs-node/container.go b/cmd/neofs-node/container.go index 7f7299596..23384a2cb 100644 --- a/cmd/neofs-node/container.go +++ b/cmd/neofs-node/container.go @@ -42,7 +42,9 @@ func initContainerService(c *cfg) { wrap, err := wrapper.NewFromMorph(c.cfgMorph.client, c.cfgContainer.scriptHash, 0) fatalOnErr(err) - c.cfgObject.cnrStorage = newCachedContainerStorage(wrap) // use RPC node as source of containers (with caching) + cnrSrc := wrapper.AsContainerSource(wrap) + + c.cfgObject.cnrStorage = newCachedContainerStorage(cnrSrc) // use RPC node as source of containers (with caching) c.cfgObject.cnrClient = wrap localMetrics := &localStorageLoad{ @@ -63,7 +65,7 @@ func initContainerService(c *cfg) { loadPlacementBuilder := &loadPlacementBuilder{ log: c.log, nmSrc: c.cfgNetmap.wrapper, - cnrSrc: wrap, + cnrSrc: cnrSrc, } routeBuilder := placementrouter.New(placementrouter.Prm{ diff --git a/pkg/innerring/innerring.go b/pkg/innerring/innerring.go index cc9455e0b..528e908f6 100644 --- a/pkg/innerring/innerring.go +++ b/pkg/innerring/innerring.go @@ -436,7 +436,7 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error settlementDeps := &settlementDeps{ globalConfig: globalConfig, log: server.log, - cnrSrc: cnrClient, + cnrSrc: cntWrapper.AsContainerSource(cnrClient), auditClient: server.auditClient, nmSrc: nmClient, clientCache: clientCache, diff --git a/pkg/innerring/processors/audit/process.go b/pkg/innerring/processors/audit/process.go index e4c3e9de0..7932594a5 100644 --- a/pkg/innerring/processors/audit/process.go +++ b/pkg/innerring/processors/audit/process.go @@ -7,6 +7,7 @@ import ( "github.com/nspcc-dev/neofs-api-go/pkg/container" "github.com/nspcc-dev/neofs-api-go/pkg/netmap" "github.com/nspcc-dev/neofs-api-go/pkg/object" + "github.com/nspcc-dev/neofs-node/pkg/morph/client/container/wrapper" "github.com/nspcc-dev/neofs-node/pkg/network" "github.com/nspcc-dev/neofs-node/pkg/services/audit" "github.com/nspcc-dev/neofs-node/pkg/services/object_manager/storagegroup" @@ -49,7 +50,7 @@ func (ap *Processor) processStartAudit(epoch uint64) { auditCtx, ap.prevAuditCanceler = context.WithCancel(context.Background()) for i := range containers { - cnr, err := ap.containerClient.Get(containers[i]) // get container structure + cnr, err := wrapper.Get(ap.containerClient, containers[i]) // get container structure if err != nil { log.Error("can't get container info, ignore", zap.Stringer("cid", containers[i]), diff --git a/pkg/innerring/processors/container/process_eacl.go b/pkg/innerring/processors/container/process_eacl.go index 5b3c797d1..590a4e0d6 100644 --- a/pkg/innerring/processors/container/process_eacl.go +++ b/pkg/innerring/processors/container/process_eacl.go @@ -8,6 +8,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neofs-api-go/pkg/acl/eacl" + "github.com/nspcc-dev/neofs-node/pkg/morph/client/container/wrapper" "github.com/nspcc-dev/neofs-node/pkg/morph/event/container" "go.uber.org/zap" ) @@ -58,7 +59,7 @@ func (cp *Processor) checkEACLOwnership(binTable []byte, key *keys.PublicKey) er } // receive owner of the related container - cnr, err := cp.cnrClient.Get(table.CID()) + cnr, err := wrapper.Get(cp.cnrClient, table.CID()) if err != nil { return fmt.Errorf("could not receive the container: %w", err) } diff --git a/pkg/morph/client/container/wrapper/container.go b/pkg/morph/client/container/wrapper/container.go index 019726ce6..e9c68cc63 100644 --- a/pkg/morph/client/container/wrapper/container.go +++ b/pkg/morph/client/container/wrapper/container.go @@ -67,24 +67,34 @@ func (w *Wrapper) Put(cnr, key, sig []byte) error { return nil } -// Get reads the container from NeoFS system by identifier +type containerSource Wrapper + +func (x *containerSource) Get(cid *container.ID) (*container.Container, error) { + return Get((*Wrapper)(x), cid) +} + +// AsContainerSource provides container Source interface +// from Wrapper instance. +func AsContainerSource(w *Wrapper) core.Source { + return (*containerSource)(w) +} + +// Get marshals container ID, and passes it to Wrapper's Get method. +// +// Returns error if cid is nil. +func Get(w *Wrapper, cid *container.ID) (*container.Container, error) { + return w.Get(cid.ToV2().GetValue()) +} + +// Get reads the container from NeoFS system by binary identifier // through Container contract call. // // If an empty slice is returned for the requested identifier, // storage.ErrNotFound error is returned. -func (w *Wrapper) Get(cid *container.ID) (*container.Container, error) { - if cid == nil { - return nil, errNilArgument - } +func (w *Wrapper) Get(cid []byte) (*container.Container, error) { + var args client.GetArgs - args := client.GetArgs{} - - v2 := cid.ToV2() - if v2 == nil { - return nil, errUnsupported // use other major version if there any - } - - args.SetCID(v2.GetValue()) + args.SetCID(cid) // ask RPC neo node to get serialized container rpcAnswer, err := w.client.Get(args) diff --git a/pkg/services/container/morph/executor.go b/pkg/services/container/morph/executor.go index e6801e028..aa483862c 100644 --- a/pkg/services/container/morph/executor.go +++ b/pkg/services/container/morph/executor.go @@ -58,7 +58,7 @@ func (s *morphExecutor) Delete(ctx context.Context, body *container.DeleteReques func (s *morphExecutor) Get(ctx context.Context, body *container.GetRequestBody) (*container.GetResponseBody, error) { cid := containerSDK.NewIDFromV2(body.GetContainerID()) - cnr, err := s.wrapper.Get(cid) + cnr, err := wrapper.Get(s.wrapper, cid) if err != nil { return nil, err }