github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/listVMs.go (about) 1 package main 2 3 import ( 4 "fmt" 5 6 "github.com/Cloud-Foundations/Dominator/lib/errors" 7 "github.com/Cloud-Foundations/Dominator/lib/log" 8 "github.com/Cloud-Foundations/Dominator/lib/verstr" 9 fm_proto "github.com/Cloud-Foundations/Dominator/proto/fleetmanager" 10 hyper_proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 11 ) 12 13 func listVMsSubcommand(args []string, logger log.DebugLogger) error { 14 if err := listVMs(logger); err != nil { 15 return fmt.Errorf("Error listing VMs: %s", err) 16 } 17 return nil 18 } 19 20 func listVMs(logger log.DebugLogger) error { 21 if *hypervisorHostname != "" { 22 return listVMsOnHypervisor( 23 fmt.Sprintf("%s:%d", *hypervisorHostname, *hypervisorPortNum), 24 logger) 25 } 26 if *fleetManagerHostname != "" { 27 fleetManager := fmt.Sprintf("%s:%d", 28 *fleetManagerHostname, *fleetManagerPortNum) 29 return listVMsByLocation(fleetManager, *location, logger) 30 } 31 return listVMsOnHypervisor(fmt.Sprintf("localhost:%d", *hypervisorPortNum), 32 logger) 33 } 34 35 func listVMsByLocation(fleetManager string, location string, 36 logger log.DebugLogger) error { 37 client, err := dialFleetManager(fleetManager) 38 if err != nil { 39 return err 40 } 41 defer client.Close() 42 conn, err := client.Call("FleetManager.ListVMsInLocation") 43 if err != nil { 44 return err 45 } 46 defer conn.Close() 47 request := fm_proto.ListVMsInLocationRequest{location} 48 if err := conn.Encode(request); err != nil { 49 return err 50 } 51 if err := conn.Flush(); err != nil { 52 return err 53 } 54 var addresses []string 55 for { 56 var reply fm_proto.ListVMsInLocationResponse 57 if err := conn.Decode(&reply); err != nil { 58 return err 59 } 60 if err := errors.New(reply.Error); err != nil { 61 return err 62 } 63 if len(reply.IpAddresses) < 1 { 64 break 65 } 66 for _, ipAddress := range reply.IpAddresses { 67 addresses = append(addresses, ipAddress.String()) 68 } 69 } 70 verstr.Sort(addresses) 71 for _, address := range addresses { 72 if _, err := fmt.Println(address); err != nil { 73 return err 74 } 75 } 76 return nil 77 } 78 79 func listVMsOnHypervisor(hypervisor string, logger log.DebugLogger) error { 80 client, err := dialHypervisor(hypervisor) 81 if err != nil { 82 return err 83 } 84 defer client.Close() 85 request := hyper_proto.ListVMsRequest{ 86 OwnerUsers: ownerUsers, 87 Sort: true, 88 } 89 var reply hyper_proto.ListVMsResponse 90 err = client.RequestReply("Hypervisor.ListVMs", request, &reply) 91 if err != nil { 92 return err 93 } 94 for _, ipAddress := range reply.IpAddresses { 95 if _, err := fmt.Println(ipAddress); err != nil { 96 return err 97 } 98 } 99 return nil 100 }