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 }