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