From 99d380c20b6bb92f9a949114715ed1344ff95a98 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Tue, 22 Sep 2020 11:38:23 +0300 Subject: [PATCH] [#35] Implement netmap source interface in morph wrapper Netmap source interface used by object service to build placement based on current or previous network map. Signed-off-by: Alex Vanin --- pkg/morph/client/netmap/wrapper/netmap.go | 43 +++++++++++++++++++---- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/pkg/morph/client/netmap/wrapper/netmap.go b/pkg/morph/client/netmap/wrapper/netmap.go index 42b1f6acd1..8e044153b4 100644 --- a/pkg/morph/client/netmap/wrapper/netmap.go +++ b/pkg/morph/client/netmap/wrapper/netmap.go @@ -1,12 +1,43 @@ package wrapper -// NetMap represents the NeoFS network map. -// FIXME: correct the definition. -type NetMap struct{} +import ( + "github.com/nspcc-dev/neofs-api-go/pkg/netmap" + v2netmap "github.com/nspcc-dev/neofs-api-go/v2/netmap" + grpcNetmap "github.com/nspcc-dev/neofs-api-go/v2/netmap/grpc" + client "github.com/nspcc-dev/neofs-node/pkg/morph/client/netmap" + "github.com/pkg/errors" +) // GetNetMap receives information list about storage nodes // through the Netmap contract call, composes network map -// from them and returns it. -func (w *Wrapper) GetNetMap() (*NetMap, error) { - panic("implement me") +// from them and returns it. With diff == 0 returns current +// network map, else return snapshot of previous network map. +func (w Wrapper) GetNetMap(diff uint64) (*netmap.Netmap, error) { + args := client.GetSnapshotArgs{} + args.SetDiff(diff) + + peers, err := w.client.Snapshot(args) + if err != nil { + return nil, err + } + + rawPeers := peers.Peers() // slice of serialized node infos + infos := make([]v2netmap.NodeInfo, 0, len(rawPeers)) + + for _, peer := range rawPeers { + grpcNodeInfo := new(grpcNetmap.NodeInfo) // transport representation of struct + err = grpcNodeInfo.Unmarshal(peer) + if err != nil { + // consider unmarshalling into different major versions + // of NodeInfo structure, if there any + return nil, errors.Wrap(err, "can't unmarshal peer info") + } + + v2 := v2netmap.NodeInfoFromGRPCMessage(grpcNodeInfo) + infos = append(infos, *v2) + } + + nodes := netmap.NodesFromV2(infos) + + return netmap.NewNetmap(nodes) }