69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
package net
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/netip"
|
|
"slices"
|
|
"time"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/metrics"
|
|
"git.frostfs.info/TrueCloudLab/multinet"
|
|
)
|
|
|
|
var errEmptySourceIPList = errors.New("empty source IP list")
|
|
|
|
type Subnet struct {
|
|
Prefix string
|
|
SourceIPs []string
|
|
}
|
|
|
|
type Config struct {
|
|
Enabled bool
|
|
Subnets []Subnet
|
|
Balancer string
|
|
Restrict bool
|
|
FallbackDelay time.Duration
|
|
Metrics metrics.MultinetMetrics
|
|
}
|
|
|
|
func (c Config) toMultinetConfig() (multinet.Config, error) {
|
|
var subnets []multinet.Subnet
|
|
for _, s := range c.Subnets {
|
|
var ms multinet.Subnet
|
|
p, err := netip.ParsePrefix(s.Prefix)
|
|
if err != nil {
|
|
return multinet.Config{}, fmt.Errorf("parse IP prefix '%s': %w", s.Prefix, err)
|
|
}
|
|
ms.Prefix = p
|
|
for _, ip := range s.SourceIPs {
|
|
addr, err := netip.ParseAddr(ip)
|
|
if err != nil {
|
|
return multinet.Config{}, fmt.Errorf("parse IP address '%s': %w", ip, err)
|
|
}
|
|
ms.SourceIPs = append(ms.SourceIPs, addr)
|
|
}
|
|
if len(ms.SourceIPs) == 0 {
|
|
return multinet.Config{}, errEmptySourceIPList
|
|
}
|
|
subnets = append(subnets, ms)
|
|
}
|
|
return multinet.Config{
|
|
Subnets: subnets,
|
|
Balancer: multinet.BalancerType(c.Balancer),
|
|
Restrict: c.Restrict,
|
|
FallbackDelay: c.FallbackDelay,
|
|
Dialer: newDefaulDialer(),
|
|
EventHandler: newEventHandler(c.Metrics),
|
|
}, nil
|
|
}
|
|
|
|
func (c Config) equals(other Config) bool {
|
|
return c.Enabled == other.Enabled &&
|
|
slices.EqualFunc(c.Subnets, other.Subnets, func(lhs, rhs Subnet) bool {
|
|
return lhs.Prefix == rhs.Prefix && slices.Equal(lhs.SourceIPs, rhs.SourceIPs)
|
|
}) &&
|
|
c.Balancer == other.Balancer &&
|
|
c.Restrict == other.Restrict &&
|
|
c.FallbackDelay == other.FallbackDelay
|
|
}
|