github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/aws/wafregionl_token_handlers.go (about)

     1  package aws
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/aws/aws-sdk-go/aws/awserr"
     7  	"github.com/aws/aws-sdk-go/service/waf"
     8  	"github.com/aws/aws-sdk-go/service/wafregional"
     9  	"github.com/hashicorp/errwrap"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  )
    12  
    13  type WafRegionalRetryer struct {
    14  	Connection *wafregional.WAFRegional
    15  	Region     string
    16  }
    17  
    18  type withRegionalTokenFunc func(token *string) (interface{}, error)
    19  
    20  func (t *WafRegionalRetryer) RetryWithToken(f withRegionalTokenFunc) (interface{}, error) {
    21  	awsMutexKV.Lock(t.Region)
    22  	defer awsMutexKV.Unlock(t.Region)
    23  
    24  	var out interface{}
    25  	err := resource.Retry(15*time.Minute, func() *resource.RetryError {
    26  		var err error
    27  		var tokenOut *waf.GetChangeTokenOutput
    28  
    29  		tokenOut, err = t.Connection.GetChangeToken(&waf.GetChangeTokenInput{})
    30  		if err != nil {
    31  			return resource.NonRetryableError(errwrap.Wrapf("Failed to acquire change token: {{err}}", err))
    32  		}
    33  
    34  		out, err = f(tokenOut.ChangeToken)
    35  		if err != nil {
    36  			awsErr, ok := err.(awserr.Error)
    37  			if ok && awsErr.Code() == "WAFStaleDataException" {
    38  				return resource.RetryableError(err)
    39  			}
    40  			return resource.NonRetryableError(err)
    41  		}
    42  		return nil
    43  	})
    44  
    45  	return out, err
    46  }
    47  
    48  func newWafRegionalRetryer(conn *wafregional.WAFRegional, region string) *WafRegionalRetryer {
    49  	return &WafRegionalRetryer{Connection: conn, Region: region}
    50  }