Compare commits

..

1 Commits

Author SHA1 Message Date
amery fb54254f4e zones: introduce (private) logger interface
Signed-off-by: Alejandro Mery <amery@jpi.io>
2023-09-07 14:39:33 +00:00
8 changed files with 25 additions and 76 deletions
-16
View File
@@ -1,16 +0,0 @@
package zones
import "errors"
var (
// ErrInvalidName indicates the name isn't valid
ErrInvalidName = errors.New("invalid name")
// ErrUnknownNode indicates there is a reference to a node
// we don't have on the tree
ErrUnknownNode = errors.New("node does not exist")
// ErrInvalidNode indicates the nodes can't be used for
// the intended purpose
ErrInvalidNode = errors.New("invalid node")
)
+4 -4
View File
@@ -25,15 +25,15 @@ func (z *Zones) withInfo() (slog.Logger, bool) {
} }
func (z *Zones) debug() slog.Logger { func (z *Zones) debug() slog.Logger {
return z.log.Debug() return z.logger.Debug()
} }
func (z *Zones) info() slog.Logger { func (z *Zones) info() slog.Logger {
return z.log.Info() return z.logger.Info()
} }
func (z *Zones) warn(err error) slog.Logger { func (z *Zones) warn(err error) slog.Logger {
l := z.log.Warn() l := z.logger.Warn()
if err != nil { if err != nil {
l = l.WithField(slog.ErrorFieldName, err) l = l.WithField(slog.ErrorFieldName, err)
} }
@@ -41,7 +41,7 @@ func (z *Zones) warn(err error) slog.Logger {
} }
func (z *Zones) error(err error) slog.Logger { func (z *Zones) error(err error) slog.Logger {
l := z.log.Error() l := z.logger.Error()
if err != nil { if err != nil {
l = l.WithField(slog.ErrorFieldName, err) l = l.WithField(slog.ErrorFieldName, err)
} }
+1 -3
View File
@@ -9,9 +9,7 @@ import (
// A Machine is a machine on a Zone // A Machine is a machine on a Zone
type Machine struct { type Machine struct {
zone *Zone zone *Zone
logger `toml:"-" json:"-" yaml:"-"`
ID int `toml:"id"` ID int `toml:"id"`
Name string `toml:"-" json:"-" yaml:"-"` Name string `toml:"-" json:"-" yaml:"-"`
+3 -8
View File
@@ -2,7 +2,6 @@ package zones
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"os" "os"
@@ -136,11 +135,7 @@ func (m *Machine) applyWireguardConfig(ring int, wg *wireguard.Config) error {
} }
for _, peer := range wg.Peer { for _, peer := range wg.Peer {
err := m.applyWireguardPeerConfig(ring, peer) if err := m.applyWireguardPeerConfig(ring, peer); err != nil {
switch {
case errors.Is(err, ErrUnknownNode):
// ignore unknown peers
case err != nil:
err = core.Wrapf(err, "%s: wg%v:%s", m.Name, ring, addr) err = core.Wrapf(err, "%s: wg%v:%s", m.Name, ring, addr)
return err return err
} }
@@ -188,10 +183,8 @@ func (m *Machine) applyWireguardPeerConfig(ring int, pc wireguard.PeerConfig) er
switch { switch {
case !found: case !found:
// unknown // unknown
return core.Wrap(ErrUnknownNode, pc.Endpoint.Host)
case ring == 1 && m.zone != peer.zone: case ring == 1 && m.zone != peer.zone:
// invalid zone // invalid zone
return core.Wrap(ErrInvalidNode, peer.Name)
default: default:
// apply RingInfo // apply RingInfo
ri := &RingInfo{ ri := &RingInfo{
@@ -204,6 +197,8 @@ func (m *Machine) applyWireguardPeerConfig(ring int, pc wireguard.PeerConfig) er
return peer.applyRingInfo(ring, ri) return peer.applyRingInfo(ring, ri)
} }
return fmt.Errorf("%q: invalid peer endpoint", pc.Endpoint.Host)
} }
func (m *Machine) applyZoneNodeID(zoneID, nodeID int) error { func (m *Machine) applyZoneNodeID(zoneID, nodeID int) error {
+3 -17
View File
@@ -4,10 +4,7 @@ import (
"context" "context"
"net/netip" "net/netip"
"strconv" "strconv"
"strings"
"time" "time"
"darvaza.org/core"
) )
// LookupNetIP uses the DNS Resolver to get the public addresses associated // LookupNetIP uses the DNS Resolver to get the public addresses associated
@@ -33,32 +30,21 @@ func (m *Machine) UpdatePublicAddresses() error {
func (m *Machine) init() error { func (m *Machine) init() error {
if err := m.setID(); err != nil { if err := m.setID(); err != nil {
return core.Wrap(err, m.Name) return err
} }
for i := 0; i < RingsCount; i++ { for i := 0; i < RingsCount; i++ {
if err := m.tryReadWireguardKeys(i); err != nil { if err := m.tryReadWireguardKeys(i); err != nil {
return core.Wrap(err, m.Name) return err
} }
} }
return nil return nil
} }
func (m *Machine) setID() error { func (m *Machine) setID() error {
zoneName := m.zone.Name zoneName := m.zone.Name
suffix := m.Name[len(zoneName)+1:]
l := len(zoneName)
switch {
case len(m.Name) < l+2:
return ErrInvalidName
case !strings.HasPrefix(m.Name, zoneName):
return ErrInvalidName
case m.Name[l] != '-':
return ErrInvalidName
}
suffix := m.Name[l+1:]
id, err := strconv.ParseInt(suffix, 10, 8) id, err := strconv.ParseInt(suffix, 10, 8)
if err != nil { if err != nil {
return err return err
+1 -1
View File
@@ -69,7 +69,7 @@ func WithLogger(log slog.Logger) ScanOption {
} }
opt.Logger = log opt.Logger = log
m.log = log m.logger = log
return nil return nil
} }
} }
+11 -24
View File
@@ -3,8 +3,6 @@ package zones
import ( import (
"io/fs" "io/fs"
"sort" "sort"
"darvaza.org/core"
) )
func (m *Zones) scan(opts *ScanOptions) error { func (m *Zones) scan(opts *ScanOptions) error {
@@ -33,32 +31,22 @@ func (m *Zones) scanDirectory(_ *ScanOptions) error {
for _, e := range entries { for _, e := range entries {
if e.IsDir() { if e.IsDir() {
z, err := m.newZone(e.Name()) z := &Zone{
switch { zones: m,
case err != nil: Name: e.Name(),
return core.Wrap(err, e.Name())
case z.Machines.Len() > 0:
m.Zones = append(m.Zones, z)
} }
if err := z.scan(); err != nil {
return err
}
m.Zones = append(m.Zones, z)
} }
} }
return nil return nil
} }
func (m *Zones) newZone(name string) (*Zone, error) {
z := &Zone{
zones: m,
logger: m,
Name: name,
}
if err := z.scan(); err != nil {
return nil, err
}
return z, nil
}
func (m *Zones) scanMachines(opts *ScanOptions) error { func (m *Zones) scanMachines(opts *ScanOptions) error {
var err error var err error
m.ForEachMachine(func(p *Machine) bool { m.ForEachMachine(func(p *Machine) bool {
@@ -144,9 +132,8 @@ func (z *Zone) scan() error {
for _, e := range entries { for _, e := range entries {
if e.IsDir() { if e.IsDir() {
m := &Machine{ m := &Machine{
zone: z, zone: z,
logger: z, Name: e.Name(),
Name: e.Name(),
} }
if err := m.init(); err != nil { if err := m.init(); err != nil {
+2 -3
View File
@@ -87,8 +87,7 @@ func FilterMachines(m MachineIterator, cond func(*Machine) bool) (Machines, int)
// Zone represents one zone in a cluster // Zone represents one zone in a cluster
type Zone struct { type Zone struct {
zones *Zones zones *Zones
logger `toml:"-" json:"-" yaml:"-"`
ID int `toml:"id"` ID int `toml:"id"`
Name string `toml:"name"` Name string `toml:"name"`
@@ -143,7 +142,7 @@ func (z *Zone) GatewayIDs() ([]int, int) {
// Zones represents all zones in a cluster // Zones represents all zones in a cluster
type Zones struct { type Zones struct {
dir fs.FS dir fs.FS
log slog.Logger logger slog.Logger
resolver resolver.Resolver resolver resolver.Resolver
domain string domain string