You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.2 KiB
71 lines
1.2 KiB
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) |
|
}
|
|
|