github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/getVmInfo.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 8 "github.com/Cloud-Foundations/Dominator/lib/errors" 9 "github.com/Cloud-Foundations/Dominator/lib/json" 10 "github.com/Cloud-Foundations/Dominator/lib/log" 11 "github.com/Cloud-Foundations/Dominator/lib/srpc" 12 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 13 ) 14 15 func getVmInfoSubcommand(args []string, logger log.DebugLogger) error { 16 if err := getVmInfo(args[0], logger); err != nil { 17 return fmt.Errorf("Error getting VM info: %s", err) 18 } 19 return nil 20 } 21 22 func getVmInfo(vmHostname string, logger log.DebugLogger) error { 23 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 24 return err 25 } else { 26 return getVmInfoOnHypervisor(hypervisor, vmIP, logger) 27 } 28 } 29 30 func getVmInfoOnHypervisor(hypervisor string, ipAddr net.IP, 31 logger log.DebugLogger) error { 32 client, err := dialHypervisor(hypervisor) 33 if err != nil { 34 return err 35 } 36 defer client.Close() 37 if vmInfo, err := getVmInfoClient(client, ipAddr); err != nil { 38 return err 39 } else { 40 return json.WriteWithIndent(os.Stdout, " ", vmInfo) 41 } 42 } 43 44 func getVmInfoClient(client *srpc.Client, ipAddr net.IP) (proto.VmInfo, error) { 45 request := proto.GetVmInfoRequest{ipAddr} 46 var reply proto.GetVmInfoResponse 47 err := client.RequestReply("Hypervisor.GetVmInfo", request, &reply) 48 if err != nil { 49 return proto.VmInfo{}, err 50 } 51 if err := errors.New(reply.Error); err != nil { 52 return proto.VmInfo{}, err 53 } 54 return reply.VmInfo, nil 55 }