github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/stopVm.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  
     7  	hyperclient "github.com/Cloud-Foundations/Dominator/hypervisor/client"
     8  	"github.com/Cloud-Foundations/Dominator/lib/log"
     9  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    10  )
    11  
    12  func stopVmSubcommand(args []string, logger log.DebugLogger) error {
    13  	if err := stopVm(args[0], logger); err != nil {
    14  		return fmt.Errorf("Error stopping VM: %s", err)
    15  	}
    16  	return nil
    17  }
    18  
    19  func logVmName(client *srpc.Client, ipAddr net.IP, action string,
    20  	logger log.DebugLogger) {
    21  	if vmInfo, err := hyperclient.GetVmInfo(client, ipAddr); err != nil {
    22  		return
    23  	} else {
    24  		name := vmInfo.Hostname
    25  		if name == "" {
    26  			name = vmInfo.Tags["Name"]
    27  		}
    28  		if name == "" {
    29  			return
    30  		}
    31  		logger.Debugf(0, "%s %s\n", action, name)
    32  	}
    33  }
    34  
    35  func stopVm(vmHostname string, logger log.DebugLogger) error {
    36  	if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil {
    37  		return err
    38  	} else {
    39  		return stopVmOnHypervisor(hypervisor, vmIP, logger)
    40  	}
    41  }
    42  
    43  func stopVmOnHypervisor(hypervisor string, ipAddr net.IP,
    44  	logger log.DebugLogger) error {
    45  	client, err := dialHypervisor(hypervisor)
    46  	if err != nil {
    47  		return err
    48  	}
    49  	defer client.Close()
    50  	logVmName(client, ipAddr, "stopping", logger)
    51  	return hyperclient.StopVm(client, ipAddr, nil)
    52  }