Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(rdb): add support for configurable timeout #1178

Merged
merged 2 commits into from
Apr 6, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions scaleway/helpers_rdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,12 @@ func expandInstanceSettings(i interface{}) []*rdb.InstanceSetting {
return res
}

func waitInstance(ctx context.Context, api *rdb.API, region scw.Region, id string) (*rdb.Instance, error) {
func waitInstance(ctx context.Context, api *rdb.API, region scw.Region, id string, timeout time.Duration) (*rdb.Instance, error) {
retryInterval := defaultWaitRDBRetryInterval
return api.WaitForInstance(&rdb.WaitForInstanceRequest{
Region: region,
InstanceID: id,
Timeout: scw.TimeDurationPtr(defaultInstanceServerWaitTimeout * 3), // upgrade takes some time
Timeout: scw.TimeDurationPtr(timeout),
RetryInterval: &retryInterval,
}, scw.WithContext(ctx))
}
Expand Down
8 changes: 4 additions & 4 deletions scaleway/resource_rdb_acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func resourceScalewayRdbACLCreate(ctx context.Context, d *schema.ResourceData, m
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, expandID(instanceID))
_, err = waitInstance(ctx, rdbAPI, region, expandID(instanceID), d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -95,7 +95,7 @@ func resourceScalewayRdbACLRead(ctx context.Context, d *schema.ResourceData, met
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutRead))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -127,7 +127,7 @@ func resourceScalewayRdbACLUpdate(ctx context.Context, d *schema.ResourceData, m
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutUpdate))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -172,7 +172,7 @@ func resourceScalewayRdbACLDelete(ctx context.Context, d *schema.ResourceData, m
aclRuleIPs = append(aclRuleIPs, acl.IP.String())
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
Expand Down
8 changes: 4 additions & 4 deletions scaleway/resource_rdb_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func resourceScalewayRdbDatabaseCreate(ctx context.Context, d *schema.ResourceDa
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -97,7 +97,7 @@ func resourceScalewayRdbDatabaseCreate(ctx context.Context, d *schema.ResourceDa
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -131,7 +131,7 @@ func resourceScalewayRdbDatabaseRead(ctx context.Context, d *schema.ResourceData
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutRead))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -158,7 +158,7 @@ func resourceScalewayRdbDatabaseDelete(ctx context.Context, d *schema.ResourceDa
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}
Expand Down
24 changes: 12 additions & 12 deletions scaleway/resource_rdb_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ func resourceScalewayRdbInstanceCreate(ctx context.Context, d *schema.ResourceDa
updateReq.BackupScheduleRetention = scw.Uint32Ptr(uint32(backupScheduleRetention.(int)))
}

_, err = waitInstance(ctx, rdbAPI, region, res.ID)
_, err = waitInstance(ctx, rdbAPI, region, res.ID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -335,7 +335,7 @@ func resourceScalewayRdbInstanceCreate(ctx context.Context, d *schema.ResourceDa
}
// Configure Instance settings
if settings, ok := d.GetOk("settings"); ok {
res, err = waitInstance(ctx, rdbAPI, region, res.ID)
res, err = waitInstance(ctx, rdbAPI, region, res.ID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -360,7 +360,7 @@ func resourceScalewayRdbInstanceRead(ctx context.Context, d *schema.ResourceData
}

// verify resource is ready
res, err := waitInstance(ctx, rdbAPI, region, ID)
res, err := waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutRead))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -446,7 +446,7 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa
req.Tags = scw.StringsPtr(expandStrings(d.Get("tags")))
}

_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -457,7 +457,7 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa
}
// Change settings
if d.HasChange("settings") {
_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -540,7 +540,7 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa
})
}
for _, request := range upgradeInstanceRequests {
_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
Expand All @@ -550,14 +550,14 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
}

if d.HasChange("password") {
_, err := waitInstance(ctx, rdbAPI, region, ID)
_, err := waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -577,7 +577,7 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa

if d.HasChanges("private_network") {
// retrieve state
res, err := waitInstance(ctx, rdbAPI, region, ID)
res, err := waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -600,7 +600,7 @@ func resourceScalewayRdbInstanceUpdate(ctx context.Context, d *schema.ResourceDa
}

// retrieve state
_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -633,7 +633,7 @@ func resourceScalewayRdbInstanceDelete(ctx context.Context, d *schema.ResourceDa
}

// We first wait in case the instance is in a transient state
_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -648,7 +648,7 @@ func resourceScalewayRdbInstanceDelete(ctx context.Context, d *schema.ResourceDa
}

// Lastly wait in case the instance is in a transient state
_, err = waitInstance(ctx, rdbAPI, region, ID)
_, err = waitInstance(ctx, rdbAPI, region, ID, d.Timeout(schema.TimeoutDelete))
if err != nil && !is404Error(err) {
return diag.FromErr(err)
}
Expand Down
24 changes: 12 additions & 12 deletions scaleway/resource_rdb_privilege.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func resourceScalewayRdbPrivilegeCreate(ctx context.Context, d *schema.ResourceD
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -82,11 +82,11 @@ func resourceScalewayRdbPrivilegeCreate(ctx context.Context, d *schema.ResourceD
}

// wrapper around StateChangeConf that will just retry write on database
err = resource.RetryContext(ctx, readWriteDataBaseTimeOut, func() *resource.RetryError {
err = resource.RetryContext(ctx, d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
_, errSetPrivilege := rdbAPI.SetPrivilege(createReq, scw.WithContext(ctx))
if errSetPrivilege != nil {
if is409Error(errSetPrivilege) {
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID)
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutCreate))
if errWait != nil {
return resource.NonRetryableError(errWait)
}
Expand All @@ -100,7 +100,7 @@ func resourceScalewayRdbPrivilegeCreate(ctx context.Context, d *schema.ResourceD
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -119,7 +119,7 @@ func resourceScalewayRdbPrivilegeRead(ctx context.Context, d *schema.ResourceDat
dbName, _ := d.Get("database_name").(string)
userName, _ := d.Get("user_name").(string)

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutRead))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -172,7 +172,7 @@ func resourceScalewayRdbPrivilegeUpdate(ctx context.Context, d *schema.ResourceD
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -205,11 +205,11 @@ func resourceScalewayRdbPrivilegeUpdate(ctx context.Context, d *schema.ResourceD
}

// wrapper around StateChangeConf that will just retry the database creation
err = resource.RetryContext(ctx, defaultRdbInstanceTimeout, func() *resource.RetryError {
err = resource.RetryContext(ctx, d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
_, errSet := rdbAPI.SetPrivilege(updateReq, scw.WithContext(ctx))
if errSet != nil {
if is409Error(errSet) {
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID)
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutUpdate))
if errWait != nil {
return resource.NonRetryableError(errWait)
}
Expand All @@ -223,7 +223,7 @@ func resourceScalewayRdbPrivilegeUpdate(ctx context.Context, d *schema.ResourceD
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -239,7 +239,7 @@ func resourceScalewayRdbPrivilegeDelete(ctx context.Context, d *schema.ResourceD
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -295,7 +295,7 @@ func resourceScalewayRdbPrivilegeDelete(ctx context.Context, d *schema.ResourceD
_, errSet := rdbAPI.SetPrivilege(updateReq, scw.WithContext(ctx))
if errSet != nil {
if is409Error(errSet) {
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID)
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if errWait != nil {
return resource.NonRetryableError(errWait)
}
Expand All @@ -309,7 +309,7 @@ func resourceScalewayRdbPrivilegeDelete(ctx context.Context, d *schema.ResourceD
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}
Expand Down
19 changes: 8 additions & 11 deletions scaleway/resource_rdb_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"context"
"fmt"
"strings"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand All @@ -13,8 +12,6 @@ import (
"github.com/scaleway/scaleway-sdk-go/scw"
)

const readWriteDataBaseTimeOut = 2 * time.Minute

func resourceScalewayRdbUser() *schema.Resource {
return &schema.Resource{
CreateContext: resourceScalewayRdbUserCreate,
Expand Down Expand Up @@ -68,7 +65,7 @@ func resourceScalewayRdbUserCreate(ctx context.Context, d *schema.ResourceData,
diag.FromErr(err)
}

ins, err := waitInstance(ctx, rdbAPI, region, instanceID)
ins, err := waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -83,11 +80,11 @@ func resourceScalewayRdbUserCreate(ctx context.Context, d *schema.ResourceData,

var user *rdb.User
// wrapper around StateChangeConf that will just retry write on database
err = resource.RetryContext(ctx, readWriteDataBaseTimeOut, func() *resource.RetryError {
err = resource.RetryContext(ctx, d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
currentUser, errCreateUser := rdbAPI.CreateUser(createReq, scw.WithContext(ctx))
if errCreateUser != nil {
if is409Error(errCreateUser) {
_, errWait := waitInstance(ctx, rdbAPI, region, ins.ID)
_, errWait := waitInstance(ctx, rdbAPI, region, ins.ID, d.Timeout(schema.TimeoutCreate))
if errWait != nil {
return resource.NonRetryableError(errWait)
}
Expand Down Expand Up @@ -115,7 +112,7 @@ func resourceScalewayRdbUserRead(ctx context.Context, d *schema.ResourceData, me
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutRead))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -152,7 +149,7 @@ func resourceScalewayRdbUserUpdate(ctx context.Context, d *schema.ResourceData,
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -186,20 +183,20 @@ func resourceScalewayRdbUserDelete(ctx context.Context, d *schema.ResourceData,
return diag.FromErr(err)
}

_, err = waitInstance(ctx, rdbAPI, region, instanceID)
_, err = waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}

err = resource.RetryContext(ctx, readWriteDataBaseTimeOut, func() *resource.RetryError {
err = resource.RetryContext(ctx, d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
errDeleteUser := rdbAPI.DeleteUser(&rdb.DeleteUserRequest{
Region: region,
InstanceID: instanceID,
Name: userName,
}, scw.WithContext(ctx))
if errDeleteUser != nil {
if is409Error(errDeleteUser) {
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID)
_, errWait := waitInstance(ctx, rdbAPI, region, instanceID, d.Timeout(schema.TimeoutDelete))
if errWait != nil {
return resource.NonRetryableError(errWait)
}
Expand Down