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.
90 lines
2.0 KiB
90 lines
2.0 KiB
package cluster |
|
|
|
import ( |
|
"net/netip" |
|
"strings" |
|
|
|
"git.jpi.io/amery/jpictl/pkg/rings" |
|
) |
|
|
|
// revive:disable:line-length-limit |
|
|
|
// A Machine is a machine on a Zone |
|
type Machine struct { |
|
zone *Zone |
|
logger `json:"-" yaml:"-"` |
|
|
|
ID rings.NodeID |
|
Name string `json:"-" yaml:"-"` |
|
|
|
Inactive bool `json:"inactive,omitempty" yaml:"inactive,omitempty"` |
|
CephMonitor bool `json:"ceph_monitor,omitempty" yaml:"ceph_monitor,omitempty"` |
|
PublicAddresses []netip.Addr `json:"public,omitempty" yaml:"public,omitempty"` |
|
Rings []*RingInfo `json:"rings,omitempty" yaml:"rings,omitempty"` |
|
} |
|
|
|
// revive:enable:line-length-limit |
|
|
|
func (m *Machine) String() string { |
|
return m.Name |
|
} |
|
|
|
// FullName returns the Name of the machine including domain name |
|
func (m *Machine) FullName() string { |
|
var name []string |
|
|
|
for _, s := range []string{ |
|
m.Name, |
|
m.zone.zones.Name, |
|
m.zone.zones.Domain, |
|
} { |
|
if s != "" { |
|
name = append(name, s) |
|
} |
|
} |
|
|
|
return strings.Join(name, ".") |
|
} |
|
|
|
// IsActive indicates the machine is to be included in regions' DNS entries |
|
func (m *Machine) IsActive() bool { |
|
return !m.Inactive |
|
} |
|
|
|
// IsGateway tells if the Machine is a ring0 gateway |
|
func (m *Machine) IsGateway() bool { |
|
_, ok := m.getRingInfo(rings.RingZeroID) |
|
return ok |
|
} |
|
|
|
// SetGateway enables/disables a Machine ring0 integration |
|
func (m *Machine) SetGateway(enabled bool) error { |
|
ri, found := m.getRingInfo(rings.RingZeroID) |
|
switch { |
|
case !found && !enabled: |
|
return nil |
|
case !found: |
|
var err error |
|
|
|
if ri, err = m.createRingInfo(0, false); err != nil { |
|
return err |
|
} |
|
} |
|
|
|
ri.Enabled = enabled |
|
return m.SyncWireguardConfig(rings.RingZeroID) |
|
} |
|
|
|
// Zone indicates the [Zone] this machine belongs to |
|
func (m *Machine) Zone() rings.ZoneID { |
|
return m.zone.ID |
|
} |
|
|
|
// Region indicates the [Region] this machine belongs to |
|
func (m *Machine) Region() rings.RegionID { |
|
return m.zone.RegionID() |
|
} |
|
|
|
func (m *Machine) getPeerByName(name string) (*Machine, bool) { |
|
return m.zone.zones.GetMachineByName(name) |
|
}
|
|
|