From 5baaac40411ee1447a55c96ea03ca272e1883ae9 Mon Sep 17 00:00:00 2001 From: Ryn Daniels Date: Tue, 23 Jul 2019 18:19:49 +0200 Subject: [PATCH 1/2] Final retries for various DB timeouts --- aws/resource_aws_db_instance.go | 7 +++++- aws/resource_aws_db_option_group.go | 13 +++++++---- aws/resource_aws_db_parameter_group.go | 26 +++++++++++---------- aws/resource_aws_db_parameter_group_test.go | 16 ++++++------- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/aws/resource_aws_db_instance.go b/aws/resource_aws_db_instance.go index d3be465656f4..1c6fe5c80b95 100644 --- a/aws/resource_aws_db_instance.go +++ b/aws/resource_aws_db_instance.go @@ -809,6 +809,9 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error } return nil }) + if isResourceTimeoutError(err) { + _, err = conn.RestoreDBInstanceFromS3(&opts) + } if err != nil { return fmt.Errorf("Error creating DB Instance: %s", err) } @@ -1183,12 +1186,14 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error } return nil }) + if isResourceTimeoutError(err) { + _, err = conn.CreateDBInstance(&opts) + } if err != nil { if isAWSErr(err, "InvalidParameterValue", "") { return fmt.Errorf("Error creating DB Instance: %s, %+v", err, opts) } return fmt.Errorf("Error creating DB Instance: %s", err) - } } diff --git a/aws/resource_aws_db_option_group.go b/aws/resource_aws_db_option_group.go index af9605475929..9f9298783a89 100644 --- a/aws/resource_aws_db_option_group.go +++ b/aws/resource_aws_db_option_group.go @@ -281,7 +281,9 @@ func resourceAwsDbOptionGroupUpdate(d *schema.ResourceData, meta interface{}) er } return nil }) - + if isResourceTimeoutError(err) { + _, err = rdsconn.ModifyOptionGroup(modifyOpts) + } if err != nil { return fmt.Errorf("Error modifying DB Option Group: %s", err) } @@ -306,7 +308,7 @@ func resourceAwsDbOptionGroupDelete(d *schema.ResourceData, meta interface{}) er } log.Printf("[DEBUG] Delete DB Option Group: %#v", deleteOpts) - ret := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := rdsconn.DeleteOptionGroup(deleteOpts) if err != nil { if isAWSErr(err, rds.ErrCodeInvalidOptionGroupStateFault, "") { @@ -317,8 +319,11 @@ func resourceAwsDbOptionGroupDelete(d *schema.ResourceData, meta interface{}) er } return nil }) - if ret != nil { - return fmt.Errorf("Error Deleting DB Option Group: %s", ret) + if isResourceTimeoutError(err) { + _, err = rdsconn.DeleteOptionGroup(deleteOpts) + } + if err != nil { + return fmt.Errorf("Error Deleting DB Option Group: %s", err) } return nil } diff --git a/aws/resource_aws_db_parameter_group.go b/aws/resource_aws_db_parameter_group.go index e95d0b4d4ed1..edb9d4f370ce 100644 --- a/aws/resource_aws_db_parameter_group.go +++ b/aws/resource_aws_db_parameter_group.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/terraform/helper/schema" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/rds" ) @@ -310,23 +309,26 @@ func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{}) func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).rdsconn - return resource.Retry(3*time.Minute, func() *resource.RetryError { - deleteOpts := rds.DeleteDBParameterGroupInput{ - DBParameterGroupName: aws.String(d.Id()), - } - + deleteOpts := rds.DeleteDBParameterGroupInput{ + DBParameterGroupName: aws.String(d.Id()), + } + err := resource.Retry(3*time.Minute, func() *resource.RetryError { _, err := conn.DeleteDBParameterGroup(&deleteOpts) if err != nil { - awsErr, ok := err.(awserr.Error) - if ok && awsErr.Code() == "DBParameterGroupNotFoundFault" { - return resource.RetryableError(err) - } - if ok && awsErr.Code() == "InvalidDBParameterGroupState" { + if isAWSErr(err, "DBParameterGroupNotFoundFault", "") || isAWSErr(err, "InvalidDBParameterGroupState", "") { return resource.RetryableError(err) } + return resource.NonRetryableError(err) } - return resource.NonRetryableError(err) + return nil }) + if isResourceTimeoutError(err) { + _, err = conn.DeleteDBParameterGroup(&deleteOpts) + } + if err != nil { + return fmt.Errorf("Error deteing DB parameter group: %s", err) + } + return nil } func resourceAwsDbParameterHash(v interface{}) int { diff --git a/aws/resource_aws_db_parameter_group_test.go b/aws/resource_aws_db_parameter_group_test.go index e1997b0baf99..9857ca98a0e9 100644 --- a/aws/resource_aws_db_parameter_group_test.go +++ b/aws/resource_aws_db_parameter_group_test.go @@ -167,11 +167,11 @@ func TestAccAWSDBParameterGroup_limit(t *testing.T) { resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1708034931.name", "character_set_results"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1708034931.value", "utf8"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1937131004.name", "event_scheduler"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1937131004.value", "on"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1937131004.value", "ON"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.3437079877.name", "innodb_buffer_pool_dump_at_shutdown"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.3437079877.value", "1"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1092112861.name", "innodb_file_format"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1092112861.value", "barracuda"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1092112861.value", "Barracuda"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.615571931.name", "innodb_io_capacity"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.615571931.value", "2000"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1065962799.name", "innodb_io_capacity_max"), @@ -185,7 +185,7 @@ func TestAccAWSDBParameterGroup_limit(t *testing.T) { resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.591700516.name", "log_warnings"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.591700516.value", "2"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1918306725.name", "log_output"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1918306725.value", "file"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1918306725.value", "FILE"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.386204433.name", "max_allowed_packet"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.386204433.value", "1073741824"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1700901269.name", "max_connect_errors"), @@ -197,7 +197,7 @@ func TestAccAWSDBParameterGroup_limit(t *testing.T) { resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.881816039.name", "sync_binlog"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.881816039.value", "0"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.748684209.name", "tx_isolation"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.748684209.value", "repeatable-read"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.748684209.value", "REPEATABLE-READ"), ), }, { @@ -260,11 +260,11 @@ func TestAccAWSDBParameterGroup_limit(t *testing.T) { resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1708034931.name", "character_set_results"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1708034931.value", "utf8"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1937131004.name", "event_scheduler"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1937131004.value", "on"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1937131004.value", "ON"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.3437079877.name", "innodb_buffer_pool_dump_at_shutdown"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.3437079877.value", "1"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1092112861.name", "innodb_file_format"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1092112861.value", "barracuda"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1092112861.value", "Barracuda"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.615571931.name", "innodb_io_capacity"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.615571931.value", "2000"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1065962799.name", "innodb_io_capacity_max"), @@ -278,7 +278,7 @@ func TestAccAWSDBParameterGroup_limit(t *testing.T) { resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.591700516.name", "log_warnings"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.591700516.value", "2"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1918306725.name", "log_output"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1918306725.value", "file"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1918306725.value", "FILE"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.386204433.name", "max_allowed_packet"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.386204433.value", "1073741824"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.1700901269.name", "max_connect_errors"), @@ -290,7 +290,7 @@ func TestAccAWSDBParameterGroup_limit(t *testing.T) { resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.881816039.name", "sync_binlog"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.881816039.value", "0"), resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.748684209.name", "tx_isolation"), - resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.748684209.value", "repeatable-read"), + resource.TestCheckResourceAttr("aws_db_parameter_group.large", "parameter.748684209.value", "REPEATABLE-READ"), ), }, }, From 9474fcaf2535fbc32c8752625255e8299dd6d640 Mon Sep 17 00:00:00 2001 From: Ryn Daniels Date: Wed, 24 Jul 2019 17:57:19 +0100 Subject: [PATCH 2/2] Update aws/resource_aws_db_parameter_group.go Co-Authored-By: Brian Flad --- aws/resource_aws_db_parameter_group.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws/resource_aws_db_parameter_group.go b/aws/resource_aws_db_parameter_group.go index edb9d4f370ce..5bcbcc907e20 100644 --- a/aws/resource_aws_db_parameter_group.go +++ b/aws/resource_aws_db_parameter_group.go @@ -326,7 +326,7 @@ func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) _, err = conn.DeleteDBParameterGroup(&deleteOpts) } if err != nil { - return fmt.Errorf("Error deteing DB parameter group: %s", err) + return fmt.Errorf("Error deleting DB parameter group: %s", err) } return nil }