forked from TrueCloudLab/frostfs-api-go
[#129] v2: Add unified structure for NodeInfo
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
ac0d57cc9b
commit
edd0004b93
4 changed files with 335 additions and 0 deletions
|
@ -21,3 +21,73 @@ func PlacementPolicyFromGRPCMessage(m *netmap.PlacementPolicy) *PlacementPolicy
|
||||||
// TODO: fill me
|
// TODO: fill me
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AttributeToGRPCMessage(a *Attribute) *netmap.NodeInfo_Attribute {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
m := new(netmap.NodeInfo_Attribute)
|
||||||
|
|
||||||
|
m.SetKey(a.GetKey())
|
||||||
|
m.SetValue(a.GetValue())
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func AttributeFromGRPCMessage(m *netmap.NodeInfo_Attribute) *Attribute {
|
||||||
|
if m == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
a := new(Attribute)
|
||||||
|
|
||||||
|
a.SetKey(m.GetKey())
|
||||||
|
a.SetValue(m.GetValue())
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func NodeInfoToGRPCMessage(n *NodeInfo) *netmap.NodeInfo {
|
||||||
|
if n == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
m := new(netmap.NodeInfo)
|
||||||
|
|
||||||
|
m.SetPublicKey(n.GetPublicKey())
|
||||||
|
m.SetAddress(n.GetAddress())
|
||||||
|
|
||||||
|
attr := n.GetAttributes()
|
||||||
|
attrMsg := make([]*netmap.NodeInfo_Attribute, 0, len(attr))
|
||||||
|
|
||||||
|
for i := range attr {
|
||||||
|
attrMsg = append(attrMsg, AttributeToGRPCMessage(attr[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.SetAttributes(attrMsg)
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func NodeInfoFromGRPCMessage(m *netmap.NodeInfo) *NodeInfo {
|
||||||
|
if m == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
a := new(NodeInfo)
|
||||||
|
|
||||||
|
a.SetPublicKey(m.GetPublicKey())
|
||||||
|
a.SetAddress(m.GetAddress())
|
||||||
|
|
||||||
|
attrMsg := m.GetAttributes()
|
||||||
|
attr := make([]*Attribute, 0, len(attrMsg))
|
||||||
|
|
||||||
|
for i := range attrMsg {
|
||||||
|
attr = append(attr, AttributeFromGRPCMessage(attrMsg[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
a.SetAttributes(attr)
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,18 @@
|
||||||
package netmap
|
package netmap
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neofs-api-go/util/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
keyAttributeField = 1
|
||||||
|
valueAttributeField = 2
|
||||||
|
|
||||||
|
keyNodeInfoField = 1
|
||||||
|
addressNodeInfoField = 2
|
||||||
|
attributesNodeInfoField = 3
|
||||||
|
)
|
||||||
|
|
||||||
func (p *PlacementPolicy) StableMarshal(buf []byte) ([]byte, error) {
|
func (p *PlacementPolicy) StableMarshal(buf []byte) ([]byte, error) {
|
||||||
// todo: implement me
|
// todo: implement me
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -9,3 +22,97 @@ func (p *PlacementPolicy) StableSize() (size int) {
|
||||||
// todo: implement me
|
// todo: implement me
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *Attribute) StableMarshal(buf []byte) ([]byte, error) {
|
||||||
|
if a == nil {
|
||||||
|
return []byte{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, a.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
offset, n int
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
n, err = proto.StringMarshal(keyAttributeField, buf[offset:], a.key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += n
|
||||||
|
|
||||||
|
n, err = proto.StringMarshal(valueAttributeField, buf[offset:], a.value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Attribute) StableSize() (size int) {
|
||||||
|
if a == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.StringSize(keyAttributeField, a.key)
|
||||||
|
size += proto.StringSize(valueAttributeField, a.value)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) StableMarshal(buf []byte) ([]byte, error) {
|
||||||
|
if ni == nil {
|
||||||
|
return []byte{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, ni.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
offset, n int
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
n, err = proto.BytesMarshal(keyNodeInfoField, buf[offset:], ni.publicKey)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += n
|
||||||
|
|
||||||
|
n, err = proto.StringMarshal(addressNodeInfoField, buf[offset:], ni.address)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += n
|
||||||
|
|
||||||
|
for i := range ni.attributes {
|
||||||
|
n, err = proto.NestedStructureMarshal(attributesNodeInfoField, buf[offset:], ni.attributes[i])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += n
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) StableSize() (size int) {
|
||||||
|
if ni == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.BytesSize(keyNodeInfoField, ni.publicKey)
|
||||||
|
size += proto.StringSize(addressNodeInfoField, ni.address)
|
||||||
|
for i := range ni.attributes {
|
||||||
|
size += proto.NestedStructureSize(attributesNodeInfoField, ni.attributes[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
66
v2/netmap/marshal_test.go
Normal file
66
v2/netmap/marshal_test.go
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
package netmap_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
||||||
|
grpc "github.com/nspcc-dev/neofs-api-go/v2/netmap/grpc"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAttribute_StableMarshal(t *testing.T) {
|
||||||
|
from := generateAttribute("key", "value")
|
||||||
|
transport := new(grpc.NodeInfo_Attribute)
|
||||||
|
|
||||||
|
t.Run("non empty", func(t *testing.T) {
|
||||||
|
wire, err := from.StableMarshal(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = transport.Unmarshal(wire)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
to := netmap.AttributeFromGRPCMessage(transport)
|
||||||
|
require.Equal(t, from, to)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNodeInfo(t *testing.T) {
|
||||||
|
from := generateNodeInfo("publicKey", "/multi/addr", 10)
|
||||||
|
transport := new(grpc.NodeInfo)
|
||||||
|
|
||||||
|
t.Run("non empty", func(t *testing.T) {
|
||||||
|
wire, err := from.StableMarshal(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = transport.Unmarshal(wire)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
to := netmap.NodeInfoFromGRPCMessage(transport)
|
||||||
|
require.Equal(t, from, to)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateAttribute(k, v string) *netmap.Attribute {
|
||||||
|
attr := new(netmap.Attribute)
|
||||||
|
attr.SetKey(k)
|
||||||
|
attr.SetValue(v)
|
||||||
|
|
||||||
|
return attr
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateNodeInfo(key, addr string, n int) *netmap.NodeInfo {
|
||||||
|
nodeInfo := new(netmap.NodeInfo)
|
||||||
|
nodeInfo.SetPublicKey([]byte(key))
|
||||||
|
nodeInfo.SetAddress(addr)
|
||||||
|
|
||||||
|
attrs := make([]*netmap.Attribute, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
j := strconv.Itoa(n)
|
||||||
|
attrs[i] = generateAttribute("key"+j, "value"+j)
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeInfo.SetAttributes(attrs)
|
||||||
|
|
||||||
|
return nodeInfo
|
||||||
|
}
|
|
@ -3,3 +3,95 @@ package netmap
|
||||||
type PlacementPolicy struct {
|
type PlacementPolicy struct {
|
||||||
// TODO: fill me
|
// TODO: fill me
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attribute of storage node.
|
||||||
|
type Attribute struct {
|
||||||
|
key string
|
||||||
|
value string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeInfo of storage node.
|
||||||
|
type NodeInfo struct {
|
||||||
|
publicKey []byte
|
||||||
|
address string
|
||||||
|
attributes []*Attribute
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeState of storage node.
|
||||||
|
type NodeState uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
Unspecified NodeState = iota
|
||||||
|
Online
|
||||||
|
Offline
|
||||||
|
)
|
||||||
|
|
||||||
|
func (a *Attribute) GetKey() string {
|
||||||
|
if a != nil {
|
||||||
|
return a.key
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Attribute) SetKey(v string) {
|
||||||
|
if a != nil {
|
||||||
|
a.key = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Attribute) GetValue() string {
|
||||||
|
if a != nil {
|
||||||
|
return a.value
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Attribute) SetValue(v string) {
|
||||||
|
if a != nil {
|
||||||
|
a.value = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) GetPublicKey() []byte {
|
||||||
|
if ni != nil {
|
||||||
|
return ni.publicKey
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) SetPublicKey(v []byte) {
|
||||||
|
if ni != nil {
|
||||||
|
ni.publicKey = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) GetAddress() string {
|
||||||
|
if ni != nil {
|
||||||
|
return ni.address
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) SetAddress(v string) {
|
||||||
|
if ni != nil {
|
||||||
|
ni.address = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) GetAttributes() []*Attribute {
|
||||||
|
if ni != nil {
|
||||||
|
return ni.attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ni *NodeInfo) SetAttributes(v []*Attribute) {
|
||||||
|
if ni != nil {
|
||||||
|
ni.attributes = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue