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  }