diff --git a/builtin/providers/aws/resource_aws_dynamodb_table.go b/builtin/providers/aws/resource_aws_dynamodb_table.go index 0606cde2e..7c9fd4334 100644 --- a/builtin/providers/aws/resource_aws_dynamodb_table.go +++ b/builtin/providers/aws/resource_aws_dynamodb_table.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/aws/aws-sdk-go/aws" @@ -660,6 +661,37 @@ func resourceAwsDynamoDbTableDelete(d *schema.ResourceData, meta interface{}) er if err != nil { return err } + + params := &dynamodb.DescribeTableInput{ + TableName: aws.String(d.Id()), + } + + err = resource.Retry(10*time.Minute, func() error { + t, err := dynamodbconn.DescribeTable(params) + if err != nil { + if awserr, ok := err.(awserr.Error); ok && awserr.Code() == "ResourceNotFoundException" { + return nil + } + // Didn't recognize the error, so shouldn't retry. + return resource.RetryError{Err: err} + } + + if t != nil { + if t.Table.TableStatus != nil && strings.ToLower(*t.Table.TableStatus) == "deleting" { + log.Printf("[DEBUG] AWS Dynamo DB table (%s) is still deleting", d.Id()) + return fmt.Errorf("still deleting") + } + } + + // we should be not found or deleting, so error here + return resource.RetryError{Err: fmt.Errorf("[ERR] Error deleting Dynamo DB table, unexpected state: %s", t)} + }) + + // check error from retry + if err != nil { + return err + } + return nil } diff --git a/builtin/providers/aws/resource_aws_dynamodb_table_test.go b/builtin/providers/aws/resource_aws_dynamodb_table_test.go index 425cd204f..114837ce3 100644 --- a/builtin/providers/aws/resource_aws_dynamodb_table_test.go +++ b/builtin/providers/aws/resource_aws_dynamodb_table_test.go @@ -2,6 +2,7 @@ package aws import ( "fmt" + "log" "testing" "github.com/aws/aws-sdk-go/aws" @@ -11,7 +12,7 @@ import ( "github.com/hashicorp/terraform/terraform" ) -func TestAccAWSDynamoDbTable(t *testing.T) { +func TestAccAWSDynamoDbTable_basic(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, @@ -101,21 +102,23 @@ func testAccCheckAWSDynamoDbTableDestroy(s *terraform.State) error { continue } - fmt.Printf("[DEBUG] Checking if DynamoDB table %s exists", rs.Primary.ID) + log.Printf("[DEBUG] Checking if DynamoDB table %s exists", rs.Primary.ID) // Check if queue exists by checking for its attributes params := &dynamodb.DescribeTableInput{ TableName: aws.String(rs.Primary.ID), } + _, err := conn.DescribeTable(params) if err == nil { return fmt.Errorf("DynamoDB table %s still exists. Failing!", rs.Primary.ID) } // Verify the error is what we want - _, ok := err.(awserr.Error) - if !ok { - return err + if dbErr, ok := err.(awserr.Error); ok && dbErr.Code() == "ResourceNotFoundException" { + return nil } + + return err } return nil