diff --git a/builder/virtualbox/common/driver_4_2.go b/builder/virtualbox/common/driver_4_2.go index 86edd9174..e1a1a0119 100644 --- a/builder/virtualbox/common/driver_4_2.go +++ b/builder/virtualbox/common/driver_4_2.go @@ -165,9 +165,6 @@ func (d *VBox42Driver) Stop(name string) error { return err } - // We sleep here for a little bit to let the session "unlock" - time.Sleep(2 * time.Second) - return nil } @@ -189,7 +186,18 @@ func (d *VBox42Driver) SuppressMessages() error { } func (d *VBox42Driver) VBoxManage(args ...string) error { - _, err := d.VBoxManageWithOutput(args...) + ctx := context.TODO() + err := retry.Config{ + Tries: 5, + ShouldRetry: func(err error) bool { + return strings.Contains(err.Error(), "VBOX_E_INVALID_OBJECT_STATE") + }, + RetryDelay: func() time.Duration { return 2 * time.Minute }, + }.Run(ctx, func(ctx context.Context) error { + _, err := d.VBoxManageWithOutput(args...) + return err + }) + return err } diff --git a/builder/virtualbox/common/shutdown_config.go b/builder/virtualbox/common/shutdown_config.go index 0a626c9c7..48ad9c61d 100644 --- a/builder/virtualbox/common/shutdown_config.go +++ b/builder/virtualbox/common/shutdown_config.go @@ -41,5 +41,9 @@ func (c *ShutdownConfig) Prepare(ctx *interpolate.Context) []error { c.ShutdownTimeout = 5 * time.Minute } + if c.PostShutdownDelay == 0 { + c.PostShutdownDelay = 2 * time.Second + } + return nil } diff --git a/builder/virtualbox/common/shutdown_config_test.go b/builder/virtualbox/common/shutdown_config_test.go index e5afd6f0b..3e177fd5f 100644 --- a/builder/virtualbox/common/shutdown_config_test.go +++ b/builder/virtualbox/common/shutdown_config_test.go @@ -49,8 +49,8 @@ func TestShutdownConfigPrepare_PostShutdownDelay(t *testing.T) { if len(errs) > 0 { t.Fatalf("err: %#v", errs) } - if c.PostShutdownDelay.Nanoseconds() != 0 { - t.Fatalf("bad: %s", c.PostShutdownDelay) + if c.PostShutdownDelay != 2*time.Second { + t.Fatalf("bad: PostShutdownDelay should be 2 seconds but was %s", c.PostShutdownDelay) } // Test with a good one