diff --git a/pkg/cluster/regions.go b/pkg/cluster/regions.go index 03ac85e..bf29137 100644 --- a/pkg/cluster/regions.go +++ b/pkg/cluster/regions.go @@ -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 {