Compare commits
8 Commits
v0.8.5
...
9d3876d168
| Author | SHA1 | Date | |
|---|---|---|---|
| 9d3876d168 | |||
| 991db0e007 | |||
| a2b65a097c | |||
| 060e2292bf | |||
| 6dc3b678c3 | |||
| 32c1cc3384 | |||
| 52541f7551 | |||
| 45866b61a0 |
+65
-16
@@ -4,12 +4,14 @@ import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Env is a shell environment factory for this cluster
|
||||
type Env struct {
|
||||
ZoneIterator
|
||||
RegionIterator
|
||||
|
||||
cephFSID string
|
||||
export bool
|
||||
@@ -23,9 +25,10 @@ func (m *Cluster) Env(export bool) (*Env, error) {
|
||||
}
|
||||
|
||||
env := &Env{
|
||||
ZoneIterator: m,
|
||||
cephFSID: fsid.String(),
|
||||
export: export,
|
||||
ZoneIterator: m,
|
||||
RegionIterator: m,
|
||||
cephFSID: fsid.String(),
|
||||
export: export,
|
||||
}
|
||||
|
||||
return env, nil
|
||||
@@ -43,6 +46,22 @@ func (m *Env) Zones() []int {
|
||||
return zones
|
||||
}
|
||||
|
||||
// Regions returns the list of primary regions
|
||||
func (m *Env) Regions() []string {
|
||||
var regions []string
|
||||
|
||||
m.ForEachRegion(func(r *Region) bool {
|
||||
if r.Cluster != nil {
|
||||
regions = append(regions, r.Name)
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
sort.Strings(regions)
|
||||
return regions
|
||||
}
|
||||
|
||||
// WriteTo generates environment variables for shell scripts
|
||||
func (m *Env) WriteTo(w io.Writer) (int64, error) {
|
||||
var buf bytes.Buffer
|
||||
@@ -51,6 +70,7 @@ func (m *Env) WriteTo(w io.Writer) (int64, error) {
|
||||
m.writeEnvVar(&buf, m.cephFSID, "FSID")
|
||||
}
|
||||
|
||||
m.writeEnvVarStrings(&buf, m.Regions(), "REGIONS")
|
||||
m.writeEnvVarInts(&buf, m.Zones(), "ZONES")
|
||||
|
||||
m.ForEachZone(func(z *Zone) bool {
|
||||
@@ -74,6 +94,9 @@ func (m *Env) writeEnvZone(w io.Writer, z *Zone) {
|
||||
gateways, _ := z.GatewayIDs()
|
||||
m.writeEnvVarInts(w, gateways, "ZONE%v_%s", zoneID, "GW")
|
||||
|
||||
// ZONE{zoneID}_REGION
|
||||
m.writeEnvVar(w, genEnvZoneRegion(z), "ZONE%v_%s", zoneID, "REGION")
|
||||
|
||||
// Ceph
|
||||
monitors := z.GetCephMonitors()
|
||||
// MON{zoneID}_NAME
|
||||
@@ -85,22 +108,29 @@ func (m *Env) writeEnvZone(w io.Writer, z *Zone) {
|
||||
}
|
||||
|
||||
func (m *Env) writeEnvVarInts(w io.Writer, value []int, name string, args ...any) {
|
||||
var s string
|
||||
var buf bytes.Buffer
|
||||
|
||||
if n := len(value); n > 0 {
|
||||
var buf bytes.Buffer
|
||||
|
||||
for i, v := range value {
|
||||
if i != 0 {
|
||||
_, _ = fmt.Fprint(&buf, " ")
|
||||
}
|
||||
_, _ = fmt.Fprintf(&buf, "%v", v)
|
||||
for _, v := range value {
|
||||
if buf.Len() > 0 {
|
||||
_, _ = fmt.Fprint(&buf, " ")
|
||||
}
|
||||
|
||||
s = buf.String()
|
||||
_, _ = fmt.Fprintf(&buf, "%v", v)
|
||||
}
|
||||
|
||||
m.writeEnvVar(w, s, name, args...)
|
||||
m.writeEnvVar(w, buf.String(), name, args...)
|
||||
}
|
||||
|
||||
func (m *Env) writeEnvVarStrings(w io.Writer, value []string, name string, args ...any) {
|
||||
var buf bytes.Buffer
|
||||
|
||||
for _, v := range value {
|
||||
if buf.Len() > 0 {
|
||||
_, _ = fmt.Fprint(&buf, " ")
|
||||
}
|
||||
_, _ = fmt.Fprintf(&buf, "%s", v)
|
||||
}
|
||||
|
||||
m.writeEnvVar(w, buf.String(), name, args...)
|
||||
}
|
||||
|
||||
func (m *Env) writeEnvVar(w io.Writer, value string, name string, args ...any) {
|
||||
@@ -117,7 +147,11 @@ func (m *Env) writeEnvVar(w io.Writer, value string, name string, args ...any) {
|
||||
if name != "" {
|
||||
value = strings.TrimSpace(value)
|
||||
|
||||
_, _ = fmt.Fprintf(w, "%s%s=%q\n", prefix, name, value)
|
||||
if value == "" {
|
||||
_, _ = fmt.Fprintf(w, "%s%s=\n", prefix, name)
|
||||
} else {
|
||||
_, _ = fmt.Fprintf(w, "%s%s=%q\n", prefix, name, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +169,21 @@ func genEnvZoneNodes(z *Zone) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func genEnvZoneRegion(z *Zone) string {
|
||||
var region string
|
||||
|
||||
z.ForEachRegion(func(r *Region) bool {
|
||||
if r.Cluster != nil {
|
||||
region = r.Name
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
return region
|
||||
}
|
||||
|
||||
func genEnvZoneCephMonNames(m Machines) string {
|
||||
var buf strings.Builder
|
||||
m.ForEachMachine(func(p *Machine) bool {
|
||||
|
||||
+40
-3
@@ -8,8 +8,16 @@ import (
|
||||
var (
|
||||
_ MachineIterator = (*Region)(nil)
|
||||
_ ZoneIterator = (*Region)(nil)
|
||||
|
||||
_ RegionIterator = (*Zone)(nil)
|
||||
_ RegionIterator = (*Cluster)(nil)
|
||||
)
|
||||
|
||||
// A RegionIterator is a set of Regions we can iterate on
|
||||
type RegionIterator interface {
|
||||
ForEachRegion(func(*Region) bool)
|
||||
}
|
||||
|
||||
// Region represents a group of zones geographically related
|
||||
type Region struct {
|
||||
m *Cluster
|
||||
@@ -145,6 +153,28 @@ func (m *Cluster) appendRegionRegions(name string, subs ...string) {
|
||||
})
|
||||
}
|
||||
|
||||
// ForEachRegion calls a function on all regions this zone belongs to.
|
||||
func (z *Zone) ForEachRegion(fn func(*Region) bool) {
|
||||
if fn == nil {
|
||||
return
|
||||
}
|
||||
|
||||
z.zones.ForEachRegion(func(r *Region) bool {
|
||||
var match bool
|
||||
|
||||
r.ForEachZone(func(z2 *Zone) bool {
|
||||
match = (z == z2)
|
||||
return match
|
||||
})
|
||||
|
||||
if match && fn(r) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
func (z *Zone) appendRegions(regions ...string) error {
|
||||
for _, s := range regions {
|
||||
// TODO: validate
|
||||
@@ -168,7 +198,7 @@ func (m *Cluster) finishRegion(r *Region) {
|
||||
r.m = m
|
||||
sub := []string{}
|
||||
for _, name := range r.Regions {
|
||||
r2, ok := m.getRegion(name)
|
||||
r2, ok := m.getFinishRegion(name)
|
||||
if !ok {
|
||||
m.warn(nil).WithField("region", name).Print("unknown region")
|
||||
continue
|
||||
@@ -183,9 +213,7 @@ func (m *Cluster) finishRegion(r *Region) {
|
||||
func (m *Cluster) getRegion(name string) (*Region, bool) {
|
||||
for i := range m.Regions {
|
||||
r := &m.Regions[i]
|
||||
|
||||
if name == r.Name {
|
||||
m.finishRegion(r)
|
||||
return r, true
|
||||
}
|
||||
}
|
||||
@@ -193,6 +221,15 @@ func (m *Cluster) getRegion(name string) (*Region, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func (m *Cluster) getFinishRegion(name string) (*Region, bool) {
|
||||
if r, ok := m.getRegion(name); ok {
|
||||
m.finishRegion(r)
|
||||
return r, true
|
||||
}
|
||||
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// SyncRegions writes to the file system the regions this [Zone]
|
||||
// belongs to.
|
||||
func (z *Zone) SyncRegions() error {
|
||||
|
||||
Reference in New Issue
Block a user