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  }