cluster: assign valid rings.RegionID to each primary region
Signed-off-by: Alejandro Mery <amery@jpi.io>
This commit is contained in:
+2
-2
@@ -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.Cluster != nil {
|
if r.IsPrimary() {
|
||||||
regions = append(regions, r.Name)
|
regions = append(regions, r.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ func genEnvZoneRegion(z *Zone) string {
|
|||||||
var region string
|
var region string
|
||||||
|
|
||||||
z.ForEachRegion(func(r *Region) bool {
|
z.ForEachRegion(func(r *Region) bool {
|
||||||
if r.Cluster != nil {
|
if r.IsPrimary() {
|
||||||
region = r.Name
|
region = r.Name
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
+69
-2
@@ -3,6 +3,8 @@ package cluster
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"git.jpi.io/amery/jpictl/pkg/rings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -24,8 +26,15 @@ type Region struct {
|
|||||||
zones []*Zone
|
zones []*Zone
|
||||||
|
|
||||||
Name string
|
Name string
|
||||||
Cluster *string `json:",omitempty" yaml:",omitempty"`
|
ID rings.RegionID `json:",omitempty" yaml:",omitempty"`
|
||||||
Regions []string `json:",omitempty" yaml:",omitempty"`
|
Cluster *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
|
||||||
@@ -92,6 +101,7 @@ func (m *Cluster) initRegions(_ *ScanOptions) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
m.sortRegions()
|
m.sortRegions()
|
||||||
|
m.scanRegionID()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,6 +220,63 @@ 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) 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]
|
||||||
|
|||||||
Reference in New Issue
Block a user