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  }