github.com/Cloud-Foundations/Dominator@v0.3.4/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{ 48 HypervisorTagsToMatch: hypervisorTagsToMatch, 49 Location: location, 50 OwnerGroups: ownerGroups, 51 OwnerUsers: ownerUsers, 52 VmTagsToMatch: vmTagsToMatch, 53 } 54 if err := conn.Encode(request); err != nil { 55 return err 56 } 57 if err := conn.Flush(); err != nil { 58 return err 59 } 60 var addresses []string 61 for { 62 var reply fm_proto.ListVMsInLocationResponse 63 if err := conn.Decode(&reply); err != nil { 64 return err 65 } 66 if err := errors.New(reply.Error); err != nil { 67 return err 68 } 69 if len(reply.IpAddresses) < 1 { 70 break 71 } 72 for _, ipAddress := range reply.IpAddresses { 73 addresses = append(addresses, ipAddress.String()) 74 } 75 } 76 verstr.Sort(addresses) 77 for _, address := range addresses { 78 if _, err := fmt.Println(address); err != nil { 79 return err 80 } 81 } 82 return nil 83 } 84 85 func listVMsOnHypervisor(hypervisor string, logger log.DebugLogger) error { 86 client, err := dialHypervisor(hypervisor) 87 if err != nil { 88 return err 89 } 90 defer client.Close() 91 request := hyper_proto.ListVMsRequest{ 92 OwnerGroups: ownerGroups, 93 OwnerUsers: ownerUsers, 94 Sort: true, 95 VmTagsToMatch: vmTagsToMatch, 96 } 97 var reply hyper_proto.ListVMsResponse 98 err = client.RequestReply("Hypervisor.ListVMs", request, &reply) 99 if err != nil { 100 return err 101 } 102 for _, ipAddress := range reply.IpAddresses { 103 if _, err := fmt.Println(ipAddress); err != nil { 104 return err 105 } 106 } 107 return nil 108 }