Compare commits

..

3 Commits

Author SHA1 Message Date
amery e33ef0019f cluster: use rings.ZoneID and rings.NodeID types
Signed-off-by: Alejandro Mery <amery@jpi.io>
2024-06-02 22:07:28 +00:00
amery 4812cb7d5d rings: fix NodeZeroMax/NodeMax to not accept .255
Signed-off-by: Alejandro Mery <amery@jpi.io>
2024-06-02 22:07:28 +00:00
amery fd3c9b5fa3 rings: add String() to RegionID, ZoneID, NodeID
Signed-off-by: Alejandro Mery <amery@jpi.io>
2024-06-02 21:28:16 +00:00
6 changed files with 19 additions and 112 deletions
+1 -2
View File
@@ -15,8 +15,7 @@ TMPDIR ?= .tmp
REVIVE ?= $(GOBIN)/revive REVIVE ?= $(GOBIN)/revive
REVIVE_CONF ?= $(TOOLSDIR)/revive.toml REVIVE_CONF ?= $(TOOLSDIR)/revive.toml
REVIVE_RUN_ARGS ?= -config $(REVIVE_CONF) -formatter friendly REVIVE_RUN_ARGS ?= -config $(REVIVE_CONF) -formatter friendly
REVIVE_VERSION ?= v1.3.7 REVIVE_INSTALL_URL ?= github.com/mgechev/revive@master
REVIVE_INSTALL_URL ?= github.com/mgechev/revive@$(REVIVE_VERSION)
GO_INSTALL_URLS = \ GO_INSTALL_URLS = \
$(REVIVE_INSTALL_URL) \ $(REVIVE_INSTALL_URL) \
+2 -3
View File
@@ -5,19 +5,18 @@ import (
"fmt" "fmt"
"os" "os"
"gopkg.in/yaml.v3"
"git.jpi.io/amery/jpictl/pkg/rings" "git.jpi.io/amery/jpictl/pkg/rings"
"gopkg.in/yaml.v3"
) )
func (m *Cluster) init(opts *ScanOptions) error { func (m *Cluster) init(opts *ScanOptions) error {
for _, fn := range []func(*ScanOptions) error{ for _, fn := range []func(*ScanOptions) error{
m.initZones, m.initZones,
m.initRegions,
m.scanZoneIDs, m.scanZoneIDs,
m.scanSort, m.scanSort,
m.scanGateways, m.scanGateways,
m.initCephMonitors, m.initCephMonitors,
m.initRegions,
} { } {
if err := fn(opts); err != nil { if err := fn(opts); err != nil {
return err return err
+1 -2
View File
@@ -7,7 +7,6 @@ import (
"strings" "strings"
"darvaza.org/core" "darvaza.org/core"
"git.jpi.io/amery/jpictl/pkg/rings" "git.jpi.io/amery/jpictl/pkg/rings"
) )
@@ -25,9 +24,9 @@ func (m *Cluster) scan(opts *ScanOptions) error {
for _, fn := range []func(*ScanOptions) error{ for _, fn := range []func(*ScanOptions) error{
m.scanDirectory, m.scanDirectory,
m.scanMachines, m.scanMachines,
m.initRegions,
m.scanZoneIDs, m.scanZoneIDs,
m.scanSort, m.scanSort,
m.initRegions,
m.scanGateways, m.scanGateways,
m.scanCephMonitors, m.scanCephMonitors,
} { } {
+13 -5
View File
@@ -53,7 +53,7 @@ func (m *Env) Regions() []string {
var regions []string var regions []string
m.ForEachRegion(func(r *Region) bool { m.ForEachRegion(func(r *Region) bool {
if r.IsPrimary() { if r.Cluster != nil {
regions = append(regions, r.Name) regions = append(regions, r.Name)
} }
@@ -163,10 +163,18 @@ func genEnvZoneNodes(z *Zone) string {
} }
func genEnvZoneRegion(z *Zone) string { func genEnvZoneRegion(z *Zone) string {
if z != nil && z.region != nil { var region string
return z.region.Name
} z.ForEachRegion(func(r *Region) bool {
return "" if r.Cluster != nil {
region = r.Name
return true
}
return false
})
return region
} }
func genEnvZoneCephMonNames(m Machines) string { func genEnvZoneCephMonNames(m Machines) string {
+2 -99
View File
@@ -3,8 +3,6 @@ package cluster
import ( import (
"bytes" "bytes"
"path/filepath" "path/filepath"
"git.jpi.io/amery/jpictl/pkg/rings"
) )
var ( var (
@@ -26,15 +24,8 @@ type Region struct {
zones []*Zone zones []*Zone
Name string Name string
ID rings.RegionID `json:",omitempty" yaml:",omitempty"` Cluster *string `json:",omitempty" yaml:",omitempty"`
Cluster *string `json:",omitempty" yaml:",omitempty"` Regions []string `json:",omitempty" yaml:",omitempty"`
Regions []string `json:",omitempty" yaml:",omitempty"`
}
// IsPrimary indicates the region is primary and corresponds
// to a kubernetes cluster.
func (r *Region) IsPrimary() bool {
return r != nil && r.Cluster != nil
} }
// ForEachRegion calls a function for each Region of the cluster // ForEachRegion calls a function for each Region of the cluster
@@ -101,8 +92,6 @@ func (m *Cluster) initRegions(_ *ScanOptions) error {
} }
m.sortRegions() m.sortRegions()
m.scanRegionID()
m.computeZonesRegion()
return nil return nil
} }
@@ -221,92 +210,6 @@ func (m *Cluster) finishRegion(r *Region) {
r.Regions = sub r.Regions = sub
} }
// revive:disable:cognitive-complexity
func (m *Cluster) scanRegionID() {
// revive:enable:cognitive-complexity
var max rings.RegionID
var missing bool
// check IDs
ids := make(map[rings.RegionID]bool)
fn := func(r *Region) bool {
var term bool
switch {
case !r.IsPrimary():
// secondary, no ID.
r.ID = 0
case !r.ID.Valid():
// primary without ID
missing = true
case ids[r.ID]:
// duplicate
m.error(nil).WithField("region", r.Name).Print("duplicate ID")
missing = true
r.ID = 0
default:
ids[r.ID] = true
if r.ID > max {
max = r.ID
}
}
return term
}
m.ForEachRegion(fn)
if missing {
// assign missing IDs
fn := func(r *Region) bool {
var term bool
switch {
case !r.IsPrimary():
// ignore secondary
case r.ID.Valid():
// already has an ID
default:
r.ID = max + 1
max = r.ID
}
return term
}
m.ForEachRegion(fn)
}
}
func (m *Cluster) computeZonesRegion() {
fn := func(r *Region, z *Zone) {
if z.region != nil {
m.error(nil).
WithField("zone", z.Name).
WithField("region", []string{
z.region.Name,
r.Name,
}).
Print("zone in two regions")
} else {
z.region = r
}
}
m.ForEachRegion(func(r *Region) bool {
var term bool
if r.IsPrimary() {
r.ForEachZone(func(z *Zone) bool {
fn(r, z)
return term
})
}
return term
})
}
func (m *Cluster) getRegion(name string) (*Region, bool) { func (m *Cluster) getRegion(name string) (*Region, bool) {
for i := range m.Regions { for i := range m.Regions {
r := &m.Regions[i] r := &m.Regions[i]
-1
View File
@@ -19,7 +19,6 @@ type ZoneIterator interface {
// affinity. // affinity.
type Zone struct { type Zone struct {
zones *Cluster zones *Cluster
region *Region
logger `json:"-" yaml:"-"` logger `json:"-" yaml:"-"`
ID rings.ZoneID ID rings.ZoneID