[#607] network: Implement AddressGroup type

Define `network.AddressGroup` type which represents group of network
addresses. This type is going to be used to support group-address of the
storage node.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2021-06-21 13:32:48 +03:00 committed by Leonard Lyubich
parent 6d4154bce6
commit 5e4208648a

105
pkg/network/group.go Normal file
View file

@ -0,0 +1,105 @@
package network
import (
"errors"
"github.com/nspcc-dev/neofs-api-go/pkg/netmap"
)
// AddressGroup represents list of network addresses of the node.
//
// List is sorted by priority of use.
type AddressGroup []Address
// IterateAddresses iterates over all network addresses of the node.
//
// Breaks iterating on handler's true return.
//
// Handler should not be nil.
func (x AddressGroup) IterateAddresses(f func(Address) bool) {
for i := range x {
if f(x[i]) {
break
}
}
}
// MultiAddressIterator is an interface of network address group.
type MultiAddressIterator interface {
// Must iterate over network addresses and pass each one
// to the handler until it returns true.
IterateAddresses(func(string) bool)
// Must return number of addresses in group.
NumberOfAddresses() int
}
// FromIterator forms AddressGroup from MultiAddressIterator structure.
//
// Returns an error in the absence of addresses or if any of the addresses are incorrect.
func (x *AddressGroup) FromIterator(iter MultiAddressIterator) (err error) {
as := *x
addrNum := iter.NumberOfAddresses()
if addrNum <= 0 {
err = errors.New("missing network addresses")
return
}
if cap(as) >= addrNum {
as = as[:0]
} else {
as = make(AddressGroup, 0, addrNum)
}
iter.IterateAddresses(func(s string) bool {
var a Address
err = a.FromString(s)
fail := err != nil
if !fail {
as = append(as, a)
}
return fail
})
if err == nil {
*x = as
}
return
}
// GroupFromAddress wraps single Address into AddressGroup.
//
// Deprecated: use AddressGroup.FromIterator method.
func GroupFromAddress(addr Address) AddressGroup {
return AddressGroup{addr}
}
// WriteToNodeInfo writes AddressGroup to netmap.NodeInfo structure.
func (x AddressGroup) WriteToNodeInfo(ni *netmap.NodeInfo) {
addrs := make([]string, len(x))
for i := range x {
addrs[i] = x[i].String()
}
ni.SetAddresses(addrs...)
}
// Intersects checks if two AddressGroup have
// at least one common address.
func (x AddressGroup) Intersects(x2 AddressGroup) bool {
for i := range x {
for j := range x2 {
if x[i].Equal(x2[j]) {
return true
}
}
}
return false
}