From d3bbe6d270852c570a524f8ea35058aa08586b25 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 2 Mar 2024 20:18:52 +0000 Subject: [PATCH] cluster: introduce Region.Cluster and m/{region}/k8s_token Signed-off-by: Alejandro Mery --- pkg/cluster/cluster_scan.go | 33 +++++++++++++++++++ pkg/cluster/regions.go | 64 ++++++++++++++++++++++++++++++++++--- 2 files changed, 92 insertions(+), 5 deletions(-) diff --git a/pkg/cluster/cluster_scan.go b/pkg/cluster/cluster_scan.go index 4b453d4..79eda5d 100644 --- a/pkg/cluster/cluster_scan.go +++ b/pkg/cluster/cluster_scan.go @@ -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 + 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, diff --git a/pkg/cluster/regions.go b/pkg/cluster/regions.go index a79ced5..e2215a5 100644 --- a/pkg/cluster/regions.go +++ b/pkg/cluster/regions.go @@ -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] @@ -210,9 +231,25 @@ func (z *Zone) syncZoneRegions() error { // SyncRegions writes to the file system the regions covered // by this meta-region func (r *Region) SyncRegions() error { + if err := r.syncRegionsFile(); err != nil { + return err + } + + 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 { + 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 +257,29 @@ func (r *Region) SyncRegions() error { _, _ = buf.WriteRune('\n') } - if err := r.m.MkdirAll(r.Name); err != nil { - return err + err = r.m.WriteStringFile(buf.String(), 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') } - return r.m.WriteStringFile(buf.String(), name) + err = r.m.WriteStringFile(buf.String(), name) } - return r.m.RemoveFile(name) + return err }