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) }