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  }