package cluster import ( "io/fs" "git.jpi.io/amery/jpictl/pkg/rings" ) var ( _ MachineIterator = (*Zone)(nil) ) // A ZoneIterator is a set of Zones we can iterate on type ZoneIterator interface { ForEachZone(func(*Zone) bool) } // A Zone is a set of machines in close proximity and strong // affinity. type Zone struct { zones *Cluster logger `json:"-" yaml:"-"` ID rings.ZoneID Name string Regions []string `json:",omitempty" yaml:",omitempty"` Machines } func (z *Zone) String() string { return z.Name } // SetGateway configures a machine to be the zone's ring0 gateway func (z *Zone) SetGateway(gatewayID rings.NodeID, enabled bool) error { var err error var found bool z.ForEachMachine(func(p *Machine) bool { if p.ID == gatewayID { found = true err = p.SetGateway(enabled) return true } return false }) switch { case err != nil: return err case !found: return fs.ErrNotExist default: return nil } } // GatewayIDs returns the list of IDs of machines that act as ring0 gateways func (z *Zone) GatewayIDs() ([]rings.NodeID, int) { var out []rings.NodeID z.ForEachMachine(func(p *Machine) bool { if p.IsGateway() { out = append(out, p.ID) } return false }) return out, len(out) }