diff --git a/builtin/providers/aws/resource_aws_cloudwatch_log_group.go b/builtin/providers/aws/resource_aws_cloudwatch_log_group.go index a135b4017b..245c890437 100644 --- a/builtin/providers/aws/resource_aws_cloudwatch_log_group.go +++ b/builtin/providers/aws/resource_aws_cloudwatch_log_group.go @@ -63,11 +63,17 @@ func resourceAwsCloudWatchLogGroupCreate(d *schema.ResourceData, meta interface{ func resourceAwsCloudWatchLogGroupRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).cloudwatchlogsconn log.Printf("[DEBUG] Reading CloudWatch Log Group: %q", d.Get("name").(string)) - lg, err := lookupCloudWatchLogGroup(conn, d.Id(), nil) + lg, exists, err := lookupCloudWatchLogGroup(conn, d.Id(), nil) if err != nil { return err } + if !exists { + log.Printf("[DEBUG] CloudWatch Group %q Not Found", d.Id()) + d.SetId("") + return nil + } + log.Printf("[DEBUG] Found Log Group: %#v", *lg) d.Set("arn", *lg.Arn) @@ -81,19 +87,19 @@ func resourceAwsCloudWatchLogGroupRead(d *schema.ResourceData, meta interface{}) } func lookupCloudWatchLogGroup(conn *cloudwatchlogs.CloudWatchLogs, - name string, nextToken *string) (*cloudwatchlogs.LogGroup, error) { + name string, nextToken *string) (*cloudwatchlogs.LogGroup, bool, error) { input := &cloudwatchlogs.DescribeLogGroupsInput{ LogGroupNamePrefix: aws.String(name), NextToken: nextToken, } resp, err := conn.DescribeLogGroups(input) if err != nil { - return nil, err + return nil, true, err } for _, lg := range resp.LogGroups { if *lg.LogGroupName == name { - return lg, nil + return lg, true, nil } } @@ -101,7 +107,7 @@ func lookupCloudWatchLogGroup(conn *cloudwatchlogs.CloudWatchLogs, return lookupCloudWatchLogGroup(conn, name, resp.NextToken) } - return nil, fmt.Errorf("CloudWatch Log Group %q not found", name) + return nil, false, nil } func resourceAwsCloudWatchLogGroupUpdate(d *schema.ResourceData, meta interface{}) error { diff --git a/builtin/providers/aws/resource_aws_cloudwatch_log_group_test.go b/builtin/providers/aws/resource_aws_cloudwatch_log_group_test.go index da910c1a89..aba0db72c5 100644 --- a/builtin/providers/aws/resource_aws_cloudwatch_log_group_test.go +++ b/builtin/providers/aws/resource_aws_cloudwatch_log_group_test.go @@ -77,6 +77,39 @@ func TestAccAWSCloudWatchLogGroup_multiple(t *testing.T) { }) } +func TestAccAWSCloudWatchLogGroup_disappears(t *testing.T) { + var lg cloudwatchlogs.LogGroup + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCloudWatchLogGroupDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAWSCloudWatchLogGroupConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudWatchLogGroupExists("aws_cloudwatch_log_group.foobar", &lg), + testAccCheckCloudWatchLogGroupDisappears(&lg), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) +} + +func testAccCheckCloudWatchLogGroupDisappears(lg *cloudwatchlogs.LogGroup) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := testAccProvider.Meta().(*AWSClient).cloudwatchlogsconn + opts := &cloudwatchlogs.DeleteLogGroupInput{ + LogGroupName: lg.LogGroupName, + } + if _, err := conn.DeleteLogGroup(opts); err != nil { + return err + } + return nil + } +} + func testAccCheckCloudWatchLogGroupExists(n string, lg *cloudwatchlogs.LogGroup) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -85,10 +118,13 @@ func testAccCheckCloudWatchLogGroupExists(n string, lg *cloudwatchlogs.LogGroup) } conn := testAccProvider.Meta().(*AWSClient).cloudwatchlogsconn - logGroup, err := lookupCloudWatchLogGroup(conn, rs.Primary.ID, nil) + logGroup, exists, err := lookupCloudWatchLogGroup(conn, rs.Primary.ID, nil) if err != nil { return err } + if !exists { + return fmt.Errorf("Bad: LogGroup %q does not exist", rs.Primary.ID) + } *lg = *logGroup @@ -103,11 +139,15 @@ func testAccCheckAWSCloudWatchLogGroupDestroy(s *terraform.State) error { if rs.Type != "aws_cloudwatch_log_group" { continue } - - _, err := lookupCloudWatchLogGroup(conn, rs.Primary.ID, nil) - if err == nil { - return fmt.Errorf("LogGroup Still Exists: %s", rs.Primary.ID) + _, exists, err := lookupCloudWatchLogGroup(conn, rs.Primary.ID, nil) + if err != nil { + return nil } + + if exists { + return fmt.Errorf("Bad: LogGroup still exists: %q", rs.Primary.ID) + } + } return nil