Skip to content

Commit

Permalink
Add retry for 429 and 5xx errors
Browse files Browse the repository at this point in the history
  • Loading branch information
scastrianni committed Aug 9, 2024
1 parent 7af2358 commit 72a0ea3
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 25 deletions.
4 changes: 4 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,12 @@ terraform {
# Configure the Konnect Provider
provider "konnect" {
pat = "XXXX"
num_retries = 3
retry_delay = 30
}
```
## Argument Reference
* `pat` - **(Required, String)** Your personal access token obtained via Konnect UI. Can be specified via env variable `KONNECT_PAT`.
* `region` - **(Optional, String)** The region for accessing region specific resources. Can be specified via env variable `KONNECT_REGION`. Allowed values: `us`, `eu`, `au`. Default: `us`
* `num_retries` - **(Optional, Integer)** Number of retries for each Konnect API call in case of 429-Too Many Requests or any 5XX status code. Can be specified via env variable `KONNECT_NUM_RETRIES`. Default: 3.
* `retry_delay` - **(Optional, Integer)** How long to wait (in seconds) in between retries. Can be specified via env variable `KONNECT_RETRY_DELAY`. Default: 30.
37 changes: 26 additions & 11 deletions konnect/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"net/http"
"net/http/httputil"
"net/url"
"time"
)

const (
Expand All @@ -35,18 +36,19 @@ type EntityId struct {
}

type Client struct {
pat string
region string
//defaultTags []string
pat string
region string
numRetries int
retryDelay int
httpClient *http.Client
}

// func NewClient(pat string, region string, defaultTags []string) (*Client, error) {
func NewClient(pat string, region string) (*Client, error) {
func NewClient(pat string, region string, numRetries int, retryDelay int) (*Client, error) {
c := &Client{
pat: pat,
region: region,
//defaultTags: defaultTags,
pat: pat,
region: region,
numRetries: numRetries,
retryDelay: retryDelay,
httpClient: &http.Client{},
}
return c, nil
Expand Down Expand Up @@ -85,9 +87,22 @@ func (c *Client) HttpRequest(ctx context.Context, isRegion bool, method string,
} else {
tflog.Info(ctx, "Konnect API: ", map[string]any{"request": string(requestDump)})
}
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, &RequestError{StatusCode: http.StatusInternalServerError, Err: err}
try := 0
var resp *http.Response
for {
resp, err = c.httpClient.Do(req)
if err != nil {
return nil, &RequestError{StatusCode: http.StatusInternalServerError, Err: err}
}
if (resp.StatusCode == http.StatusTooManyRequests) || (resp.StatusCode >= http.StatusInternalServerError) {
try++
if try >= c.numRetries {
break
}
time.Sleep(time.Duration(c.retryDelay) * time.Second)
continue
}
break
}
defer resp.Body.Close()
respBody := new(bytes.Buffer)
Expand Down
27 changes: 13 additions & 14 deletions konnect/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ func Provider() *schema.Provider {
DefaultFunc: schema.EnvDefaultFunc("KONNECT_REGION", "us"),
ValidateFunc: validation.StringInSlice([]string{"us", "eu", "au"}, false),
},
//"default_tags": {
// Type: schema.TypeSet,
// Optional: true,
// Elem: &schema.Schema{
// Type: schema.TypeString,
// },
//},
"num_retries": {
Type: schema.TypeInt,
Optional: true,
DefaultFunc: schema.EnvDefaultFunc("KONNECT_NUM_RETRIES", 3),
},
"retry_delay": {
Type: schema.TypeInt,
Optional: true,
DefaultFunc: schema.EnvDefaultFunc("KONNECT_RETRY_DELAY", 30),
},
},
ResourcesMap: map[string]*schema.Resource{
"konnect_control_plane": resourceControlPlane(),
Expand Down Expand Up @@ -68,15 +71,11 @@ func Provider() *schema.Provider {
func providerConfigure(ctx context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
pat := d.Get("pat").(string)
region := d.Get("region").(string)
//defaultTags := []string{}
//defaultTagsSet, ok := d.GetOk("default_tags")
//if ok {
// defaultTags = convertSetToArray(defaultTagsSet.(*schema.Set))
//}
numRetries := d.Get("num_retries").(int)
retryDelay := d.Get("retry_delay").(int)

var diags diag.Diagnostics
//c, err := client.NewClient(pat, region, defaultTags)
c, err := client.NewClient(pat, region)
c, err := client.NewClient(pat, region, numRetries, retryDelay)
if err != nil {
return nil, diag.FromErr(err)
}
Expand Down

0 comments on commit 72a0ea3

Please sign in to comment.