2020-08-18 13:48:58 +00:00
|
|
|
package netmap
|
|
|
|
|
2020-09-01 07:46:20 +00:00
|
|
|
import (
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/util/proto"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2020-09-04 10:05:56 +00:00
|
|
|
nameFilterField = 1
|
|
|
|
keyFilterField = 2
|
|
|
|
opFilterField = 3
|
|
|
|
valueFilterField = 4
|
|
|
|
filtersFilterField = 5
|
|
|
|
|
|
|
|
nameSelectorField = 1
|
|
|
|
countSelectorField = 2
|
|
|
|
attributeSelectorField = 3
|
|
|
|
filterSelectorField = 4
|
|
|
|
|
|
|
|
countReplicaField = 1
|
|
|
|
selectorReplicaField = 2
|
|
|
|
|
|
|
|
replicasPolicyField = 1
|
|
|
|
backupPolicyField = 2
|
|
|
|
selectorsPolicyField = 3
|
|
|
|
filtersPolicyField = 4
|
|
|
|
|
|
|
|
keyAttributeField = 1
|
|
|
|
valueAttributeField = 2
|
|
|
|
parentsAttributeField = 3
|
2020-09-01 07:46:20 +00:00
|
|
|
|
|
|
|
keyNodeInfoField = 1
|
|
|
|
addressNodeInfoField = 2
|
|
|
|
attributesNodeInfoField = 3
|
2020-09-04 10:05:56 +00:00
|
|
|
stateNodeInfoField = 4
|
2020-09-01 07:46:20 +00:00
|
|
|
)
|
|
|
|
|
2020-09-04 10:05:56 +00:00
|
|
|
func (f *Filter) StableMarshal(buf []byte) ([]byte, error) {
|
|
|
|
if f == nil {
|
|
|
|
return []byte{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if buf == nil {
|
|
|
|
buf = make([]byte, f.StableSize())
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
offset, n int
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(nameFilterField, buf[offset:], f.name)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(keyFilterField, buf[offset:], f.key)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.EnumMarshal(opFilterField, buf[offset:], int32(f.op))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(valueFilterField, buf[offset:], f.value)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
for i := range f.filters {
|
|
|
|
n, err = proto.NestedStructureMarshal(filtersFilterField, buf[offset:], f.filters[i])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
}
|
|
|
|
|
|
|
|
return buf, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *Filter) StableSize() (size int) {
|
|
|
|
size += proto.StringSize(nameFilterField, f.name)
|
|
|
|
size += proto.StringSize(keyFilterField, f.key)
|
|
|
|
size += proto.EnumSize(opFilterField, int32(f.op))
|
|
|
|
size += proto.StringSize(valueFilterField, f.value)
|
|
|
|
for i := range f.filters {
|
|
|
|
size += proto.NestedStructureSize(filtersFilterField, f.filters[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
return size
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Selector) StableMarshal(buf []byte) ([]byte, error) {
|
|
|
|
if s == nil {
|
|
|
|
return []byte{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if buf == nil {
|
|
|
|
buf = make([]byte, s.StableSize())
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
offset, n int
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(nameSelectorField, buf[offset:], s.name)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.UInt32Marshal(countSelectorField, buf[offset:], s.count)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(attributeSelectorField, buf[offset:], s.attribute)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(filterSelectorField, buf[offset:], s.filter)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return buf, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Selector) StableSize() (size int) {
|
|
|
|
size += proto.StringSize(nameSelectorField, s.name)
|
|
|
|
size += proto.UInt32Size(countSelectorField, s.count)
|
|
|
|
size += proto.StringSize(attributeSelectorField, s.attribute)
|
|
|
|
size += proto.StringSize(filterSelectorField, s.filter)
|
|
|
|
|
|
|
|
return size
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Replica) StableMarshal(buf []byte) ([]byte, error) {
|
|
|
|
if r == nil {
|
|
|
|
return []byte{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if buf == nil {
|
|
|
|
buf = make([]byte, r.StableSize())
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
offset, n int
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
n, err = proto.UInt32Marshal(countReplicaField, buf[offset:], r.count)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
n, err = proto.StringMarshal(selectorReplicaField, buf[offset:], r.selector)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return buf, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Replica) StableSize() (size int) {
|
|
|
|
size += proto.UInt32Size(countReplicaField, r.count)
|
|
|
|
size += proto.StringSize(selectorReplicaField, r.selector)
|
|
|
|
|
|
|
|
return size
|
|
|
|
}
|
|
|
|
|
2020-08-18 13:48:58 +00:00
|
|
|
func (p *PlacementPolicy) StableMarshal(buf []byte) ([]byte, error) {
|
2020-09-04 10:05:56 +00:00
|
|
|
if p == nil {
|
|
|
|
return []byte{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if buf == nil {
|
|
|
|
buf = make([]byte, p.StableSize())
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
offset, n int
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
for i := range p.replicas {
|
|
|
|
n, err = proto.NestedStructureMarshal(replicasPolicyField, buf[offset:], p.replicas[i])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
}
|
|
|
|
|
|
|
|
n, err = proto.UInt32Marshal(backupPolicyField, buf[offset:], p.backupFactor)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
|
|
|
|
for i := range p.selectors {
|
|
|
|
n, err = proto.NestedStructureMarshal(selectorsPolicyField, buf[offset:], p.selectors[i])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := range p.filters {
|
|
|
|
n, err = proto.NestedStructureMarshal(filtersPolicyField, buf[offset:], p.filters[i])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
}
|
|
|
|
|
|
|
|
return buf, nil
|
2020-08-18 13:48:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PlacementPolicy) StableSize() (size int) {
|
2020-09-04 10:05:56 +00:00
|
|
|
for i := range p.replicas {
|
|
|
|
size += proto.NestedStructureSize(replicasPolicyField, p.replicas[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
size += proto.UInt32Size(backupPolicyField, p.backupFactor)
|
|
|
|
|
|
|
|
for i := range p.selectors {
|
|
|
|
size += proto.NestedStructureSize(selectorsPolicyField, p.selectors[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := range p.filters {
|
|
|
|
size += proto.NestedStructureSize(filtersPolicyField, p.filters[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
return size
|
2020-08-18 13:48:58 +00:00
|
|
|
}
|
2020-09-01 07:46:20 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2020-09-04 10:05:56 +00:00
|
|
|
offset += n
|
|
|
|
|
|
|
|
for i := range a.parents {
|
|
|
|
n, err = proto.StringMarshal(parentsAttributeField, buf[offset:], a.parents[i])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += n
|
|
|
|
}
|
|
|
|
|
2020-09-01 07:46:20 +00:00
|
|
|
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)
|
|
|
|
|
2020-09-04 10:05:56 +00:00
|
|
|
for i := range a.parents {
|
|
|
|
size += proto.StringSize(parentsAttributeField, a.parents[i])
|
|
|
|
}
|
|
|
|
|
2020-09-01 07:46:20 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2020-09-04 10:05:56 +00:00
|
|
|
n, err = proto.EnumMarshal(stateNodeInfoField, buf[offset:], int32(ni.state))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2020-09-01 07:46:20 +00:00
|
|
|
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])
|
|
|
|
}
|
|
|
|
|
2020-09-04 10:05:56 +00:00
|
|
|
size += proto.EnumSize(stateNodeInfoField, int32(ni.state))
|
|
|
|
|
2020-09-01 07:46:20 +00:00
|
|
|
return size
|
|
|
|
}
|