github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/startVm.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 7 "github.com/Cloud-Foundations/Dominator/lib/errors" 8 "github.com/Cloud-Foundations/Dominator/lib/log" 9 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 10 ) 11 12 func startVmSubcommand(args []string, logger log.DebugLogger) error { 13 if err := startVm(args[0], logger); err != nil { 14 return fmt.Errorf("Error starting VM: %s", err) 15 } 16 return nil 17 } 18 19 func startVm(vmHostname string, logger log.DebugLogger) error { 20 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 21 return err 22 } else { 23 return startVmOnHypervisor(hypervisor, vmIP, logger) 24 } 25 } 26 27 func startVmOnHypervisor(hypervisor string, ipAddr net.IP, 28 logger log.DebugLogger) error { 29 request := proto.StartVmRequest{ 30 DhcpTimeout: *dhcpTimeout, 31 IpAddress: ipAddr, 32 } 33 client, err := dialHypervisor(hypervisor) 34 if err != nil { 35 return err 36 } 37 defer client.Close() 38 var reply proto.StartVmResponse 39 err = client.RequestReply("Hypervisor.StartVm", request, &reply) 40 if err != nil { 41 return err 42 } 43 if err := errors.New(reply.Error); err != nil { 44 return err 45 } 46 if reply.DhcpTimedOut { 47 return errors.New("DHCP ACK timed out") 48 } 49 return maybeWatchVm(client, hypervisor, ipAddr, logger) 50 }