Browse Source

zones: add initial m/ scanner

Signed-off-by: Alejandro Mery <amery@jpi.io>
pull/1/head
Alejandro Mery 11 months ago
parent
commit
1ea1ab4ac4
  1. 40
      pkg/zones/machine.go
  2. 51
      pkg/zones/scan.go
  3. 46
      pkg/zones/zones.go

40
pkg/zones/machine.go

@ -0,0 +1,40 @@
package zones
import (
"strconv"
"sync"
)
// A Machine is a machine on a Zone
type Machine struct {
mu sync.Mutex
zone *Zone
id int
Name string
}
func (m *Machine) String() string {
return m.Name
}
// ID return the index within the [Zone] associated to this [Machine]
func (m *Machine) ID() int {
m.mu.Lock()
defer m.mu.Unlock()
if m.id == 0 {
zoneName := m.zone.Name
s := m.Name[len(zoneName)+1:]
id, err := strconv.ParseInt(s, 10, 8)
if err != nil {
panic(err)
}
m.id = int(id)
}
return m.id
}

51
pkg/zones/scan.go

@ -0,0 +1,51 @@
package zones
import (
"io/fs"
)
func (m *Zones) scan() error {
// each directory is a zone
entries, err := fs.ReadDir(m.dir, ".")
if err != nil {
return err
}
for _, e := range entries {
if e.IsDir() {
z := &Zone{
zones: m,
Name: e.Name(),
}
if err := z.scan(); err != nil {
return err
}
m.Zones = append(m.Zones, z)
}
}
return nil
}
func (z *Zone) scan() error {
// each directory is a machine
entries, err := fs.ReadDir(z.zones.dir, z.Name)
if err != nil {
return err
}
for _, e := range entries {
if e.IsDir() {
m := &Machine{
zone: z,
Name: e.Name(),
}
z.Machines = append(z.Machines, m)
}
}
return nil
}

46
pkg/zones/zones.go

@ -0,0 +1,46 @@
// Package zones contains information about the cluster
package zones
import (
"io/fs"
"os"
)
// Zone represents one zone in a cluster
type Zone struct {
zones *Zones
ID int
Name string
Machines []*Machine `toml:"machines"`
}
func (z *Zone) String() string {
return z.Name
}
// Zones represents all zones in a cluster
type Zones struct {
dir fs.FS
Zones []*Zone `toml:"zones"`
}
// NewFS builds a [Zones] tree using the given directory
func NewFS(dir fs.FS) (*Zones, error) {
z := &Zones{
dir: dir,
}
if err := z.scan(); err != nil {
return nil, err
}
return z, nil
}
// New builds a [Zones] tree using the given directory
func New(dir string) (*Zones, error) {
return NewFS(os.DirFS(dir))
}
Loading…
Cancel
Save