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.
75 lines
1.4 KiB
75 lines
1.4 KiB
package zones |
|
|
|
import ( |
|
"bytes" |
|
"sort" |
|
|
|
"darvaza.org/core" |
|
"github.com/gofrs/uuid/v5" |
|
|
|
"git.jpi.io/amery/jpictl/pkg/ceph" |
|
) |
|
|
|
// GetCephFSID returns our Ceph's FSID |
|
func (m *Zones) GetCephFSID() (uuid.UUID, error) { |
|
if core.IsZero(m.CephFSID) { |
|
// TODO: generate one |
|
return uuid.Nil, nil |
|
} |
|
return m.CephFSID, nil |
|
} |
|
|
|
// GetCephConfig reads the ceph.conf file |
|
func (m *Zones) GetCephConfig() (*ceph.Config, error) { |
|
data, err := m.ReadFile("ceph.conf") |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
r := bytes.NewReader(data) |
|
return ceph.NewConfigFromReader(r) |
|
} |
|
|
|
// GetCephMonitors returns the set of Ceph monitors on |
|
// the zone |
|
func (z *Zone) GetCephMonitors() Machines { |
|
var mons Machines |
|
var first, second *Machine |
|
|
|
z.ForEachMachine(func(p *Machine) bool { |
|
switch { |
|
case p.CephMonitor: |
|
// it is a monitor |
|
mons = append(mons, p) |
|
case len(mons) > 0: |
|
// zone has a monitor |
|
case first == nil && !p.IsGateway(): |
|
// first option for monitor |
|
first = p |
|
case second == nil: |
|
// second option for monitor |
|
second = p |
|
} |
|
|
|
return false |
|
}) |
|
|
|
switch { |
|
case len(mons) > 0: |
|
// ready |
|
case first != nil: |
|
// make first option our monitor |
|
first.CephMonitor = true |
|
mons = append(mons, first) |
|
case second != nil: |
|
// make second option our monitor |
|
second.CephMonitor = true |
|
mons = append(mons, second) |
|
default: |
|
// zone without machines?? |
|
panic("unreachable") |
|
} |
|
|
|
sort.Sort(mons) |
|
return mons |
|
}
|
|
|