github.phpd.cn/hashicorp/packer@v1.3.2/builder/hyperv/common/step_run.go (about) 1 package common 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 8 "github.com/hashicorp/packer/helper/multistep" 9 "github.com/hashicorp/packer/packer" 10 ) 11 12 type StepRun struct { 13 GuiCancelFunc context.CancelFunc 14 Headless bool 15 vmName string 16 } 17 18 func (s *StepRun) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 19 driver := state.Get("driver").(Driver) 20 ui := state.Get("ui").(packer.Ui) 21 vmName := state.Get("vmName").(string) 22 23 ui.Say("Starting the virtual machine...") 24 25 err := driver.Start(vmName) 26 if err != nil { 27 err := fmt.Errorf("Error starting vm: %s", err) 28 state.Put("error", err) 29 ui.Error(err.Error()) 30 return multistep.ActionHalt 31 } 32 33 s.vmName = vmName 34 35 if !s.Headless { 36 ui.Say("Attempting to connect with vmconnect...") 37 s.GuiCancelFunc, err = driver.Connect(vmName) 38 if err != nil { 39 log.Printf(fmt.Sprintf("Non-fatal error starting vmconnect: %s. continuing...", err)) 40 } 41 } 42 return multistep.ActionContinue 43 } 44 45 func (s *StepRun) Cleanup(state multistep.StateBag) { 46 if s.vmName == "" { 47 return 48 } 49 50 driver := state.Get("driver").(Driver) 51 ui := state.Get("ui").(packer.Ui) 52 53 if !s.Headless && s.GuiCancelFunc != nil { 54 ui.Say("Disconnecting from vmconnect...") 55 s.GuiCancelFunc() 56 } 57 58 if running, _ := driver.IsRunning(s.vmName); running { 59 if err := driver.Stop(s.vmName); err != nil { 60 ui.Error(fmt.Sprintf("Error shutting down VM: %s", err)) 61 } 62 } 63 }