Alejandro Mery
1 year ago
3 changed files with 137 additions and 0 deletions
@ -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 |
||||||
|
} |
@ -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 |
||||||
|
} |
@ -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…
Reference in new issue