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 }