Return a MultiError from retry.

pull/454/head
Dan Lorenc 2016-08-06 12:29:56 -07:00
parent a76133b5e3
commit b85a90702a
4 changed files with 45 additions and 44 deletions

View File

@ -111,35 +111,13 @@ func StopHost(api libmachine.API) error {
return nil 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. // DeleteHost deletes the host VM.
func DeleteHost(api libmachine.API) error { func DeleteHost(api libmachine.API) error {
host, err := api.Load(constants.MachineName) host, err := api.Load(constants.MachineName)
if err != nil { if err != nil {
return err return err
} }
m := multiError{} m := util.MultiError{}
m.Collect(host.Driver.Remove()) m.Collect(host.Driver.Remove())
m.Collect(api.Remove(constants.MachineName)) m.Collect(api.Remove(constants.MachineName))
return m.ToError() return m.ToError()

View File

@ -234,26 +234,6 @@ func TestStopHost(t *testing.T) {
if s, _ := h.Driver.GetState(); s != state.Stopped { if s, _ := h.Driver.GetState(); s != state.Stopped {
t.Fatalf("Machine not stopped. Currently in state: %s", s) 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) { func TestDeleteHost(t *testing.T) {

View File

@ -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) { func RetryAfter(attempts int, callback func() error, d time.Duration) (err error) {
m := MultiError{}
for i := 0; i < attempts; i++ { for i := 0; i < attempts; i++ {
err = callback() err = callback()
if err == nil { if err == nil {
return nil return nil
} }
m.Collect(err)
time.Sleep(d) time.Sleep(d)
} }
return err return m.ToError()
} }
func GetLocalkubeDownloadURL(versionOrURL string, filename string) (string, error) { 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 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"))
}

View File

@ -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)
}
}