12 changed files with 123 additions and 115 deletions
			
			
		| @ -1,2 +1,74 @@ | ||||
| // Package cluster contains information about the cluster
 | ||||
| package cluster | ||||
| 
 | ||||
| import ( | ||||
| 	"io/fs" | ||||
| 
 | ||||
| 	"darvaza.org/resolver" | ||||
| 	"darvaza.org/slog" | ||||
| 	"github.com/gofrs/uuid/v5" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	_ MachineIterator = (*Cluster)(nil) | ||||
| 	_ ZoneIterator    = (*Cluster)(nil) | ||||
| ) | ||||
| 
 | ||||
| // revive:disable:line-length-limit
 | ||||
| 
 | ||||
| // Cluster represents all zones in a cluster
 | ||||
| type Cluster struct { | ||||
| 	dir      fs.FS | ||||
| 	log      slog.Logger | ||||
| 	resolver resolver.Resolver | ||||
| 	domain   string | ||||
| 
 | ||||
| 	CephFSID uuid.UUID `json:"ceph_fsid,omitempty" yaml:"ceph_fsid,omitempty"` | ||||
| 	Zones    []*Zone | ||||
| } | ||||
| 
 | ||||
| // revive:enable:line-length-limit
 | ||||
| 
 | ||||
| // ForEachMachine calls a function for each Machine in the cluster
 | ||||
| // until instructed to terminate the loop
 | ||||
| func (m *Cluster) ForEachMachine(fn func(*Machine) bool) { | ||||
| 	m.ForEachZone(func(z *Zone) bool { | ||||
| 		var term bool | ||||
| 
 | ||||
| 		z.ForEachMachine(func(p *Machine) bool { | ||||
| 			term = fn(p) | ||||
| 			return term | ||||
| 		}) | ||||
| 
 | ||||
| 		return term | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| // ForEachZone calls a function for each Zone in the cluster
 | ||||
| // until instructed to terminate the loop
 | ||||
| func (m *Cluster) ForEachZone(fn func(*Zone) bool) { | ||||
| 	for _, p := range m.Zones { | ||||
| 		if fn(p) { | ||||
| 			// terminate
 | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // GetMachineByName looks for a machine with the specified
 | ||||
| // name on any zone
 | ||||
| func (m *Cluster) GetMachineByName(name string) (*Machine, bool) { | ||||
| 	var out *Machine | ||||
| 
 | ||||
| 	if name != "" { | ||||
| 		m.ForEachMachine(func(p *Machine) bool { | ||||
| 			if p.Name == name { | ||||
| 				out = p | ||||
| 			} | ||||
| 
 | ||||
| 			return out != nil | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
| 	return out, out != nil | ||||
| } | ||||
|  | ||||
					Loading…
					
					
				
		Reference in new issue