cluster: introduce Region.Cluser and m/{region}/k8s_token to store a cluster's token #42

Merged
karasz merged 3 commits from pr-amery-k8s_token into main 2024-03-19 17:44:48 +01:00
2 changed files with 113 additions and 14 deletions
+33
View File
@@ -4,6 +4,7 @@ import (
"io/fs" "io/fs"
"path" "path"
"sort" "sort"
"strings"
"darvaza.org/core" "darvaza.org/core"
) )
@@ -12,6 +13,10 @@ const (
// ZoneRegionsFileName indicates the file containing // ZoneRegionsFileName indicates the file containing
// region names as references // region names as references
ZoneRegionsFileName = "regions" ZoneRegionsFileName = "regions"
// RegionClusterTokenFileName contains the kubernetes
// token of the cluster this region represents
RegionClusterTokenFileName = "k8s_token"
) )
func (m *Cluster) scan(opts *ScanOptions) error { func (m *Cluster) scan(opts *ScanOptions) error {
@@ -186,6 +191,8 @@ func (z *Zone) scan() error {
switch { switch {
case name == ZoneRegionsFileName: case name == ZoneRegionsFileName:
err = z.loadRegions() err = z.loadRegions()
case name == RegionClusterTokenFileName:
err = z.loadClusterToken()
case e.IsDir(): case e.IsDir():
err = z.scanSubdirectory(name) err = z.scanSubdirectory(name)
default: default:
@@ -218,6 +225,32 @@ func (z *Zone) loadRegions() error {
return err 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
Outdated
Review

What happens if the token file has no non-empty lines?

What happens if the token file has no non-empty lines?
Outdated
Review

it's marked as cluster but without token (yet)

my intention was to generate the token when installing the first member of such cluster

it's marked as cluster but without token (yet) my intention was to generate the token when installing the first member of such cluster
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 { func (z *Zone) scanSubdirectory(name string) error {
m := &Machine{ m := &Machine{
zone: z, zone: z,
+80 -14
View File
@@ -16,6 +16,7 @@ type Region struct {
zones []*Zone zones []*Zone
Name string Name string
Cluster *string `json:",omitempty" yaml:",omitempty"`
Regions []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) { func (m *Cluster) appendRegionRegions(name string, subs ...string) {
for i := range m.Regions { for i := range m.Regions {
r := &m.Regions[i] r := &m.Regions[i]
@@ -178,11 +199,7 @@ func (z *Zone) SyncRegions() error {
err := z.syncZoneRegions() err := z.syncZoneRegions()
if err == nil { if err == nil {
z.ForEachMachine(func(p *Machine) bool { z.ForEachMachine(func(p *Machine) bool {
if p.IsActive() { err = z.syncMachineRegions(p)
err = p.RemoveFile("region")
} else {
err = p.WriteStringFile("none\n", "region")
}
return err != nil return err != nil
}) })
} }
@@ -190,8 +207,24 @@ func (z *Zone) SyncRegions() error {
return err 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 { func (z *Zone) syncZoneRegions() error {
name := filepath.Join(z.Name, "regions") name := filepath.Join(z.Name, ZoneRegionsFileName)
if len(z.Regions) > 0 { if len(z.Regions) > 0 {
var buf bytes.Buffer var buf bytes.Buffer
@@ -210,9 +243,25 @@ func (z *Zone) syncZoneRegions() error {
// SyncRegions writes to the file system the regions covered // SyncRegions writes to the file system the regions covered
// by this meta-region // by this meta-region
func (r *Region) SyncRegions() error { 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 var buf bytes.Buffer
for _, s := range r.Regions { for _, s := range r.Regions {
@@ -220,12 +269,29 @@ func (r *Region) SyncRegions() error {
_, _ = buf.WriteRune('\n') _, _ = buf.WriteRune('\n')
} }
if err := r.m.MkdirAll(r.Name); err != nil { err = r.m.WriteStringFile(buf.String(), name)
return err
}
return 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
} }