cluster: introduce Region.Cluser and m/{region}/k8s_token to store a cluster's token #42
@@ -4,6 +4,7 @@ import (
|
||||
"io/fs"
|
||||
"path"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"darvaza.org/core"
|
||||
)
|
||||
@@ -12,6 +13,10 @@ const (
|
||||
// ZoneRegionsFileName indicates the file containing
|
||||
// region names as references
|
||||
ZoneRegionsFileName = "regions"
|
||||
|
||||
// RegionClusterTokenFileName contains the kubernetes
|
||||
// token of the cluster this region represents
|
||||
RegionClusterTokenFileName = "k8s_token"
|
||||
)
|
||||
|
||||
func (m *Cluster) scan(opts *ScanOptions) error {
|
||||
@@ -186,6 +191,8 @@ func (z *Zone) scan() error {
|
||||
switch {
|
||||
case name == ZoneRegionsFileName:
|
||||
err = z.loadRegions()
|
||||
case name == RegionClusterTokenFileName:
|
||||
err = z.loadClusterToken()
|
||||
case e.IsDir():
|
||||
err = z.scanSubdirectory(name)
|
||||
default:
|
||||
@@ -218,6 +225,32 @@ func (z *Zone) loadRegions() error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (z *Zone) loadClusterToken() error {
|
||||
var token string
|
||||
|
||||
filename := path.Join(z.Name, RegionClusterTokenFileName)
|
||||
lines, err := z.zones.ReadLines(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// first non-empty line
|
||||
|
karasz marked this conversation as resolved
Outdated
|
||||
for _, s := range lines {
|
||||
s = strings.TrimSpace(s)
|
||||
if s != "" {
|
||||
token = s
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
err = z.zones.setRegionClusterToken(z.Name, token)
|
||||
if err != nil {
|
||||
err = core.Wrap(err, filename)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (z *Zone) scanSubdirectory(name string) error {
|
||||
m := &Machine{
|
||||
zone: z,
|
||||
|
||||
+80
-14
@@ -16,6 +16,7 @@ type Region struct {
|
||||
zones []*Zone
|
||||
|
||||
Name string
|
||||
Cluster *string `json:",omitempty" yaml:",omitempty"`
|
||||
Regions []string `json:",omitempty" yaml:",omitempty"`
|
||||
}
|
||||
|
||||
@@ -106,6 +107,26 @@ func (m *Cluster) setRegionZones(name string, zones ...*Zone) {
|
||||
})
|
||||
}
|
||||
|
||||
func (m *Cluster) setRegionClusterToken(name string, token string) error {
|
||||
for i := range m.Regions {
|
||||
r := &m.Regions[i]
|
||||
|
||||
if r.Name == name {
|
||||
// found
|
||||
r.Cluster = &token
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// new
|
||||
m.Regions = append(m.Regions, Region{
|
||||
m: m,
|
||||
Name: name,
|
||||
Cluster: &token,
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Cluster) appendRegionRegions(name string, subs ...string) {
|
||||
for i := range m.Regions {
|
||||
r := &m.Regions[i]
|
||||
@@ -178,11 +199,7 @@ func (z *Zone) SyncRegions() error {
|
||||
err := z.syncZoneRegions()
|
||||
if err == nil {
|
||||
z.ForEachMachine(func(p *Machine) bool {
|
||||
if p.IsActive() {
|
||||
err = p.RemoveFile("region")
|
||||
} else {
|
||||
err = p.WriteStringFile("none\n", "region")
|
||||
}
|
||||
err = z.syncMachineRegions(p)
|
||||
return err != nil
|
||||
})
|
||||
}
|
||||
@@ -190,8 +207,24 @@ func (z *Zone) SyncRegions() error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (*Zone) syncMachineRegions(p *Machine) error {
|
||||
var err error
|
||||
|
||||
if p.IsActive() {
|
||||
err = p.RemoveFile("region")
|
||||
} else {
|
||||
err = p.WriteStringFile("none\n", "region")
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
err = p.RemoveFile(RegionClusterTokenFileName)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (z *Zone) syncZoneRegions() error {
|
||||
name := filepath.Join(z.Name, "regions")
|
||||
name := filepath.Join(z.Name, ZoneRegionsFileName)
|
||||
|
||||
if len(z.Regions) > 0 {
|
||||
var buf bytes.Buffer
|
||||
@@ -210,9 +243,25 @@ func (z *Zone) syncZoneRegions() error {
|
||||
// SyncRegions writes to the file system the regions covered
|
||||
// by this meta-region
|
||||
func (r *Region) SyncRegions() error {
|
||||
name := filepath.Join(r.Name, "regions")
|
||||
if err := r.syncRegionsFile(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(r.Regions) > 0 {
|
||||
return r.syncClusterFile()
|
||||
}
|
||||
|
||||
func (r *Region) mkdir() error {
|
||||
return r.m.MkdirAll(r.Name)
|
||||
}
|
||||
|
||||
func (r *Region) syncRegionsFile() error {
|
||||
var err error
|
||||
|
||||
name := filepath.Join(r.Name, ZoneRegionsFileName)
|
||||
|
||||
if len(r.Regions) == 0 {
|
||||
err = r.m.RemoveFile(name)
|
||||
} else if err = r.mkdir(); err == nil {
|
||||
var buf bytes.Buffer
|
||||
|
||||
for _, s := range r.Regions {
|
||||
@@ -220,12 +269,29 @@ func (r *Region) SyncRegions() error {
|
||||
_, _ = buf.WriteRune('\n')
|
||||
}
|
||||
|
||||
if err := r.m.MkdirAll(r.Name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return r.m.WriteStringFile(buf.String(), name)
|
||||
err = r.m.WriteStringFile(buf.String(), name)
|
||||
}
|
||||
|
||||
return r.m.RemoveFile(name)
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *Region) syncClusterFile() error {
|
||||
var err error
|
||||
|
||||
name := filepath.Join(r.Name, RegionClusterTokenFileName)
|
||||
|
||||
if r.Cluster == nil {
|
||||
err = r.m.RemoveFile(name)
|
||||
} else if err = r.mkdir(); err == nil {
|
||||
var buf bytes.Buffer
|
||||
|
||||
_, _ = buf.WriteString(*r.Cluster)
|
||||
if buf.Len() > 0 {
|
||||
_, _ = buf.WriteRune('\n')
|
||||
}
|
||||
|
||||
err = r.m.WriteStringFile(buf.String(), name)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user
What happens if the token file has no non-empty lines?
it's marked as cluster but without token (yet)
my intention was to generate the token when installing the first member of such cluster