gomod: update `go-tfe`

This commit is contained in:
Sander van Harmelen 2019-03-06 13:34:14 +01:00
parent 4ba8504e86
commit 9517a009bd
4 changed files with 64 additions and 31 deletions

2
go.mod
View File

@ -55,7 +55,7 @@ require (
github.com/hashicorp/go-retryablehttp v0.5.1 github.com/hashicorp/go-retryablehttp v0.5.1
github.com/hashicorp/go-rootcerts v1.0.0 github.com/hashicorp/go-rootcerts v1.0.0
github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 // indirect 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-uuid v1.0.0
github.com/hashicorp/go-version v1.1.0 github.com/hashicorp/go-version v1.1.0
github.com/hashicorp/golang-lru v0.5.0 // indirect github.com/hashicorp/golang-lru v0.5.0 // indirect

6
go.sum
View File

@ -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-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 h1:7YOlAIO2YWnJZkQp7B5eFykaIY7C9JndqAFQyVV5BhM=
github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 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.11 h1:PHw0f1XeriVkqBikhXgZm/t65GR/fEH1iUl/d/9qKbU=
github.com/hashicorp/go-tfe v0.3.10/go.mod h1:LHLchj07PCYgQqcyE5Sz+g4zrMNW+nALKbiSNTZedEs= 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 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 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= 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/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 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 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 h1:wnfcqULT+N2seWf6y4yHzmi7GD2kNx4Ute0qArktD48=
github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84= 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= github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI=

View File

@ -48,6 +48,9 @@ var (
ErrResourceNotFound = errors.New("resource not found") 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. // Config provides configuration details to the API client.
type Config struct { type Config struct {
// The address of the Terraform Enterprise API. // The address of the Terraform Enterprise API.
@ -64,6 +67,9 @@ type Config struct {
// A custom HTTP client to use. // A custom HTTP client to use.
HTTPClient *http.Client HTTPClient *http.Client
// RetryLogHook is invoked each time a request is retried.
RetryLogHook RetryLogHook
} }
// DefaultConfig returns a default config structure. // DefaultConfig returns a default config structure.
@ -90,11 +96,13 @@ func DefaultConfig() *Config {
// Client is the Terraform Enterprise API client. It provides the basic // Client is the Terraform Enterprise API client. It provides the basic
// connectivity and configuration for accessing the TFE API. // connectivity and configuration for accessing the TFE API.
type Client struct { type Client struct {
baseURL *url.URL baseURL *url.URL
token string token string
headers http.Header headers http.Header
http *retryablehttp.Client http *retryablehttp.Client
limiter *rate.Limiter limiter *rate.Limiter
retryLogHook RetryLogHook
retryServerErrors bool
Applies Applies Applies Applies
ConfigurationVersions ConfigurationVersions ConfigurationVersions ConfigurationVersions
@ -139,6 +147,9 @@ func NewClient(cfg *Config) (*Client, error) {
if cfg.HTTPClient != nil { if cfg.HTTPClient != nil {
config.HTTPClient = cfg.HTTPClient config.HTTPClient = cfg.HTTPClient
} }
if cfg.RetryLogHook != nil {
config.RetryLogHook = cfg.RetryLogHook
}
} }
// Parse the address to make sure its a valid URL. // Parse the address to make sure its a valid URL.
@ -159,18 +170,20 @@ func NewClient(cfg *Config) (*Client, error) {
// Create the client. // Create the client.
client := &Client{ client := &Client{
baseURL: baseURL, baseURL: baseURL,
token: config.Token, token: config.Token,
headers: config.Headers, headers: config.Headers,
http: &retryablehttp.Client{ retryLogHook: config.RetryLogHook,
Backoff: rateLimitBackoff, }
CheckRetry: rateLimitRetry,
ErrorHandler: retryablehttp.PassthroughErrorHandler, client.http = &retryablehttp.Client{
HTTPClient: config.HTTPClient, Backoff: client.retryHTTPBackoff,
RetryWaitMin: 100 * time.Millisecond, CheckRetry: client.retryHTTPCheck,
RetryWaitMax: 400 * time.Millisecond, ErrorHandler: retryablehttp.PassthroughErrorHandler,
RetryMax: 30, HTTPClient: config.HTTPClient,
}, RetryWaitMin: 100 * time.Millisecond,
RetryWaitMax: 400 * time.Millisecond,
RetryMax: 30,
} }
// Configure the rate limiter. // Configure the rate limiter.
@ -203,24 +216,46 @@ func NewClient(cfg *Config) (*Client, error) {
return client, nil return client, nil
} }
// rateLimitRetry provides a callback for Client.CheckRetry, which will only // RetryServerErrors configures the retry HTTP check to also retry
// retry when receiving a 429 response which indicates being rate limited. // unexpected errors or requests that failed with a server error.
func rateLimitRetry(ctx context.Context, resp *http.Response, err error) (bool, error) { func (c *Client) RetryServerErrors(retry bool) {
// Do not retry on context.Canceled or context.DeadlineExceeded. 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 { if ctx.Err() != nil {
return false, ctx.Err() return false, ctx.Err()
} }
// Do not retry on any unexpected errors.
if err != nil { if err != nil {
return false, err return c.retryServerErrors, err
} }
// Only retry when we are rate limited. if resp.StatusCode == 429 || (c.retryServerErrors && resp.StatusCode >= 500) {
if resp.StatusCode == 429 {
return true, nil return true, nil
} }
return false, 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 // 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 // X-RateLimit_Reset header to determine the time to wait. We add some jitter
// to prevent a thundering herd. // to prevent a thundering herd.

2
vendor/modules.txt vendored
View File

@ -290,7 +290,7 @@ github.com/hashicorp/go-rootcerts
github.com/hashicorp/go-safetemp github.com/hashicorp/go-safetemp
# github.com/hashicorp/go-slug v0.2.0 # github.com/hashicorp/go-slug v0.2.0
github.com/hashicorp/go-slug 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-tfe
# github.com/hashicorp/go-uuid v1.0.0 # github.com/hashicorp/go-uuid v1.0.0
github.com/hashicorp/go-uuid github.com/hashicorp/go-uuid