diff --git a/drivers/virtualbox/vbm.go b/drivers/virtualbox/vbm.go index c2b5180acd..632b61ddbc 100644 --- a/drivers/virtualbox/vbm.go +++ b/drivers/virtualbox/vbm.go @@ -14,6 +14,10 @@ import ( "github.com/docker/machine/libmachine/log" ) +const ( + retryCountOnObjectNotReadyError = 5 +) + var ( reColonLine = regexp.MustCompile(`(.+):\s+(.*)`) reEqualLine = regexp.MustCompile(`(.+)=(.*)`) @@ -49,6 +53,10 @@ func (v *VBoxCmdManager) vbmOut(args ...string) (string, error) { } func (v *VBoxCmdManager) vbmOutErr(args ...string) (string, string, error) { + return v.vbmOutErrRetry(retryCountOnObjectNotReadyError, args...) +} + +func (v *VBoxCmdManager) vbmOutErrRetry(retry int, args ...string) (string, string, error) { cmd := exec.Command(vboxManageCmd, args...) log.Debugf("COMMAND: %v %v", vboxManageCmd, strings.Join(args, " ")) var stdout bytes.Buffer @@ -68,6 +76,13 @@ func (v *VBoxCmdManager) vbmOutErr(args ...string) (string, string, error) { } } + // Sometimes, we just need to retry... + if retry > 0 { + if strings.Contains(stderrStr, "error: The object is not ready") { + return v.vbmOutErrRetry(retry-1, args...) + } + } + if err == nil || strings.HasPrefix(err.Error(), "exit status ") { // VBoxManage will sometimes not set the return code, but has a fatal error // such as VBoxManage.exe: error: VT-x is not available. (VERR_VMX_NO_VMX)