github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/fleetmanager/hypervisors/get.go (about) 1 package hypervisors 2 3 import ( 4 "errors" 5 "net" 6 7 "github.com/Cloud-Foundations/Dominator/fleetmanager/topology" 8 proto "github.com/Cloud-Foundations/Dominator/proto/fleetmanager" 9 ) 10 11 func (m *Manager) getLockedHypervisor(name string, 12 writeLock bool) (*hypervisorType, error) { 13 m.mutex.RLock() 14 defer m.mutex.RUnlock() 15 if hypervisor, ok := m.hypervisors[name]; !ok { 16 return nil, errors.New("Hypervisor not found") 17 } else { 18 if writeLock { 19 hypervisor.mutex.Lock() 20 } else { 21 hypervisor.mutex.RLock() 22 } 23 return hypervisor, nil 24 } 25 } 26 27 func (m *Manager) getHypervisorForVm(ipAddr net.IP) (string, error) { 28 addr := ipAddr.String() 29 m.mutex.RLock() 30 defer m.mutex.RUnlock() 31 if vm, ok := m.vms[addr]; !ok { 32 return "", errors.New("VM not found") 33 } else { 34 return vm.hypervisor.machine.Hostname, nil 35 } 36 } 37 38 func (m *Manager) getMachineInfo(hostname string) (proto.Machine, error) { 39 if !*manageHypervisors { 40 return proto.Machine{}, 41 errors.New("this is a read-only Fleet Manager: full machine information is not available") 42 } 43 if hypervisor, err := m.getLockedHypervisor(hostname, false); err != nil { 44 return proto.Machine{}, err 45 } else { 46 defer hypervisor.mutex.RUnlock() 47 return *hypervisor.getMachineLocked(), nil 48 } 49 } 50 51 func (m *Manager) getTopology() (*topology.Topology, error) { 52 m.mutex.RLock() 53 defer m.mutex.RUnlock() 54 if m.topology == nil { 55 return nil, errors.New("no topology available") 56 } 57 return m.topology, nil 58 }