2020-07-24 13:54:03 +00:00
|
|
|
package wrapper
|
|
|
|
|
2020-09-22 08:38:23 +00:00
|
|
|
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"
|
2020-10-20 10:50:35 +00:00
|
|
|
"google.golang.org/protobuf/proto"
|
2020-09-22 08:38:23 +00:00
|
|
|
)
|
2020-07-24 13:54:03 +00:00
|
|
|
|
|
|
|
// GetNetMap receives information list about storage nodes
|
|
|
|
// through the Netmap contract call, composes network map
|
2020-09-22 08:38:23 +00:00
|
|
|
// 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
|
2020-10-20 10:50:35 +00:00
|
|
|
err = proto.Unmarshal(peer, grpcNodeInfo)
|
2020-09-22 08:38:23 +00:00
|
|
|
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)
|
2020-07-24 13:54:03 +00:00
|
|
|
}
|