From f1a1db33689006e87b19360efd4abb74c2210096 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 9 Jun 2020 09:20:49 -0400 Subject: [PATCH] r/aws_cloudwatch_log_stream: Support resource import. --- aws/resource_aws_cloudwatch_log_stream.go | 19 ++++++ ...resource_aws_cloudwatch_log_stream_test.go | 64 +++++++++++-------- .../r/cloudwatch_log_stream.html.markdown | 8 +++ 3 files changed, 63 insertions(+), 28 deletions(-) diff --git a/aws/resource_aws_cloudwatch_log_stream.go b/aws/resource_aws_cloudwatch_log_stream.go index 72b16cffff34..cddff861cdf9 100644 --- a/aws/resource_aws_cloudwatch_log_stream.go +++ b/aws/resource_aws_cloudwatch_log_stream.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "regexp" + "strings" "time" "github.com/aws/aws-sdk-go/aws" @@ -17,6 +18,9 @@ func resourceAwsCloudWatchLogStream() *schema.Resource { Create: resourceAwsCloudWatchLogStreamCreate, Read: resourceAwsCloudWatchLogStreamRead, Delete: resourceAwsCloudWatchLogStreamDelete, + Importer: &schema.ResourceImporter{ + State: resourceAwsCloudWatchLogStreamImport, + }, Schema: map[string]*schema.Schema{ "arn": { @@ -117,6 +121,21 @@ func resourceAwsCloudWatchLogStreamDelete(d *schema.ResourceData, meta interface return nil } +func resourceAwsCloudWatchLogStreamImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { + parts := strings.Split(d.Id(), ":") + if len(parts) != 2 { + return []*schema.ResourceData{}, fmt.Errorf("Wrong format of resource: %s. Please follow 'log-group-name:log-stream-name'", d.Id()) + } + + logGroupName := parts[0] + logStreamName := parts[1] + + d.SetId(logStreamName) + d.Set("log_group_name", logGroupName) + + return []*schema.ResourceData{d}, nil +} + func lookupCloudWatchLogStream(conn *cloudwatchlogs.CloudWatchLogs, name string, logStreamName string, nextToken *string) (*cloudwatchlogs.LogStream, bool, error) { input := &cloudwatchlogs.DescribeLogStreamsInput{ diff --git a/aws/resource_aws_cloudwatch_log_stream_test.go b/aws/resource_aws_cloudwatch_log_stream_test.go index 3f4cfcf52e62..07b3cea9347c 100644 --- a/aws/resource_aws_cloudwatch_log_stream_test.go +++ b/aws/resource_aws_cloudwatch_log_stream_test.go @@ -4,7 +4,6 @@ import ( "fmt" "testing" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/cloudwatchlogs" "github.com/hashicorp/terraform-plugin-sdk/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" @@ -13,7 +12,8 @@ import ( func TestAccAWSCloudWatchLogStream_basic(t *testing.T) { var ls cloudwatchlogs.LogStream - rName := acctest.RandString(15) + resourceName := "aws_cloudwatch_log_stream.test" + rName := acctest.RandomWithPrefix("tf-acc-test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -23,16 +23,23 @@ func TestAccAWSCloudWatchLogStream_basic(t *testing.T) { { Config: testAccAWSCloudWatchLogStreamConfig(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckCloudWatchLogStreamExists("aws_cloudwatch_log_stream.foobar", &ls), + testAccCheckCloudWatchLogStreamExists(resourceName, &ls), ), }, + { + ResourceName: resourceName, + ImportStateIdFunc: testAccAWSCloudWatchLogStreamImportStateIdFunc(resourceName), + ImportState: true, + ImportStateVerify: true, + }, }, }) } func TestAccAWSCloudWatchLogStream_disappears(t *testing.T) { var ls cloudwatchlogs.LogStream - rName := acctest.RandString(15) + resourceName := "aws_cloudwatch_log_stream.test" + rName := acctest.RandomWithPrefix("tf-acc-test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -42,8 +49,8 @@ func TestAccAWSCloudWatchLogStream_disappears(t *testing.T) { { Config: testAccAWSCloudWatchLogStreamConfig(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckCloudWatchLogStreamExists("aws_cloudwatch_log_stream.foobar", &ls), - testAccCheckCloudWatchLogStreamDisappears(&ls, rName), + testAccCheckCloudWatchLogStreamExists(resourceName, &ls), + testAccCheckResourceDisappears(testAccProvider, resourceAwsCloudWatchLogStream(), resourceName), ), ExpectNonEmptyPlan: true, }, @@ -51,22 +58,12 @@ func TestAccAWSCloudWatchLogStream_disappears(t *testing.T) { }) } -func testAccCheckCloudWatchLogStreamDisappears(ls *cloudwatchlogs.LogStream, lgn string) resource.TestCheckFunc { - return func(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).cloudwatchlogsconn - opts := &cloudwatchlogs.DeleteLogStreamInput{ - LogGroupName: aws.String(lgn), - LogStreamName: ls.LogStreamName, - } - _, err := conn.DeleteLogStream(opts) - return err - } -} - func TestAccAWSCloudWatchLogStream_disappears_LogGroup(t *testing.T) { var ls cloudwatchlogs.LogStream var lg cloudwatchlogs.LogGroup - rName := acctest.RandString(15) + resourceName := "aws_cloudwatch_log_stream.test" + logGroupResourceName := "aws_cloudwatch_log_group.test" + rName := acctest.RandomWithPrefix("tf-acc-test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -76,9 +73,9 @@ func TestAccAWSCloudWatchLogStream_disappears_LogGroup(t *testing.T) { { Config: testAccAWSCloudWatchLogStreamConfig(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckCloudWatchLogStreamExists("aws_cloudwatch_log_stream.foobar", &ls), - testAccCheckCloudWatchLogGroupExists("aws_cloudwatch_log_group.foobar", &lg), - testAccCheckCloudWatchLogGroupDisappears(&lg), + testAccCheckCloudWatchLogStreamExists(resourceName, &ls), + testAccCheckCloudWatchLogGroupExists(logGroupResourceName, &lg), + testAccCheckResourceDisappears(testAccProvider, resourceAwsCloudWatchLogGroup(), logGroupResourceName), ), ExpectNonEmptyPlan: true, }, @@ -132,6 +129,17 @@ func testAccCheckAWSCloudWatchLogStreamDestroy(s *terraform.State) error { return nil } +func testAccAWSCloudWatchLogStreamImportStateIdFunc(resourceName string) resource.ImportStateIdFunc { + return func(s *terraform.State) (string, error) { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return "", fmt.Errorf("Not Found: %s", resourceName) + } + + return fmt.Sprintf("%s:%s", rs.Primary.Attributes["log_group_name"], rs.Primary.ID), nil + } +} + func TestValidateCloudWatchLogStreamName(t *testing.T) { validNames := []string{ "test-log-stream", @@ -161,13 +169,13 @@ func TestValidateCloudWatchLogStreamName(t *testing.T) { func testAccAWSCloudWatchLogStreamConfig(rName string) string { return fmt.Sprintf(` -resource "aws_cloudwatch_log_group" "foobar" { - name = "%s" +resource "aws_cloudwatch_log_group" "test" { + name = %[1]q } -resource "aws_cloudwatch_log_stream" "foobar" { - name = "%s" - log_group_name = "${aws_cloudwatch_log_group.foobar.id}" +resource "aws_cloudwatch_log_stream" "test" { + name = %[1]q + log_group_name = "${aws_cloudwatch_log_group.test.id}" } -`, rName, rName) +`, rName) } diff --git a/website/docs/r/cloudwatch_log_stream.html.markdown b/website/docs/r/cloudwatch_log_stream.html.markdown index 775007ba5d86..8ee4fc43924c 100644 --- a/website/docs/r/cloudwatch_log_stream.html.markdown +++ b/website/docs/r/cloudwatch_log_stream.html.markdown @@ -35,3 +35,11 @@ The following arguments are supported: In addition to all arguments above, the following attributes are exported: * `arn` - The Amazon Resource Name (ARN) specifying the log stream. + +## Import + +Cloudwatch Log Stream can be imported using the stream's `log_group_name` and `name`, e.g. + +``` +$ terraform import aws_cloudwatch_log_stream.foo Yada:SampleLogStream1234 +```