diff --git a/builtin/providers/aws/resource_aws_directory_service_directory.go b/builtin/providers/aws/resource_aws_directory_service_directory.go index 1fdb9491e..e5065e378 100644 --- a/builtin/providers/aws/resource_aws_directory_service_directory.go +++ b/builtin/providers/aws/resource_aws_directory_service_directory.go @@ -8,6 +8,7 @@ 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/directoryservice" "github.com/hashicorp/terraform/helper/resource" ) @@ -252,6 +253,8 @@ func resourceAwsDirectoryServiceDirectoryDelete(d *schema.ResourceData, meta int input := directoryservice.DeleteDirectoryInput{ DirectoryId: aws.String(d.Id()), } + + log.Printf("[DEBUG] Delete Directory input: %s", input) _, err := dsconn.DeleteDirectory(&input) if err != nil { return err @@ -261,17 +264,20 @@ func resourceAwsDirectoryServiceDirectoryDelete(d *schema.ResourceData, meta int log.Printf("[DEBUG] Waiting for DS (%q) to be deleted", d.Id()) stateConf := &resource.StateChangeConf{ Pending: []string{"Deleting"}, - Target: "", + Target: "Deleted", Refresh: func() (interface{}, string, error) { resp, err := dsconn.DescribeDirectories(&directoryservice.DescribeDirectoriesInput{ DirectoryIds: []*string{aws.String(d.Id())}, }) if err != nil { - return nil, "", err + if dserr, ok := err.(awserr.Error); ok && dserr.Code() == "EntityDoesNotExistException" { + return 42, "Deleted", nil + } + return nil, "error", err } if len(resp.DirectoryDescriptions) == 0 { - return nil, "", nil + return 42, "Deleted", nil } ds := resp.DirectoryDescriptions[0] diff --git a/builtin/providers/aws/resource_aws_directory_service_directory_test.go b/builtin/providers/aws/resource_aws_directory_service_directory_test.go index b10174bdb..fefdeb751 100644 --- a/builtin/providers/aws/resource_aws_directory_service_directory_test.go +++ b/builtin/providers/aws/resource_aws_directory_service_directory_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/directoryservice" "github.com/hashicorp/terraform/helper/resource" @@ -65,12 +66,33 @@ func TestAccAWSDirectoryServiceDirectory_withAliasAndSso(t *testing.T) { } func testAccCheckDirectoryServiceDirectoryDestroy(s *terraform.State) error { - if len(s.RootModule().Resources) > 0 { - return fmt.Errorf("Expected all resources to be gone, but found: %#v", - s.RootModule().Resources) + dsconn := testAccProvider.Meta().(*AWSClient).dsconn + + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_directory_service_directory" { + continue + } + + input := directoryservice.DescribeDirectoriesInput{ + DirectoryIds: []*string{aws.String(rs.Primary.ID)}, + } + out, err := dsconn.DescribeDirectories(&input) + if err != nil { + // EntityDoesNotExistException means it's gone, this is good + if dserr, ok := err.(awserr.Error); ok && dserr.Code() == "EntityDoesNotExistException" { + return nil + } + return err + } + + if out != nil && len(out.DirectoryDescriptions) > 0 { + return fmt.Errorf("Expected AWS Directory Service Directory to be gone, but was still found") + } + + return nil } - return nil + return fmt.Errorf("Default error in Service Directory Test") } func testAccCheckServiceDirectoryExists(name string) resource.TestCheckFunc {