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  }