From 9517a009bd450a36ed2886cfdcc69762c53f5cd3 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Wed, 6 Mar 2019 13:34:14 +0100 Subject: [PATCH] gomod: update `go-tfe` --- go.mod | 2 +- go.sum | 6 +- vendor/github.com/hashicorp/go-tfe/tfe.go | 85 ++++++++++++++++------- vendor/modules.txt | 2 +- 4 files changed, 64 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 6bc415509..f6f635f4a 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/hashicorp/go-retryablehttp v0.5.1 github.com/hashicorp/go-rootcerts v1.0.0 github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 // indirect - github.com/hashicorp/go-tfe v0.3.10 + github.com/hashicorp/go-tfe v0.3.11 github.com/hashicorp/go-uuid v1.0.0 github.com/hashicorp/go-version v1.1.0 github.com/hashicorp/golang-lru v0.5.0 // indirect diff --git a/go.sum b/go.sum index 46acd38b9..b1944c569 100644 --- a/go.sum +++ b/go.sum @@ -187,8 +187,8 @@ github.com/hashicorp/go-slug v0.2.0 h1:MVdZAkTmDsUi1AT+3NQDsn8n3ssnVSIHwiM6RcUHv github.com/hashicorp/go-slug v0.2.0/go.mod h1:+zDycQOzGqOqMW7Kn2fp9vz/NtqpMLQlgb9JUF+0km4= github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 h1:7YOlAIO2YWnJZkQp7B5eFykaIY7C9JndqAFQyVV5BhM= github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-tfe v0.3.10 h1:6uPnPHNPxXDe3k/Vt6fovygYTaWJ8f/7zdHc++f7NJU= -github.com/hashicorp/go-tfe v0.3.10/go.mod h1:LHLchj07PCYgQqcyE5Sz+g4zrMNW+nALKbiSNTZedEs= +github.com/hashicorp/go-tfe v0.3.11 h1:PHw0f1XeriVkqBikhXgZm/t65GR/fEH1iUl/d/9qKbU= +github.com/hashicorp/go-tfe v0.3.11/go.mod h1:LHLchj07PCYgQqcyE5Sz+g4zrMNW+nALKbiSNTZedEs= github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= @@ -245,8 +245,6 @@ github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3v github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.0.1-0.20181016162627-9eb73efc1fcc h1:9GUJohDyEsZO3cDfQuSxTf38xvk+gRWe+fDv3L9oWHA= -github.com/lib/pq v1.0.1-0.20181016162627-9eb73efc1fcc/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82 h1:wnfcqULT+N2seWf6y4yHzmi7GD2kNx4Ute0qArktD48= github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84= github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= diff --git a/vendor/github.com/hashicorp/go-tfe/tfe.go b/vendor/github.com/hashicorp/go-tfe/tfe.go index a1adf510f..79188bd97 100644 --- a/vendor/github.com/hashicorp/go-tfe/tfe.go +++ b/vendor/github.com/hashicorp/go-tfe/tfe.go @@ -48,6 +48,9 @@ var ( ErrResourceNotFound = errors.New("resource not found") ) +// RetryLogHook allows a function to run before each retry. +type RetryLogHook func(attemptNum int, resp *http.Response) + // Config provides configuration details to the API client. type Config struct { // The address of the Terraform Enterprise API. @@ -64,6 +67,9 @@ type Config struct { // A custom HTTP client to use. HTTPClient *http.Client + + // RetryLogHook is invoked each time a request is retried. + RetryLogHook RetryLogHook } // DefaultConfig returns a default config structure. @@ -90,11 +96,13 @@ func DefaultConfig() *Config { // Client is the Terraform Enterprise API client. It provides the basic // connectivity and configuration for accessing the TFE API. type Client struct { - baseURL *url.URL - token string - headers http.Header - http *retryablehttp.Client - limiter *rate.Limiter + baseURL *url.URL + token string + headers http.Header + http *retryablehttp.Client + limiter *rate.Limiter + retryLogHook RetryLogHook + retryServerErrors bool Applies Applies ConfigurationVersions ConfigurationVersions @@ -139,6 +147,9 @@ func NewClient(cfg *Config) (*Client, error) { if cfg.HTTPClient != nil { config.HTTPClient = cfg.HTTPClient } + if cfg.RetryLogHook != nil { + config.RetryLogHook = cfg.RetryLogHook + } } // Parse the address to make sure its a valid URL. @@ -159,18 +170,20 @@ func NewClient(cfg *Config) (*Client, error) { // Create the client. client := &Client{ - baseURL: baseURL, - token: config.Token, - headers: config.Headers, - http: &retryablehttp.Client{ - Backoff: rateLimitBackoff, - CheckRetry: rateLimitRetry, - ErrorHandler: retryablehttp.PassthroughErrorHandler, - HTTPClient: config.HTTPClient, - RetryWaitMin: 100 * time.Millisecond, - RetryWaitMax: 400 * time.Millisecond, - RetryMax: 30, - }, + baseURL: baseURL, + token: config.Token, + headers: config.Headers, + retryLogHook: config.RetryLogHook, + } + + client.http = &retryablehttp.Client{ + Backoff: client.retryHTTPBackoff, + CheckRetry: client.retryHTTPCheck, + ErrorHandler: retryablehttp.PassthroughErrorHandler, + HTTPClient: config.HTTPClient, + RetryWaitMin: 100 * time.Millisecond, + RetryWaitMax: 400 * time.Millisecond, + RetryMax: 30, } // Configure the rate limiter. @@ -203,24 +216,46 @@ func NewClient(cfg *Config) (*Client, error) { return client, nil } -// rateLimitRetry provides a callback for Client.CheckRetry, which will only -// retry when receiving a 429 response which indicates being rate limited. -func rateLimitRetry(ctx context.Context, resp *http.Response, err error) (bool, error) { - // Do not retry on context.Canceled or context.DeadlineExceeded. +// RetryServerErrors configures the retry HTTP check to also retry +// unexpected errors or requests that failed with a server error. +func (c *Client) RetryServerErrors(retry bool) { + c.retryServerErrors = retry +} + +// retryHTTPCheck provides a callback for Client.CheckRetry which +// will retry both rate limit (429) and server (>= 500) errors. +func (c *Client) retryHTTPCheck(ctx context.Context, resp *http.Response, err error) (bool, error) { if ctx.Err() != nil { return false, ctx.Err() } - // Do not retry on any unexpected errors. if err != nil { - return false, err + return c.retryServerErrors, err } - // Only retry when we are rate limited. - if resp.StatusCode == 429 { + if resp.StatusCode == 429 || (c.retryServerErrors && resp.StatusCode >= 500) { return true, nil } return false, nil } +// retryHTTPBackoff provides a generic callback for Client.Backoff which +// will pass through all calls based on the status code of the response. +func (c *Client) retryHTTPBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + if c.retryLogHook != nil { + c.retryLogHook(attemptNum, resp) + } + + // Use the rate limit backoff function when we are rate limited. + if resp.StatusCode == 429 { + return rateLimitBackoff(min, max, attemptNum, resp) + } + + // Set custom duration's when we experience a service interruption. + min = 700 * time.Millisecond + max = 900 * time.Millisecond + + return retryablehttp.LinearJitterBackoff(min, max, attemptNum, resp) +} + // rateLimitBackoff provides a callback for Client.Backoff which will use the // X-RateLimit_Reset header to determine the time to wait. We add some jitter // to prevent a thundering herd. diff --git a/vendor/modules.txt b/vendor/modules.txt index 926d6c345..67894f070 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -290,7 +290,7 @@ github.com/hashicorp/go-rootcerts github.com/hashicorp/go-safetemp # github.com/hashicorp/go-slug v0.2.0 github.com/hashicorp/go-slug -# github.com/hashicorp/go-tfe v0.3.10 +# github.com/hashicorp/go-tfe v0.3.11 github.com/hashicorp/go-tfe # github.com/hashicorp/go-uuid v1.0.0 github.com/hashicorp/go-uuid