From d5cfa42e05cf07042dab99753c6aae468e3d0215 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 5 Jun 2013 17:59:33 -0700 Subject: [PATCH] builder/vmware: Wait a minimum time before shutting down VM --- builder/vmware/step_run.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/builder/vmware/step_run.go b/builder/vmware/step_run.go index de331ba5f..7dc096a88 100644 --- a/builder/vmware/step_run.go +++ b/builder/vmware/step_run.go @@ -18,7 +18,8 @@ import ( // Produces: // type stepRun struct { - vmxPath string + bootTime time.Time + vmxPath string } func (s *stepRun) Run(state map[string]interface{}) multistep.StepAction { @@ -28,16 +29,17 @@ func (s *stepRun) Run(state map[string]interface{}) multistep.StepAction { vmrun_path := "/Applications/VMware Fusion.app/Contents/Library/vmrun" + // Set the VMX path so that we know we started the machine + s.bootTime = time.Now() + s.vmxPath = vmxPath + ui.Say("Starting virtual machine...") - cmd := exec.Command(vmrun_path, "-T", "fusion", "start", vmxPath, "gui") + cmd := exec.Command(vmrun_path, "-T", "fusion", "start", s.vmxPath, "gui") if err := cmd.Run(); err != nil { ui.Error(fmt.Sprintf("Error starting VM: %s", err)) return multistep.ActionHalt } - // Set the VMX path so that we know we started the machine - s.vmxPath = vmxPath - // Wait the wait amount if config.BootWait > 0 { ui.Say(fmt.Sprintf("Waiting %d seconds for boot...", config.BootWait)) @@ -54,6 +56,13 @@ func (s *stepRun) Cleanup(state map[string]interface{}) { // If we started the machine... stop it. if s.vmxPath != "" { + // If we started it less than 5 seconds ago... wait. + sinceBootTime := time.Since(s.bootTime) + waitBootTime := 5 * time.Second + if sinceBootTime < waitBootTime { + time.Sleep(waitBootTime - sinceBootTime) + } + ui.Say("Stopping virtual machine...") cmd := exec.Command(vmrun_path, "-T", "fusion", "stop", s.vmxPath, "hard") if err := cmd.Run(); err != nil {