github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/helper/resource/wait.go (about) 1 package resource 2 3 import ( 4 "time" 5 ) 6 7 // RetryFunc is the function retried until it succeeds. 8 type RetryFunc func() error 9 10 // Retry is a basic wrapper around StateChangeConf that will just retry 11 // a function until it no longer returns an error. 12 func Retry(timeout time.Duration, f RetryFunc) error { 13 c := &StateChangeConf{ 14 Pending: []string{"error"}, 15 Target: []string{"success"}, 16 Timeout: timeout, 17 MinTimeout: 500 * time.Millisecond, 18 Refresh: func() (interface{}, string, error) { 19 err := f() 20 if err == nil { 21 return 42, "success", nil 22 } 23 24 if rerr, ok := err.(RetryError); ok { 25 err = rerr.Err 26 return nil, "quit", err 27 } 28 29 return 42, "error", nil 30 }, 31 } 32 33 _, err := c.WaitForState() 34 return err 35 } 36 37 // RetryError, if returned, will quit the retry immediately with the 38 // Err. 39 type RetryError struct { 40 Err error 41 } 42 43 func (e RetryError) Error() string { 44 return e.Err.Error() 45 }