github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/findHypervisor.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"time"
     7  
     8  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     9  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    10  	proto "github.com/Cloud-Foundations/Dominator/proto/fleetmanager"
    11  )
    12  
    13  func findHypervisor(vmIpAddr net.IP) (string, error) {
    14  	if *hypervisorHostname != "" {
    15  		return fmt.Sprintf("%s:%d", *hypervisorHostname, *hypervisorPortNum),
    16  			nil
    17  	} else if *fleetManagerHostname != "" {
    18  		cm := fmt.Sprintf("%s:%d", *fleetManagerHostname, *fleetManagerPortNum)
    19  		client, err := dialFleetManager(cm)
    20  		if err != nil {
    21  			return "", err
    22  		}
    23  		defer client.Close()
    24  		return findHypervisorClient(client, vmIpAddr)
    25  	} else {
    26  		return fmt.Sprintf("localhost:%d", *hypervisorPortNum), nil
    27  	}
    28  }
    29  
    30  func findHypervisorClient(client *srpc.Client,
    31  	vmIpAddr net.IP) (string, error) {
    32  	request := proto.GetHypervisorForVMRequest{vmIpAddr}
    33  	var reply proto.GetHypervisorForVMResponse
    34  	err := client.RequestReply("FleetManager.GetHypervisorForVM", request,
    35  		&reply)
    36  	if err != nil {
    37  		return "", err
    38  	}
    39  	if err := errors.New(reply.Error); err != nil {
    40  		return "", err
    41  	}
    42  	return reply.HypervisorAddress, nil
    43  }
    44  
    45  func lookupIP(vmHostname string) (net.IP, error) {
    46  	if ips, err := net.LookupIP(vmHostname); err != nil {
    47  		return nil, err
    48  	} else if len(ips) != 1 {
    49  		return nil, fmt.Errorf("num IPs: %d != 1", len(ips))
    50  	} else {
    51  		return ips[0], nil
    52  	}
    53  }
    54  
    55  func lookupVmAndHypervisor(vmHostname string) (net.IP, string, error) {
    56  	if vmIpAddr, err := lookupIP(vmHostname); err != nil {
    57  		return nil, "", err
    58  	} else if hypervisor, err := findHypervisor(vmIpAddr); err != nil {
    59  		return nil, "", err
    60  	} else {
    61  		return vmIpAddr, hypervisor, nil
    62  	}
    63  }
    64  
    65  func searchVmAndHypervisor(vmHostname string) (net.IP, string, error) {
    66  	if *fleetManagerHostname == "" {
    67  		return nil, "", fmt.Errorf("no fleet manager specified")
    68  	}
    69  	vmIpAddr, err := lookupIP(vmHostname)
    70  	if err != nil {
    71  		return nil, "", err
    72  	}
    73  	cm := fmt.Sprintf("%s:%d", *fleetManagerHostname, *fleetManagerPortNum)
    74  	client, err := srpc.DialHTTP("tcp", cm, time.Second*10)
    75  	if err != nil {
    76  		return nil, "", err
    77  	}
    78  	defer client.Close()
    79  	if hypervisor, err := findHypervisorClient(client, vmIpAddr); err != nil {
    80  		return nil, "", err
    81  	} else {
    82  		return vmIpAddr, hypervisor, nil
    83  	}
    84  }