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 }