cluster: introduce RegionIterator, Zone.ForEachRegion and decouple getRegion from finishRegion #43
+40
-3
@@ -8,8 +8,16 @@ import (
|
||||
var (
|
||||
_ MachineIterator = (*Region)(nil)
|
||||
_ ZoneIterator = (*Region)(nil)
|
||||
|
||||
_ RegionIterator = (*Zone)(nil)
|
||||
_ RegionIterator = (*Cluster)(nil)
|
||||
)
|
||||
|
||||
// A RegionIterator is a set of Regions we can iterate on
|
||||
type RegionIterator interface {
|
||||
ForEachRegion(func(*Region) bool)
|
||||
}
|
||||
|
||||
// Region represents a group of zones geographically related
|
||||
type Region struct {
|
||||
m *Cluster
|
||||
@@ -145,6 +153,28 @@ func (m *Cluster) appendRegionRegions(name string, subs ...string) {
|
||||
})
|
||||
}
|
||||
|
||||
// ForEachRegion calls a function on all regions this zone belongs to.
|
||||
func (z *Zone) ForEachRegion(fn func(*Region) bool) {
|
||||
if fn == nil {
|
||||
return
|
||||
}
|
||||
|
||||
z.zones.ForEachRegion(func(r *Region) bool {
|
||||
var match bool
|
||||
|
||||
r.ForEachZone(func(z2 *Zone) bool {
|
||||
match = (z == z2)
|
||||
return match
|
||||
})
|
||||
|
||||
if match && fn(r) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
func (z *Zone) appendRegions(regions ...string) error {
|
||||
for _, s := range regions {
|
||||
// TODO: validate
|
||||
@@ -168,7 +198,7 @@ func (m *Cluster) finishRegion(r *Region) {
|
||||
r.m = m
|
||||
sub := []string{}
|
||||
for _, name := range r.Regions {
|
||||
r2, ok := m.getRegion(name)
|
||||
r2, ok := m.getFinishRegion(name)
|
||||
if !ok {
|
||||
m.warn(nil).WithField("region", name).Print("unknown region")
|
||||
continue
|
||||
@@ -183,9 +213,7 @@ func (m *Cluster) finishRegion(r *Region) {
|
||||
func (m *Cluster) getRegion(name string) (*Region, bool) {
|
||||
for i := range m.Regions {
|
||||
r := &m.Regions[i]
|
||||
|
||||
if name == r.Name {
|
||||
m.finishRegion(r)
|
||||
return r, true
|
||||
}
|
||||
}
|
||||
@@ -193,6 +221,15 @@ func (m *Cluster) getRegion(name string) (*Region, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func (m *Cluster) getFinishRegion(name string) (*Region, bool) {
|
||||
if r, ok := m.getRegion(name); ok {
|
||||
m.finishRegion(r)
|
||||
return r, true
|
||||
}
|
||||
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// SyncRegions writes to the file system the regions this [Zone]
|
||||
// belongs to.
|
||||
func (z *Zone) SyncRegions() error {
|
||||
|
||||
Reference in New Issue
Block a user