Compare commits
2 Commits
v0.5.5
..
379794cedd
| Author | SHA1 | Date | |
|---|---|---|---|
| 379794cedd | |||
| 24f5232ff6 |
+2
-3
@@ -52,9 +52,8 @@ const encoding = YAMLEncoding
|
|||||||
|
|
||||||
// Command
|
// Command
|
||||||
var dumpCmd = &cobra.Command{
|
var dumpCmd = &cobra.Command{
|
||||||
Use: "dump",
|
Use: "dump",
|
||||||
Short: "generates a text representation of the config",
|
Short: "generates a text representation of the config",
|
||||||
PreRun: setVerbosity,
|
|
||||||
RunE: func(_ *cobra.Command, _ []string) error {
|
RunE: func(_ *cobra.Command, _ []string) error {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
var enc Encoder
|
var enc Encoder
|
||||||
|
|||||||
+2
-3
@@ -8,9 +8,8 @@ import (
|
|||||||
|
|
||||||
// Command
|
// Command
|
||||||
var envCmd = &cobra.Command{
|
var envCmd = &cobra.Command{
|
||||||
Use: "env",
|
Use: "env",
|
||||||
Short: "generates environment variables for shell scripts",
|
Short: "generates environment variables for shell scripts",
|
||||||
PreRun: setVerbosity,
|
|
||||||
RunE: func(_ *cobra.Command, _ []string) error {
|
RunE: func(_ *cobra.Command, _ []string) error {
|
||||||
m, err := cfg.LoadZones(false)
|
m, err := cfg.LoadZones(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -19,9 +19,8 @@ var gatewayCmd = &cobra.Command{
|
|||||||
|
|
||||||
// gateway set
|
// gateway set
|
||||||
var gatewaySetCmd = &cobra.Command{
|
var gatewaySetCmd = &cobra.Command{
|
||||||
Use: "set",
|
Use: "set",
|
||||||
Short: "gateway set sets machines as gateways",
|
Short: "gateway set sets machines as gateways",
|
||||||
PreRun: setVerbosity,
|
|
||||||
RunE: func(_ *cobra.Command, args []string) error {
|
RunE: func(_ *cobra.Command, args []string) error {
|
||||||
m, err := cfg.LoadZones(false)
|
m, err := cfg.LoadZones(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -3,9 +3,15 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"darvaza.org/sidecar/pkg/logger/zerolog"
|
||||||
"darvaza.org/slog"
|
"darvaza.org/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO: make log level configurable via flags
|
||||||
|
var (
|
||||||
|
log = zerolog.New(nil, slog.Debug)
|
||||||
|
)
|
||||||
|
|
||||||
// fatal is a convenience wrapper for slog.Logger.Fatal().Print()
|
// fatal is a convenience wrapper for slog.Logger.Fatal().Print()
|
||||||
func fatal(err error, msg string, args ...any) {
|
func fatal(err error, msg string, args ...any) {
|
||||||
l := log.Fatal()
|
l := log.Fatal()
|
||||||
|
|||||||
+4
-22
@@ -2,8 +2,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"darvaza.org/sidecar/pkg/logger/zerolog"
|
|
||||||
"darvaza.org/slog"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,29 +10,13 @@ const (
|
|||||||
CmdName = "jpictl"
|
CmdName = "jpictl"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var rootCmd = &cobra.Command{
|
||||||
log = zerolog.New(nil, slog.Error)
|
Use: CmdName,
|
||||||
verbosity int
|
Short: "control tool for jpi.cloud",
|
||||||
rootCmd = &cobra.Command{
|
}
|
||||||
Use: CmdName,
|
|
||||||
Short: "control tool for jpi.cloud",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
fatal(err, "")
|
fatal(err, "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
rootCmd.PersistentFlags().CountVarP(&verbosity, "verbosity", "v", "increase the verbosity level to Warn, Info or Debug")
|
|
||||||
}
|
|
||||||
|
|
||||||
func setVerbosity(_ *cobra.Command, _ []string) {
|
|
||||||
desired := int8(slog.Error) + int8(verbosity)
|
|
||||||
if desired > 6 {
|
|
||||||
desired = 6
|
|
||||||
}
|
|
||||||
log = log.WithLevel(slog.LogLevel(desired))
|
|
||||||
}
|
|
||||||
|
|||||||
+2
-3
@@ -6,9 +6,8 @@ import (
|
|||||||
|
|
||||||
// Command
|
// Command
|
||||||
var writeCmd = &cobra.Command{
|
var writeCmd = &cobra.Command{
|
||||||
Use: "write",
|
Use: "write",
|
||||||
Short: "rewrites all config files",
|
Short: "rewrites all config files",
|
||||||
PreRun: setVerbosity,
|
|
||||||
RunE: func(_ *cobra.Command, _ []string) error {
|
RunE: func(_ *cobra.Command, _ []string) error {
|
||||||
m, err := cfg.LoadZones(false)
|
m, err := cfg.LoadZones(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+92
-12
@@ -1,12 +1,89 @@
|
|||||||
package zones
|
package zones
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"darvaza.org/slog"
|
"darvaza.org/core"
|
||||||
"git.jpi.io/amery/jpictl/pkg/ceph"
|
"git.jpi.io/amery/jpictl/pkg/ceph"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CephMissingMonitorError is an error that contains ceph
|
||||||
|
// monitors present in ceph.conf but not found on the cluster
|
||||||
|
type CephMissingMonitorError struct {
|
||||||
|
Names []string
|
||||||
|
Addrs []netip.Addr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err *CephMissingMonitorError) appendName(name string) {
|
||||||
|
err.Names = append(err.Names, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err *CephMissingMonitorError) appendAddr(addr netip.Addr) {
|
||||||
|
err.Addrs = append(err.Addrs, addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OK tells if this instance actual shouldn't be treated as an error
|
||||||
|
func (err CephMissingMonitorError) OK() bool {
|
||||||
|
switch {
|
||||||
|
case len(err.Names) > 0:
|
||||||
|
return false
|
||||||
|
case len(err.Addrs) > 0:
|
||||||
|
return false
|
||||||
|
default:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err CephMissingMonitorError) Error() string {
|
||||||
|
if !err.OK() {
|
||||||
|
var buf strings.Builder
|
||||||
|
|
||||||
|
_, _ = buf.WriteString("missing:")
|
||||||
|
err.writeNames(&buf)
|
||||||
|
err.writeAddrs(&buf)
|
||||||
|
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// no error
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err *CephMissingMonitorError) writeNames(w *strings.Builder) {
|
||||||
|
if len(err.Names) > 0 {
|
||||||
|
_, _ = w.WriteString(" mon_initial_members:")
|
||||||
|
for i, name := range err.Names {
|
||||||
|
if i != 0 {
|
||||||
|
_, _ = w.WriteRune(',')
|
||||||
|
}
|
||||||
|
_, _ = w.WriteString(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err *CephMissingMonitorError) writeAddrs(w *strings.Builder) {
|
||||||
|
if len(err.Addrs) > 0 {
|
||||||
|
_, _ = w.WriteString(" mon_host:")
|
||||||
|
for i, addr := range err.Addrs {
|
||||||
|
if i != 0 {
|
||||||
|
_, _ = w.WriteRune(',')
|
||||||
|
}
|
||||||
|
_, _ = w.WriteString(addr.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsError returns nil if the instance is actually OK
|
||||||
|
func (err *CephMissingMonitorError) AsError() error {
|
||||||
|
if err == nil || err.OK() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
type cephScanTODO struct {
|
type cephScanTODO struct {
|
||||||
names map[string]bool
|
names map[string]bool
|
||||||
addrs map[string]bool
|
addrs map[string]bool
|
||||||
@@ -34,24 +111,26 @@ func (todo *cephScanTODO) checkMachine(p *Machine) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (todo *cephScanTODO) LogMissing(log slog.Logger) {
|
func (todo *cephScanTODO) Missing() error {
|
||||||
|
var check CephMissingMonitorError
|
||||||
|
|
||||||
for name, found := range todo.names {
|
for name, found := range todo.names {
|
||||||
if !found {
|
if !found {
|
||||||
log.Warn().
|
check.appendName(name)
|
||||||
WithField("subsystem", "ceph").
|
|
||||||
WithField("monitor", name).
|
|
||||||
Print("unknown monitor")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for addr, found := range todo.addrs {
|
for addr, found := range todo.addrs {
|
||||||
if !found {
|
if !found {
|
||||||
log.Warn().
|
var a netip.Addr
|
||||||
WithField("subsystem", "ceph").
|
// it wouldn't be on the map if it wasn't valid
|
||||||
WithField("monitor", addr).
|
_ = a.UnmarshalText([]byte(addr))
|
||||||
Print("unknown monitor")
|
|
||||||
|
check.appendAddr(a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return check.AsError()
|
||||||
}
|
}
|
||||||
|
|
||||||
func newCephScanTODO(cfg *ceph.Config) *cephScanTODO {
|
func newCephScanTODO(cfg *ceph.Config) *cephScanTODO {
|
||||||
@@ -90,8 +169,9 @@ func (m *Zones) scanCephMonitors(_ *ScanOptions) error {
|
|||||||
p.CephMonitor = todo.checkMachine(p)
|
p.CephMonitor = todo.checkMachine(p)
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
if err := todo.Missing(); err != nil {
|
||||||
todo.LogMissing(m.log)
|
return core.Wrap(err, "ceph")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure every zone has one
|
// make sure every zone has one
|
||||||
|
|||||||
@@ -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")
|
|
||||||
)
|
|
||||||
@@ -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:"-"`
|
||||||
|
|
||||||
|
|||||||
+10
-22
@@ -2,7 +2,6 @@ package zones
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@@ -122,30 +121,23 @@ func (m *Machine) applyWireguardConfig(ring int, wg *wireguard.Config) error {
|
|||||||
addr := wg.GetAddress()
|
addr := wg.GetAddress()
|
||||||
zoneID, nodeID, ok := Rings[ring].Decode(addr)
|
zoneID, nodeID, ok := Rings[ring].Decode(addr)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("%s: invalid address", addr)
|
return fmt.Errorf("%s: invalid wg%v address: %s", m.Name, ring, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := m.applyZoneNodeID(zoneID, nodeID); err != nil {
|
if err := m.applyZoneNodeID(zoneID, nodeID); err != nil {
|
||||||
return core.Wrapf(err, "%s: invalid address", addr)
|
err = core.Wrapf(err, "%s: wg%v:%s", m.Name, ring, addr)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := m.applyWireguardInterfaceConfig(ring, wg.Interface); err != nil {
|
if err := m.applyWireguardInterfaceConfig(ring, wg.Interface); err != nil {
|
||||||
return core.Wrap(err, "interface")
|
err = core.Wrapf(err, "%s: wg%v:%s", m.Name, ring, addr)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, peer := range wg.Peer {
|
for _, peer := range wg.Peer {
|
||||||
err := m.applyWireguardPeerConfig(ring, peer)
|
if err := m.applyWireguardPeerConfig(ring, peer); err != nil {
|
||||||
switch {
|
err = core.Wrapf(err, "%s: wg%v:%s", m.Name, ring, addr)
|
||||||
case errors.Is(err, ErrUnknownNode):
|
return err
|
||||||
// ignore unknown peers
|
|
||||||
m.warn(nil).
|
|
||||||
WithField("subsystem", "wireguard").
|
|
||||||
WithField("node", m.Name).
|
|
||||||
WithField("peer", peer.Endpoint.Host).
|
|
||||||
WithField("ring", ring).
|
|
||||||
Print("ignoring unknown endpoint")
|
|
||||||
case err != nil:
|
|
||||||
return core.Wrap(err, "peer")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,10 +158,6 @@ func (m *Machine) applyRingInfo(ring int, new *RingInfo) error {
|
|||||||
cur, _ := m.getRingInfo(ring)
|
cur, _ := m.getRingInfo(ring)
|
||||||
if cur == nil {
|
if cur == nil {
|
||||||
// first, append
|
// first, append
|
||||||
m.debug().
|
|
||||||
WithField("node", m.Name).
|
|
||||||
WithField("ring", ring).
|
|
||||||
Print("found")
|
|
||||||
m.Rings = append(m.Rings, new)
|
m.Rings = append(m.Rings, new)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -195,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{
|
||||||
@@ -211,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 {
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -71,11 +57,6 @@ func (m *Machine) setID() error {
|
|||||||
func (m *Machine) scan(opts *ScanOptions) error {
|
func (m *Machine) scan(opts *ScanOptions) error {
|
||||||
for i := 0; i < RingsCount; i++ {
|
for i := 0; i < RingsCount; i++ {
|
||||||
if err := m.tryApplyWireguardConfig(i); err != nil {
|
if err := m.tryApplyWireguardConfig(i); err != nil {
|
||||||
m.error(err).
|
|
||||||
WithField("subsystem", "wireguard").
|
|
||||||
WithField("node", m.Name).
|
|
||||||
WithField("ring", i).
|
|
||||||
Print()
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ type ScanOptions struct {
|
|||||||
|
|
||||||
// Logger specifies the logger to be used. otherwise
|
// Logger specifies the logger to be used. otherwise
|
||||||
// the scanner will be mute
|
// the scanner will be mute
|
||||||
slog.Logger
|
Logger slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResolvePublicAddresses instructs the scanner to use
|
// ResolvePublicAddresses instructs the scanner to use
|
||||||
|
|||||||
+11
-42
@@ -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,40 +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:
|
|
||||||
z.warn(nil).
|
|
||||||
WithField("zone", z.Name).
|
|
||||||
Print("empty")
|
|
||||||
default:
|
|
||||||
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,
|
|
||||||
}
|
|
||||||
|
|
||||||
z.debug().
|
|
||||||
WithField("zone", z.Name).
|
|
||||||
Print("found")
|
|
||||||
|
|
||||||
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 {
|
||||||
@@ -152,22 +132,11 @@ 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(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m.debug().
|
|
||||||
WithField("node", m.Name).
|
|
||||||
WithField("zone", z.Name).
|
|
||||||
Print("found")
|
|
||||||
|
|
||||||
if err := m.init(); err != nil {
|
if err := m.init(); err != nil {
|
||||||
m.error(err).
|
|
||||||
WithField("node", m.Name).
|
|
||||||
WithField("zone", z.Name).
|
|
||||||
Print()
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -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"`
|
||||||
|
|||||||
Reference in New Issue
Block a user