diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 3d80509440d82998357e2731d2a69923d09076a3..025b72e4e498dbefaa2d625666ec2229dd9c7187 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -22,7 +22,7 @@ import ( "strconv" "strings" - "github.com/docker/go-units" + units "github.com/docker/go-units" "github.com/docker/machine/libmachine" "github.com/docker/machine/libmachine/host" "github.com/golang/glog" @@ -75,6 +75,9 @@ func runStart(cmd *cobra.Command, args []string) { var host *host.Host start := func() (err error) { host, err = cluster.StartHost(api, config) + if err != nil { + glog.Errorf("Error starting host: %s. Retrying.\n", err) + } return err } err := util.Retry(3, start) diff --git a/pkg/minikube/cluster/cluster.go b/pkg/minikube/cluster/cluster.go index a43f4ade1d4e0813c87f6fe347e4492c40b9bf18..0e5ae9fb0e4956edffeb6f8ac44086737d6646d1 100644 --- a/pkg/minikube/cluster/cluster.go +++ b/pkg/minikube/cluster/cluster.go @@ -111,35 +111,13 @@ func StopHost(api libmachine.API) error { return nil } -type multiError struct { - Errors []error -} - -func (m *multiError) Collect(err error) { - if err != nil { - m.Errors = append(m.Errors, err) - } -} - -func (m multiError) ToError() error { - if len(m.Errors) == 0 { - return nil - } - - errStrings := []string{} - for _, err := range m.Errors { - errStrings = append(errStrings, err.Error()) - } - return fmt.Errorf(strings.Join(errStrings, "\n")) -} - // DeleteHost deletes the host VM. func DeleteHost(api libmachine.API) error { host, err := api.Load(constants.MachineName) if err != nil { return err } - m := multiError{} + m := util.MultiError{} m.Collect(host.Driver.Remove()) m.Collect(api.Remove(constants.MachineName)) return m.ToError() diff --git a/pkg/minikube/cluster/cluster_test.go b/pkg/minikube/cluster/cluster_test.go index 162b0edb31917e8b188f489e9573a2f9f19d913b..8ccd0e13e0f893068aeaf79795325b14c60e49c4 100644 --- a/pkg/minikube/cluster/cluster_test.go +++ b/pkg/minikube/cluster/cluster_test.go @@ -234,26 +234,6 @@ func TestStopHost(t *testing.T) { if s, _ := h.Driver.GetState(); s != state.Stopped { t.Fatalf("Machine not stopped. Currently in state: %s", s) } - -} - -func TestMultiError(t *testing.T) { - m := multiError{} - - m.Collect(fmt.Errorf("Error 1")) - m.Collect(fmt.Errorf("Error 2")) - - err := m.ToError() - expected := `Error 1 -Error 2` - if err.Error() != expected { - t.Fatalf("%s != %s", err, expected) - } - - m = multiError{} - if err := m.ToError(); err != nil { - t.Fatalf("Unexpected error: %s", err) - } } func TestDeleteHost(t *testing.T) { diff --git a/pkg/util/utils.go b/pkg/util/utils.go index 8507cbfae32312d455801873044617069d522b5f..6e93e725aa77f88d3b3234e853ad9f77d42797b0 100644 --- a/pkg/util/utils.go +++ b/pkg/util/utils.go @@ -73,14 +73,16 @@ func Retry(attempts int, callback func() error) (err error) { } func RetryAfter(attempts int, callback func() error, d time.Duration) (err error) { + m := MultiError{} for i := 0; i < attempts; i++ { err = callback() if err == nil { return nil } + m.Collect(err) time.Sleep(d) } - return err + return m.ToError() } func GetLocalkubeDownloadURL(versionOrURL string, filename string) (string, error) { @@ -102,3 +104,25 @@ func GetLocalkubeDownloadURL(versionOrURL string, filename string) (string, erro } return fmt.Sprintf("%s%s/%s", constants.LocalkubeDownloadURLPrefix, versionOrURL, filename), nil } + +type MultiError struct { + Errors []error +} + +func (m *MultiError) Collect(err error) { + if err != nil { + m.Errors = append(m.Errors, err) + } +} + +func (m MultiError) ToError() error { + if len(m.Errors) == 0 { + return nil + } + + errStrings := []string{} + for _, err := range m.Errors { + errStrings = append(errStrings, err.Error()) + } + return fmt.Errorf(strings.Join(errStrings, "\n")) +} diff --git a/pkg/util/utils_test.go b/pkg/util/utils_test.go index b62bfeb48a94a8a55e70f13e7b409d8336f959fb..eae8574186a4149b9f16588d07a00311383db7a1 100644 --- a/pkg/util/utils_test.go +++ b/pkg/util/utils_test.go @@ -89,3 +89,22 @@ func TestGetLocalkubeDownloadURL(t *testing.T) { } } } + +func TestMultiError(t *testing.T) { + m := MultiError{} + + m.Collect(fmt.Errorf("Error 1")) + m.Collect(fmt.Errorf("Error 2")) + + err := m.ToError() + expected := `Error 1 +Error 2` + if err.Error() != expected { + t.Fatalf("%s != %s", err, expected) + } + + m = MultiError{} + if err := m.ToError(); err != nil { + t.Fatalf("Unexpected error: %s", err) + } +}