From 4aed4f49393426637aae5f82afd70341abf5e09e Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Mon, 29 Mar 2021 14:08:46 -0400 Subject: [PATCH 01/13] r/aws_cloudwatch_event_rule: Add 'TestAccAWSCloudWatchEventRule_PartnerEventBus'. Acceptance test output: $ EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME=aws.partner/datadog.com/TerraformTesting make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSCloudWatchEventRule_PartnerEventBus' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSCloudWatchEventRule_PartnerEventBus -timeout 180m === RUN TestAccAWSCloudWatchEventRule_PartnerEventBus === PAUSE TestAccAWSCloudWatchEventRule_PartnerEventBus === CONT TestAccAWSCloudWatchEventRule_PartnerEventBus resource_aws_cloudwatch_event_rule_test.go:495: Step 1/2 error: Error running apply: exit status 1 2021/03/29 13:31:03 [DEBUG] Using modified User-Agent: Terraform/0.12.26 HashiCorp-terraform-exec/0.13.0 Error: error reading CloudWatch Events Rule (aws.partner/datadog.com/TerraformTesting/tf-acc-test-rule-500421321801107394): unexpected format for ID ("aws.partner/datadog.com/TerraformTesting/tf-acc-test-rule-500421321801107394"), expected / or on terraform_plugin_test.tf line 2, in resource "aws_cloudwatch_event_rule" "test": 2: resource "aws_cloudwatch_event_rule" "test" { testing_new.go:63: Error running post-test destroy, there may be dangling resources: exit status 1 2021/03/29 13:31:05 [DEBUG] Using modified User-Agent: Terraform/0.12.26 HashiCorp-terraform-exec/0.13.0 Error: unexpected format for ID ("aws.partner/datadog.com/TerraformTesting/tf-acc-test-rule-500421321801107394"), expected / or --- FAIL: TestAccAWSCloudWatchEventRule_PartnerEventBus (5.18s) FAIL FAIL github.com/terraform-providers/terraform-provider-aws/aws 5.283s FAIL GNUmakefile:27: recipe for target 'testacc' failed make: *** [testacc] Error 1 --- ...resource_aws_cloudwatch_event_rule_test.go | 57 +++++++++++++++++++ docs/MAINTAINING.md | 1 + 2 files changed, 58 insertions(+) diff --git a/aws/resource_aws_cloudwatch_event_rule_test.go b/aws/resource_aws_cloudwatch_event_rule_test.go index 2a9944073be..488021edeeb 100644 --- a/aws/resource_aws_cloudwatch_event_rule_test.go +++ b/aws/resource_aws_cloudwatch_event_rule_test.go @@ -3,6 +3,7 @@ package aws import ( "fmt" "log" + "os" "regexp" "testing" @@ -480,6 +481,47 @@ func TestAccAWSCloudWatchEventRule_IsEnabled(t *testing.T) { }) } +func TestAccAWSCloudWatchEventRule_PartnerEventBus(t *testing.T) { + key := "EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME" + busName := os.Getenv(key) + if busName == "" { + t.Skipf("Environment variable %s is not set", key) + } + + var v events.DescribeRuleOutput + rName := acctest.RandomWithPrefix("tf-acc-test-rule") + resourceName := "aws_cloudwatch_event_rule.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ErrorCheck: testAccErrorCheck(t, cloudwatchevents.EndpointsID), + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCloudWatchEventRuleDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSCloudWatchEventRulePartnerEventBusConfig(rName, busName), + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudWatchEventRuleExists(resourceName, &v), + testAccMatchResourceAttrRegionalARN(resourceName, "arn", "events", regexp.MustCompile(fmt.Sprintf(`rule/%s/%s$`, busName, rName))), + resource.TestCheckResourceAttr(resourceName, "description", ""), + resource.TestCheckResourceAttr(resourceName, "event_bus_name", busName), + testAccCheckResourceAttrEquivalentJSON(resourceName, "event_pattern", "{\"source\":[\"aws.ec2\"]}"), + resource.TestCheckResourceAttr(resourceName, "is_enabled", "true"), + resource.TestCheckResourceAttr(resourceName, "name", rName), + resource.TestCheckResourceAttr(resourceName, "role_arn", ""), + resource.TestCheckResourceAttr(resourceName, "schedule_expression", ""), + resource.TestCheckResourceAttr(resourceName, "tags.%", "0"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckCloudWatchEventRuleExists(n string, rule *events.DescribeRuleOutput) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -733,3 +775,18 @@ resource "aws_cloudwatch_event_rule" "test" { } `, name) } + +func testAccAWSCloudWatchEventRulePartnerEventBusConfig(rName, eventBusName string) string { + return fmt.Sprintf(` +resource "aws_cloudwatch_event_rule" "test" { + name = %[1]q + event_bus_name = %[2]q + + event_pattern = < Date: Mon, 29 Mar 2021 17:17:01 -0400 Subject: [PATCH 02/13] r/aws_cloudwatch_event_rule: Support partner event bus names. Acceptance test output: $ EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME=aws.partner/datadog.com/TerraformTesting make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSCloudWatchEventRule_' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSCloudWatchEventRule_ -timeout 180m === RUN TestAccAWSCloudWatchEventRule_basic === PAUSE TestAccAWSCloudWatchEventRule_basic === RUN TestAccAWSCloudWatchEventRule_EventBusName === PAUSE TestAccAWSCloudWatchEventRule_EventBusName === RUN TestAccAWSCloudWatchEventRule_role === PAUSE TestAccAWSCloudWatchEventRule_role === RUN TestAccAWSCloudWatchEventRule_description === PAUSE TestAccAWSCloudWatchEventRule_description === RUN TestAccAWSCloudWatchEventRule_pattern === PAUSE TestAccAWSCloudWatchEventRule_pattern === RUN TestAccAWSCloudWatchEventRule_ScheduleAndPattern === PAUSE TestAccAWSCloudWatchEventRule_ScheduleAndPattern === RUN TestAccAWSCloudWatchEventRule_NamePrefix === PAUSE TestAccAWSCloudWatchEventRule_NamePrefix === RUN TestAccAWSCloudWatchEventRule_Name_Generated === PAUSE TestAccAWSCloudWatchEventRule_Name_Generated === RUN TestAccAWSCloudWatchEventRule_tags === PAUSE TestAccAWSCloudWatchEventRule_tags === RUN TestAccAWSCloudWatchEventRule_IsEnabled === PAUSE TestAccAWSCloudWatchEventRule_IsEnabled === RUN TestAccAWSCloudWatchEventRule_PartnerEventBus === PAUSE TestAccAWSCloudWatchEventRule_PartnerEventBus === CONT TestAccAWSCloudWatchEventRule_basic === CONT TestAccAWSCloudWatchEventRule_NamePrefix === CONT TestAccAWSCloudWatchEventRule_PartnerEventBus === CONT TestAccAWSCloudWatchEventRule_IsEnabled === CONT TestAccAWSCloudWatchEventRule_tags === CONT TestAccAWSCloudWatchEventRule_Name_Generated === CONT TestAccAWSCloudWatchEventRule_description === CONT TestAccAWSCloudWatchEventRule_ScheduleAndPattern === CONT TestAccAWSCloudWatchEventRule_pattern === CONT TestAccAWSCloudWatchEventRule_role === CONT TestAccAWSCloudWatchEventRule_EventBusName --- PASS: TestAccAWSCloudWatchEventRule_Name_Generated (50.87s) --- PASS: TestAccAWSCloudWatchEventRule_PartnerEventBus (51.28s) --- PASS: TestAccAWSCloudWatchEventRule_ScheduleAndPattern (51.51s) --- PASS: TestAccAWSCloudWatchEventRule_NamePrefix (52.07s) --- PASS: TestAccAWSCloudWatchEventRule_role (60.54s) --- PASS: TestAccAWSCloudWatchEventRule_description (69.58s) --- PASS: TestAccAWSCloudWatchEventRule_pattern (69.88s) --- PASS: TestAccAWSCloudWatchEventRule_IsEnabled (84.21s) --- PASS: TestAccAWSCloudWatchEventRule_basic (85.22s) --- PASS: TestAccAWSCloudWatchEventRule_EventBusName (87.87s) --- PASS: TestAccAWSCloudWatchEventRule_tags (94.29s) PASS ok github.com/terraform-providers/terraform-provider-aws/aws 94.393s --- aws/internal/service/cloudwatchevents/id.go | 11 +++ .../service/cloudwatchevents/id_test.go | 93 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 aws/internal/service/cloudwatchevents/id_test.go diff --git a/aws/internal/service/cloudwatchevents/id.go b/aws/internal/service/cloudwatchevents/id.go index 0da79c7054c..025244332c3 100644 --- a/aws/internal/service/cloudwatchevents/id.go +++ b/aws/internal/service/cloudwatchevents/id.go @@ -2,9 +2,14 @@ package cloudwatchevents import ( "fmt" + "regexp" "strings" ) +var ( + partnerEventBusPattern = regexp.MustCompile(`^aws\.partner(/[\.\-_A-Za-z0-9]+){2,}$`) +) + const DefaultEventBusName = "default" const PermissionIDSeparator = "/" @@ -45,6 +50,12 @@ func RuleParseID(id string) (string, string, error) { if len(parts) == 2 && parts[0] != "" && parts[1] != "" { return parts[0], parts[1], nil } + if len(parts) > 2 { + i := strings.LastIndex(id, ruleIDSeparator) + if partnerEventBusPattern.MatchString(id[:i]) { + return id[:i], id[i+1:], nil + } + } return "", "", fmt.Errorf("unexpected format for ID (%q), expected "+ruleIDSeparator+" or ", id) } diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go new file mode 100644 index 00000000000..cddc2dba7e9 --- /dev/null +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -0,0 +1,93 @@ +package cloudwatchevents_test + +import ( + "testing" + + tfevents "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents" +) + +func TestRuleParseID(t *testing.T) { + testCases := []struct { + TestName string + InputID string + ExpectedError bool + ExpectedPart0 string + ExpectedPart1 string + }{ + { + TestName: "empty ID", + InputID: "", + ExpectedError: true, + }, + { + TestName: "single part", + InputID: "TestRule", + ExpectedPart0: "default", + ExpectedPart1: "TestRule", + }, + { + TestName: "two parts", + InputID: "TestEventBus/TestRule", + ExpectedPart0: "TestEventBus", + ExpectedPart1: "TestRule", + }, + { + TestName: "partner event bus", + InputID: "aws.partner/example.com/Test/TestRule", + ExpectedPart0: "aws.partner/example.com/Test", + ExpectedPart1: "TestRule", + }, + { + TestName: "empty both parts", + InputID: "/", + ExpectedError: true, + }, + { + TestName: "empty first part", + InputID: "TestEventBus/", + ExpectedError: true, + }, + { + TestName: "empty second part", + InputID: "/TestRule", + ExpectedError: true, + }, + { + TestName: "three parts", + InputID: "TestEventBus/TestRule/Suffix", + ExpectedError: true, + }, + { + TestName: "four parts", + InputID: "abc.partner/TestEventBus/TestRule/Suffix", + ExpectedError: true, + }, + { + TestName: "five parts", + InputID: "test/aws.partner/example.com/Test/TestRule", + ExpectedError: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.TestName, func(t *testing.T) { + gotPart0, gotPart1, err := tfevents.RuleParseID(testCase.InputID) + + if err == nil && testCase.ExpectedError { + t.Fatalf("expected error, got no error") + } + + if err != nil && !testCase.ExpectedError { + t.Fatalf("got unexpected error: %s", err) + } + + if gotPart0 != testCase.ExpectedPart0 { + t.Errorf("got part 0 %s, expected %s", gotPart0, testCase.ExpectedPart0) + } + + if gotPart1 != testCase.ExpectedPart1 { + t.Errorf("got part 0 %s, expected %s", gotPart1, testCase.ExpectedPart1) + } + }) + } +} From 6543ef8bf49cddfda2432002e9834731d2f020fb Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Mon, 29 Mar 2021 17:38:14 -0400 Subject: [PATCH 03/13] r/aws_cloudwatch_event_permission: Add 'TestAccAWSCloudWatchEventPermission_PartnerEventBus'. Acceptance test output: $ EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME=aws.partner/datadog.com/TerraformTesting make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSCloudWatchEventPermission_PartnerEventBus' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSCloudWatchEventPermission_PartnerEventBus -timeout 180m === RUN TestAccAWSCloudWatchEventPermission_PartnerEventBus === PAUSE TestAccAWSCloudWatchEventPermission_PartnerEventBus === CONT TestAccAWSCloudWatchEventPermission_PartnerEventBus resource_aws_cloudwatch_event_permission_test.go:328: Step 1/2 error: Error running apply: exit status 1 2021/03/29 17:37:22 [DEBUG] Using modified User-Agent: Terraform/0.12.26 HashiCorp-terraform-exec/0.13.0 Error: Creating CloudWatch Events permission failed: ValidationException: 1 validation error detected: Value 'aws.partner/datadog.com/TerraformTesting' at 'eventBusName' failed to satisfy constraint: Member must satisfy regular expression pattern: [\.\-_A-Za-z0-9]+ status code: 400, request id: 8329ec8c-828c-4048-a665-60aaafd76f0d on terraform_plugin_test.tf line 2, in resource "aws_cloudwatch_event_permission" "test": 2: resource "aws_cloudwatch_event_permission" "test" { --- FAIL: TestAccAWSCloudWatchEventPermission_PartnerEventBus (3.87s) FAIL FAIL github.com/terraform-providers/terraform-provider-aws/aws 3.961s FAIL GNUmakefile:27: recipe for target 'testacc' failed make: *** [testacc] Error 1 --- ...ce_aws_cloudwatch_event_permission_test.go | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/aws/resource_aws_cloudwatch_event_permission_test.go b/aws/resource_aws_cloudwatch_event_permission_test.go index 153309ab038..47d2cdd7204 100644 --- a/aws/resource_aws_cloudwatch_event_permission_test.go +++ b/aws/resource_aws_cloudwatch_event_permission_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "log" + "os" "regexp" "testing" "time" @@ -314,6 +315,40 @@ func TestAccAWSCloudWatchEventPermission_Disappears(t *testing.T) { }) } +func TestAccAWSCloudWatchEventPermission_PartnerEventBus(t *testing.T) { + key := "EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME" + busName := os.Getenv(key) + if busName == "" { + t.Skipf("Environment variable %s is not set", key) + } + + rName := acctest.RandomWithPrefix("tf-acc-test") + resourceName := "aws_cloudwatch_event_permission.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ErrorCheck: testAccErrorCheck(t, cloudwatchevents.EndpointsID), + Providers: testAccProviders, + CheckDestroy: testAccCheckCloudWatchEventPermissionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckAwsCloudWatchEventPermissionPartnerEventBusConfig(rName, busName), + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudWatchEventPermissionExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "event_bus_name", busName), + resource.TestCheckResourceAttr(resourceName, "principal", "111111111111"), + resource.TestCheckResourceAttr(resourceName, "statement_id", rName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckCloudWatchEventPermissionExists(pr string) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).cloudwatcheventsconn @@ -473,3 +508,13 @@ resource "aws_cloudwatch_event_permission" "test2" { } `, principal1, statementID1, principal2, statementID2) } + +func testAccCheckAwsCloudWatchEventPermissionPartnerEventBusConfig(rName, eventBusName string) string { + return fmt.Sprintf(` +resource "aws_cloudwatch_event_permission" "test" { + principal = "111111111111" + statement_id = %[1]q + event_bus_name = %[2]q +} +`, rName, eventBusName) +} From efc01144424713fa0add8522aeb34deefeffc621 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Mon, 29 Mar 2021 17:54:27 -0400 Subject: [PATCH 04/13] r/aws_cloudwatch_event_permission: Support partner event bus names. Acceptance test output: $ EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME=aws.partner/datadog.com/TerraformTesting make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSCloudWatchEventPermission_' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSCloudWatchEventPermission_ -timeout 180m === RUN TestAccAWSCloudWatchEventPermission_basic === PAUSE TestAccAWSCloudWatchEventPermission_basic === RUN TestAccAWSCloudWatchEventPermission_EventBusName === PAUSE TestAccAWSCloudWatchEventPermission_EventBusName === RUN TestAccAWSCloudWatchEventPermission_Action === PAUSE TestAccAWSCloudWatchEventPermission_Action === RUN TestAccAWSCloudWatchEventPermission_Condition === PAUSE TestAccAWSCloudWatchEventPermission_Condition === RUN TestAccAWSCloudWatchEventPermission_Multiple === PAUSE TestAccAWSCloudWatchEventPermission_Multiple === RUN TestAccAWSCloudWatchEventPermission_Disappears === PAUSE TestAccAWSCloudWatchEventPermission_Disappears === RUN TestAccAWSCloudWatchEventPermission_PartnerEventBus === PAUSE TestAccAWSCloudWatchEventPermission_PartnerEventBus === CONT TestAccAWSCloudWatchEventPermission_basic === CONT TestAccAWSCloudWatchEventPermission_Multiple === CONT TestAccAWSCloudWatchEventPermission_PartnerEventBus === CONT TestAccAWSCloudWatchEventPermission_Disappears === CONT TestAccAWSCloudWatchEventPermission_Action === CONT TestAccAWSCloudWatchEventPermission_Condition === CONT TestAccAWSCloudWatchEventPermission_EventBusName === CONT TestAccAWSCloudWatchEventPermission_PartnerEventBus resource_aws_cloudwatch_event_permission_test.go:328: Step 1/2 error: Error running apply: exit status 1 2021/03/29 17:47:27 [DEBUG] Using modified User-Agent: Terraform/0.12.26 HashiCorp-terraform-exec/0.13.0 Error: Creating CloudWatch Events permission failed: ValidationException: 1 validation error detected: Value 'aws.partner/datadog.com/TerraformTesting' at 'eventBusName' failed to satisfy constraint: Member must satisfy regular expression pattern: [\.\-_A-Za-z0-9]+ status code: 400, request id: 0975effd-27f5-4d2d-9b5f-d4a2d0b1a318 on terraform_plugin_test.tf line 2, in resource "aws_cloudwatch_event_permission" "test": 2: resource "aws_cloudwatch_event_permission" "test" { --- FAIL: TestAccAWSCloudWatchEventPermission_PartnerEventBus (10.31s) --- PASS: TestAccAWSCloudWatchEventPermission_EventBusName (27.23s) --- PASS: TestAccAWSCloudWatchEventPermission_Action (28.79s) --- PASS: TestAccAWSCloudWatchEventPermission_Multiple (36.03s) --- PASS: TestAccAWSCloudWatchEventPermission_Condition (37.43s) --- PASS: TestAccAWSCloudWatchEventPermission_basic (47.07s) --- PASS: TestAccAWSCloudWatchEventPermission_Disappears (138.42s) FAIL FAIL github.com/terraform-providers/terraform-provider-aws/aws 138.532s FAIL GNUmakefile:27: recipe for target 'testacc' failed make: *** [testacc] Error 1 --- aws/internal/service/cloudwatchevents/id.go | 14 ++- .../service/cloudwatchevents/id_test.go | 96 +++++++++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/aws/internal/service/cloudwatchevents/id.go b/aws/internal/service/cloudwatchevents/id.go index 025244332c3..a67fdda04d1 100644 --- a/aws/internal/service/cloudwatchevents/id.go +++ b/aws/internal/service/cloudwatchevents/id.go @@ -29,6 +29,14 @@ func PermissionParseID(id string) (string, string, error) { if len(parts) == 2 && parts[0] != "" && parts[1] != "" { return parts[0], parts[1], nil } + if len(parts) > 2 { + i := strings.LastIndex(id, ruleIDSeparator) + busName := id[:i] + statementID := id[i+1:] + if partnerEventBusPattern.MatchString(busName) && statementID != "" { + return busName, statementID, nil + } + } return "", "", fmt.Errorf("unexpected format for ID (%q), expected "+PermissionIDSeparator+" or ", id) } @@ -52,8 +60,10 @@ func RuleParseID(id string) (string, string, error) { } if len(parts) > 2 { i := strings.LastIndex(id, ruleIDSeparator) - if partnerEventBusPattern.MatchString(id[:i]) { - return id[:i], id[i+1:], nil + busName := id[:i] + statementID := id[i+1:] + if partnerEventBusPattern.MatchString(busName) && statementID != "" { + return busName, statementID, nil } } diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go index cddc2dba7e9..8056a9dac6a 100644 --- a/aws/internal/service/cloudwatchevents/id_test.go +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -52,6 +52,11 @@ func TestRuleParseID(t *testing.T) { InputID: "/TestRule", ExpectedError: true, }, + { + TestName: "empty partner event rule", + InputID: "aws.partner/example.com/Test/", + ExpectedError: true, + }, { TestName: "three parts", InputID: "TestEventBus/TestRule/Suffix", @@ -91,3 +96,94 @@ func TestRuleParseID(t *testing.T) { }) } } + +func TestPermissionParseID(t *testing.T) { + testCases := []struct { + TestName string + InputID string + ExpectedError bool + ExpectedPart0 string + ExpectedPart1 string + }{ + { + TestName: "empty ID", + InputID: "", + ExpectedError: true, + }, + { + TestName: "single part", + InputID: "TestStatement", + ExpectedPart0: "default", + ExpectedPart1: "TestStatement", + }, + { + TestName: "two parts", + InputID: "TestEventBus/TestStatement", + ExpectedPart0: "TestEventBus", + ExpectedPart1: "TestStatement", + }, + { + TestName: "partner event bus", + InputID: "aws.partner/example.com/Test/TestStatement", + ExpectedPart0: "aws.partner/example.com/Test", + ExpectedPart1: "TestStatement", + }, + { + TestName: "empty partner event statement", + InputID: "aws.partner/example.com/Test/", + ExpectedError: true, + }, + { + TestName: "empty both parts", + InputID: "/", + ExpectedError: true, + }, + { + TestName: "empty first part", + InputID: "TestEventBus/", + ExpectedError: true, + }, + { + TestName: "empty second part", + InputID: "/TestStatement", + ExpectedError: true, + }, + { + TestName: "three parts", + InputID: "TestEventBus/TestStatement/Suffix", + ExpectedError: true, + }, + { + TestName: "four parts", + InputID: "abc.partner/TestEventBus/TestStatement/Suffix", + ExpectedError: true, + }, + { + TestName: "five parts", + InputID: "test/aws.partner/example.com/TestStatement/TestRule", + ExpectedError: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.TestName, func(t *testing.T) { + gotPart0, gotPart1, err := tfevents.PermissionParseID(testCase.InputID) + + if err == nil && testCase.ExpectedError { + t.Fatalf("expected error, got no error") + } + + if err != nil && !testCase.ExpectedError { + t.Fatalf("got unexpected error: %s", err) + } + + if gotPart0 != testCase.ExpectedPart0 { + t.Errorf("got part 0 %s, expected %s", gotPart0, testCase.ExpectedPart0) + } + + if gotPart1 != testCase.ExpectedPart1 { + t.Errorf("got part 0 %s, expected %s", gotPart1, testCase.ExpectedPart1) + } + }) + } +} From a9750158ae1e22b1edd36511fa5408aaf1f42427 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Mon, 29 Mar 2021 17:59:54 -0400 Subject: [PATCH 05/13] Revert "r/aws_cloudwatch_event_permission: Support partner event bus names." This reverts commit 9147433726b98896a2c367cda5499d71f973080d. --- aws/internal/service/cloudwatchevents/id.go | 14 +-- .../service/cloudwatchevents/id_test.go | 96 ------------------- 2 files changed, 2 insertions(+), 108 deletions(-) diff --git a/aws/internal/service/cloudwatchevents/id.go b/aws/internal/service/cloudwatchevents/id.go index a67fdda04d1..025244332c3 100644 --- a/aws/internal/service/cloudwatchevents/id.go +++ b/aws/internal/service/cloudwatchevents/id.go @@ -29,14 +29,6 @@ func PermissionParseID(id string) (string, string, error) { if len(parts) == 2 && parts[0] != "" && parts[1] != "" { return parts[0], parts[1], nil } - if len(parts) > 2 { - i := strings.LastIndex(id, ruleIDSeparator) - busName := id[:i] - statementID := id[i+1:] - if partnerEventBusPattern.MatchString(busName) && statementID != "" { - return busName, statementID, nil - } - } return "", "", fmt.Errorf("unexpected format for ID (%q), expected "+PermissionIDSeparator+" or ", id) } @@ -60,10 +52,8 @@ func RuleParseID(id string) (string, string, error) { } if len(parts) > 2 { i := strings.LastIndex(id, ruleIDSeparator) - busName := id[:i] - statementID := id[i+1:] - if partnerEventBusPattern.MatchString(busName) && statementID != "" { - return busName, statementID, nil + if partnerEventBusPattern.MatchString(id[:i]) { + return id[:i], id[i+1:], nil } } diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go index 8056a9dac6a..cddc2dba7e9 100644 --- a/aws/internal/service/cloudwatchevents/id_test.go +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -52,11 +52,6 @@ func TestRuleParseID(t *testing.T) { InputID: "/TestRule", ExpectedError: true, }, - { - TestName: "empty partner event rule", - InputID: "aws.partner/example.com/Test/", - ExpectedError: true, - }, { TestName: "three parts", InputID: "TestEventBus/TestRule/Suffix", @@ -96,94 +91,3 @@ func TestRuleParseID(t *testing.T) { }) } } - -func TestPermissionParseID(t *testing.T) { - testCases := []struct { - TestName string - InputID string - ExpectedError bool - ExpectedPart0 string - ExpectedPart1 string - }{ - { - TestName: "empty ID", - InputID: "", - ExpectedError: true, - }, - { - TestName: "single part", - InputID: "TestStatement", - ExpectedPart0: "default", - ExpectedPart1: "TestStatement", - }, - { - TestName: "two parts", - InputID: "TestEventBus/TestStatement", - ExpectedPart0: "TestEventBus", - ExpectedPart1: "TestStatement", - }, - { - TestName: "partner event bus", - InputID: "aws.partner/example.com/Test/TestStatement", - ExpectedPart0: "aws.partner/example.com/Test", - ExpectedPart1: "TestStatement", - }, - { - TestName: "empty partner event statement", - InputID: "aws.partner/example.com/Test/", - ExpectedError: true, - }, - { - TestName: "empty both parts", - InputID: "/", - ExpectedError: true, - }, - { - TestName: "empty first part", - InputID: "TestEventBus/", - ExpectedError: true, - }, - { - TestName: "empty second part", - InputID: "/TestStatement", - ExpectedError: true, - }, - { - TestName: "three parts", - InputID: "TestEventBus/TestStatement/Suffix", - ExpectedError: true, - }, - { - TestName: "four parts", - InputID: "abc.partner/TestEventBus/TestStatement/Suffix", - ExpectedError: true, - }, - { - TestName: "five parts", - InputID: "test/aws.partner/example.com/TestStatement/TestRule", - ExpectedError: true, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.TestName, func(t *testing.T) { - gotPart0, gotPart1, err := tfevents.PermissionParseID(testCase.InputID) - - if err == nil && testCase.ExpectedError { - t.Fatalf("expected error, got no error") - } - - if err != nil && !testCase.ExpectedError { - t.Fatalf("got unexpected error: %s", err) - } - - if gotPart0 != testCase.ExpectedPart0 { - t.Errorf("got part 0 %s, expected %s", gotPart0, testCase.ExpectedPart0) - } - - if gotPart1 != testCase.ExpectedPart1 { - t.Errorf("got part 0 %s, expected %s", gotPart1, testCase.ExpectedPart1) - } - }) - } -} From fe0a09c472f432e1f38a7897935024dd209a7558 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Mon, 29 Mar 2021 18:00:11 -0400 Subject: [PATCH 06/13] Revert "r/aws_cloudwatch_event_permission: Add 'TestAccAWSCloudWatchEventPermission_PartnerEventBus'." This reverts commit 10feef37ef808c78b7eeac16233fc3e2a5686fc6. --- ...ce_aws_cloudwatch_event_permission_test.go | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/aws/resource_aws_cloudwatch_event_permission_test.go b/aws/resource_aws_cloudwatch_event_permission_test.go index 47d2cdd7204..153309ab038 100644 --- a/aws/resource_aws_cloudwatch_event_permission_test.go +++ b/aws/resource_aws_cloudwatch_event_permission_test.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "log" - "os" "regexp" "testing" "time" @@ -315,40 +314,6 @@ func TestAccAWSCloudWatchEventPermission_Disappears(t *testing.T) { }) } -func TestAccAWSCloudWatchEventPermission_PartnerEventBus(t *testing.T) { - key := "EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME" - busName := os.Getenv(key) - if busName == "" { - t.Skipf("Environment variable %s is not set", key) - } - - rName := acctest.RandomWithPrefix("tf-acc-test") - resourceName := "aws_cloudwatch_event_permission.test" - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ErrorCheck: testAccErrorCheck(t, cloudwatchevents.EndpointsID), - Providers: testAccProviders, - CheckDestroy: testAccCheckCloudWatchEventPermissionDestroy, - Steps: []resource.TestStep{ - { - Config: testAccCheckAwsCloudWatchEventPermissionPartnerEventBusConfig(rName, busName), - Check: resource.ComposeTestCheckFunc( - testAccCheckCloudWatchEventPermissionExists(resourceName), - resource.TestCheckResourceAttr(resourceName, "event_bus_name", busName), - resource.TestCheckResourceAttr(resourceName, "principal", "111111111111"), - resource.TestCheckResourceAttr(resourceName, "statement_id", rName), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, - }, - }) -} - func testAccCheckCloudWatchEventPermissionExists(pr string) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).cloudwatcheventsconn @@ -508,13 +473,3 @@ resource "aws_cloudwatch_event_permission" "test2" { } `, principal1, statementID1, principal2, statementID2) } - -func testAccCheckAwsCloudWatchEventPermissionPartnerEventBusConfig(rName, eventBusName string) string { - return fmt.Sprintf(` -resource "aws_cloudwatch_event_permission" "test" { - principal = "111111111111" - statement_id = %[1]q - event_bus_name = %[2]q -} -`, rName, eventBusName) -} From 61e60007fac915aeb826c3d47418eeb513cbffd9 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Mon, 29 Mar 2021 18:01:41 -0400 Subject: [PATCH 07/13] Additional TestRuleParseID case. --- aws/internal/service/cloudwatchevents/id.go | 6 ++++-- aws/internal/service/cloudwatchevents/id_test.go | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/aws/internal/service/cloudwatchevents/id.go b/aws/internal/service/cloudwatchevents/id.go index 025244332c3..7ba7363a320 100644 --- a/aws/internal/service/cloudwatchevents/id.go +++ b/aws/internal/service/cloudwatchevents/id.go @@ -52,8 +52,10 @@ func RuleParseID(id string) (string, string, error) { } if len(parts) > 2 { i := strings.LastIndex(id, ruleIDSeparator) - if partnerEventBusPattern.MatchString(id[:i]) { - return id[:i], id[i+1:], nil + busName := id[:i] + statementID := id[i+1:] + if partnerEventBusPattern.MatchString(busName) && statementID != "" { + return busName, statementID, nil } } diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go index cddc2dba7e9..ee0064f8ff3 100644 --- a/aws/internal/service/cloudwatchevents/id_test.go +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -52,6 +52,11 @@ func TestRuleParseID(t *testing.T) { InputID: "/TestRule", ExpectedError: true, }, + { + TestName: "empty partner event rule", + InputID: "aws.partner/example.com/Test/", + ExpectedError: true, + }, { TestName: "three parts", InputID: "TestEventBus/TestRule/Suffix", From 025083e6d3461e5b8caabfaa15b97ffcfec048d6 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 30 Mar 2021 14:28:38 -0400 Subject: [PATCH 08/13] r/aws_cloudwatch_event_target: Add 'TestAccAWSCloudWatchEventTarget_PartnerEventBus'. Acceptance test output: $ EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME=aws.partner/datadog.com/TerraformTesting make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSCloudWatchEventTarget_PartnerEventBus' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSCloudWatchEventTarget_PartnerEventBus -timeout 180m === RUN TestAccAWSCloudWatchEventTarget_PartnerEventBus === PAUSE TestAccAWSCloudWatchEventTarget_PartnerEventBus === CONT TestAccAWSCloudWatchEventTarget_PartnerEventBus map[string]string{"%":"16", "arn":"arn:aws:sns:us-west-2:123456789012:tf-acc-test-8868416352113624735", "batch_target.#":"0", "dead_letter_config.#":"0", "ecs_target.#":"0", "event_bus_name":"aws.partner/datadog.com/TerraformTesting", "id":"aws.partner/datadog.com/TerraformTesting-tf-acc-test-8868416352113624735-tf-acc-test-8868416352113624735", "input":"", "input_path":"", "input_transformer.#":"0", "kinesis_target.#":"0", "retry_policy.#":"0", "role_arn":"", "rule":"tf-acc-test-8868416352113624735", "run_command_targets.#":"0", "sqs_target.#":"0", "target_id":"tf-acc-test-8868416352113624735"} resource_aws_cloudwatch_event_target_test.go:646: Step 2/2 error running import: exit status 1 2021/03/30 14:26:29 [DEBUG] Using modified User-Agent: Terraform/0.12.26 HashiCorp-terraform-exec/0.13.0 Error: unexpected format for ID ("aws.partner/datadog.com/TerraformTesting/tf-acc-test-8868416352113624735/tf-acc-test-8868416352113624735"), expected // or / --- FAIL: TestAccAWSCloudWatchEventTarget_PartnerEventBus (15.08s) FAIL FAIL github.com/terraform-providers/terraform-provider-aws/aws 15.433s FAIL GNUmakefile:27: recipe for target 'testacc' failed make: *** [testacc] Error 1 --- ...source_aws_cloudwatch_event_target_test.go | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/aws/resource_aws_cloudwatch_event_target_test.go b/aws/resource_aws_cloudwatch_event_target_test.go index 3599a5bb708..b75aa986880 100644 --- a/aws/resource_aws_cloudwatch_event_target_test.go +++ b/aws/resource_aws_cloudwatch_event_target_test.go @@ -3,6 +3,7 @@ package aws import ( "fmt" "log" + "os" "regexp" "strconv" "strings" @@ -630,6 +631,44 @@ func TestAccAWSCloudWatchEventTarget_inputTransformerJsonString(t *testing.T) { }) } +func TestAccAWSCloudWatchEventTarget_PartnerEventBus(t *testing.T) { + key := "EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME" + busName := os.Getenv(key) + if busName == "" { + t.Skipf("Environment variable %s is not set", key) + } + + var target events.Target + rName := acctest.RandomWithPrefix("tf-acc-test") + resourceName := "aws_cloudwatch_event_target.test" + snsTopicResourceName := "aws_sns_topic.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ErrorCheck: testAccErrorCheck(t, cloudwatchevents.EndpointsID), + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCloudWatchEventTargetDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSCloudWatchEventTargetPartnerEventBusConfig(rName, busName), + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudWatchEventTargetExists(resourceName, &target), + resource.TestCheckResourceAttr(resourceName, "rule", rName), + resource.TestCheckResourceAttr(resourceName, "event_bus_name", busName), + resource.TestCheckResourceAttr(resourceName, "target_id", rName), + resource.TestCheckResourceAttrPair(resourceName, "arn", snsTopicResourceName, "arn"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateIdFunc: testAccAWSCloudWatchEventTargetImportStateIdFunc(resourceName), + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckCloudWatchEventTargetExists(n string, rule *events.Target) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -1574,3 +1613,29 @@ EOF data "aws_partition" "current" {} `, name) } + +func testAccAWSCloudWatchEventTargetPartnerEventBusConfig(rName, eventBusName string) string { + return fmt.Sprintf(` +resource "aws_cloudwatch_event_rule" "test" { + name = %[1]q + event_bus_name = %[2]q + + event_pattern = < Date: Tue, 30 Mar 2021 16:44:55 -0400 Subject: [PATCH 09/13] r/aws_cloudwatch_event_target: Support partner event bus names. Acceptance test output: $ EVENT_BRIDGE_PARTNER_EVENT_BUS_NAME=aws.partner/datadog.com/TerraformTesting make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSCloudWatchEventTarget_' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSCloudWatchEventTarget_ -timeout 180m === RUN TestAccAWSCloudWatchEventTarget_basic === PAUSE TestAccAWSCloudWatchEventTarget_basic === RUN TestAccAWSCloudWatchEventTarget_EventBusName === PAUSE TestAccAWSCloudWatchEventTarget_EventBusName === RUN TestAccAWSCloudWatchEventTarget_GeneratedTargetId === PAUSE TestAccAWSCloudWatchEventTarget_GeneratedTargetId === RUN TestAccAWSCloudWatchEventTarget_RetryPolicy_DeadLetterConfig === PAUSE TestAccAWSCloudWatchEventTarget_RetryPolicy_DeadLetterConfig === RUN TestAccAWSCloudWatchEventTarget_full === PAUSE TestAccAWSCloudWatchEventTarget_full === RUN TestAccAWSCloudWatchEventTarget_disappears === PAUSE TestAccAWSCloudWatchEventTarget_disappears === RUN TestAccAWSCloudWatchEventTarget_ssmDocument === PAUSE TestAccAWSCloudWatchEventTarget_ssmDocument === RUN TestAccAWSCloudWatchEventTarget_ecs === PAUSE TestAccAWSCloudWatchEventTarget_ecs === RUN TestAccAWSCloudWatchEventTarget_ecsWithBlankTaskCount === PAUSE TestAccAWSCloudWatchEventTarget_ecsWithBlankTaskCount === RUN TestAccAWSCloudWatchEventTarget_batch === PAUSE TestAccAWSCloudWatchEventTarget_batch === RUN TestAccAWSCloudWatchEventTarget_kinesis === PAUSE TestAccAWSCloudWatchEventTarget_kinesis === RUN TestAccAWSCloudWatchEventTarget_sqs === PAUSE TestAccAWSCloudWatchEventTarget_sqs === RUN TestAccAWSCloudWatchEventTarget_input_transformer === PAUSE TestAccAWSCloudWatchEventTarget_input_transformer === RUN TestAccAWSCloudWatchEventTarget_inputTransformerJsonString === PAUSE TestAccAWSCloudWatchEventTarget_inputTransformerJsonString === RUN TestAccAWSCloudWatchEventTarget_PartnerEventBus === PAUSE TestAccAWSCloudWatchEventTarget_PartnerEventBus === CONT TestAccAWSCloudWatchEventTarget_basic === CONT TestAccAWSCloudWatchEventTarget_ecsWithBlankTaskCount === CONT TestAccAWSCloudWatchEventTarget_PartnerEventBus === CONT TestAccAWSCloudWatchEventTarget_inputTransformerJsonString === CONT TestAccAWSCloudWatchEventTarget_input_transformer === CONT TestAccAWSCloudWatchEventTarget_sqs === CONT TestAccAWSCloudWatchEventTarget_kinesis === CONT TestAccAWSCloudWatchEventTarget_batch === CONT TestAccAWSCloudWatchEventTarget_full === CONT TestAccAWSCloudWatchEventTarget_ecs === CONT TestAccAWSCloudWatchEventTarget_ssmDocument === CONT TestAccAWSCloudWatchEventTarget_disappears === CONT TestAccAWSCloudWatchEventTarget_GeneratedTargetId === CONT TestAccAWSCloudWatchEventTarget_RetryPolicy_DeadLetterConfig === CONT TestAccAWSCloudWatchEventTarget_EventBusName --- PASS: TestAccAWSCloudWatchEventTarget_disappears (36.09s) --- PASS: TestAccAWSCloudWatchEventTarget_PartnerEventBus (38.80s) --- PASS: TestAccAWSCloudWatchEventTarget_GeneratedTargetId (40.40s) --- PASS: TestAccAWSCloudWatchEventTarget_sqs (40.45s) --- PASS: TestAccAWSCloudWatchEventTarget_ssmDocument (42.26s) --- PASS: TestAccAWSCloudWatchEventTarget_inputTransformerJsonString (50.73s) --- PASS: TestAccAWSCloudWatchEventTarget_ecsWithBlankTaskCount (55.82s) --- PASS: TestAccAWSCloudWatchEventTarget_ecs (55.97s) --- PASS: TestAccAWSCloudWatchEventTarget_EventBusName (62.47s) --- PASS: TestAccAWSCloudWatchEventTarget_input_transformer (63.21s) --- PASS: TestAccAWSCloudWatchEventTarget_basic (72.88s) --- PASS: TestAccAWSCloudWatchEventTarget_RetryPolicy_DeadLetterConfig (78.52s) --- PASS: TestAccAWSCloudWatchEventTarget_kinesis (80.00s) --- PASS: TestAccAWSCloudWatchEventTarget_full (80.40s) --- PASS: TestAccAWSCloudWatchEventTarget_batch (173.11s) PASS ok github.com/terraform-providers/terraform-provider-aws/aws 173.215s --- aws/internal/service/cloudwatchevents/id.go | 10 ++ .../service/cloudwatchevents/id_test.go | 145 +++++++++++++++++- ...source_aws_cloudwatch_event_target_test.go | 2 - 3 files changed, 152 insertions(+), 5 deletions(-) diff --git a/aws/internal/service/cloudwatchevents/id.go b/aws/internal/service/cloudwatchevents/id.go index 7ba7363a320..7d383458c5a 100644 --- a/aws/internal/service/cloudwatchevents/id.go +++ b/aws/internal/service/cloudwatchevents/id.go @@ -84,6 +84,16 @@ func TargetParseImportID(id string) (string, string, string, error) { if len(parts) == 3 && parts[0] != "" && parts[1] != "" && parts[2] != "" { return parts[0], parts[1], parts[2], nil } + if len(parts) > 3 { + iTarget := strings.LastIndex(id, targetImportIDSeparator) + targetID := id[iTarget+1:] + iRule := strings.LastIndex(id[:iTarget], targetImportIDSeparator) + busName := id[:iRule] + ruleName := id[iRule+1 : iTarget] + if partnerEventBusPattern.MatchString(busName) && ruleName != "" && targetID != "" { + return busName, ruleName, targetID, nil + } + } return "", "", "", fmt.Errorf("unexpected format for ID (%q), expected "+targetImportIDSeparator+""+targetImportIDSeparator+" or "+targetImportIDSeparator+"", id) } diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go index ee0064f8ff3..60e46279a23 100644 --- a/aws/internal/service/cloudwatchevents/id_test.go +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -44,12 +44,12 @@ func TestRuleParseID(t *testing.T) { }, { TestName: "empty first part", - InputID: "TestEventBus/", + InputID: "/TestRule", ExpectedError: true, }, { TestName: "empty second part", - InputID: "/TestRule", + InputID: "TestEventBus/", ExpectedError: true, }, { @@ -91,7 +91,146 @@ func TestRuleParseID(t *testing.T) { } if gotPart1 != testCase.ExpectedPart1 { - t.Errorf("got part 0 %s, expected %s", gotPart1, testCase.ExpectedPart1) + t.Errorf("got part 1 %s, expected %s", gotPart1, testCase.ExpectedPart1) + } + }) + } +} + +func TestTargetParseImportID(t *testing.T) { + testCases := []struct { + TestName string + InputID string + ExpectedError bool + ExpectedPart0 string + ExpectedPart1 string + ExpectedPart2 string + }{ + { + TestName: "empty ID", + InputID: "", + ExpectedError: true, + }, + { + TestName: "single part", + InputID: "TestRule", + ExpectedError: true, + }, + { + TestName: "two parts", + InputID: "TestTarget/TestRule", + ExpectedPart0: "default", + ExpectedPart1: "TestTarget", + ExpectedPart2: "TestRule", + }, + { + TestName: "three parts", + InputID: "TestEventBus/TestRule/TestTarget", + ExpectedPart0: "TestEventBus", + ExpectedPart1: "TestRule", + ExpectedPart2: "TestTarget", + }, + { + TestName: "empty two parts", + InputID: "/", + ExpectedError: true, + }, + { + TestName: "empty three parts", + InputID: "//", + ExpectedError: true, + }, + { + TestName: "empty first part of two", + InputID: "/TestTarget", + ExpectedError: true, + }, + { + TestName: "empty second part of two", + InputID: "TestRule/", + ExpectedError: true, + }, + { + TestName: "empty first part of three", + InputID: "/TestRule/TestTarget", + ExpectedError: true, + }, + { + TestName: "empty second part of three", + InputID: "TestEventBus//TestTarget", + ExpectedError: true, + }, + { + TestName: "empty third part of three", + InputID: "TestEventBus/TestRule/", + ExpectedError: true, + }, + { + TestName: "empty first two of three parts", + InputID: "//TestTarget", + ExpectedError: true, + }, + { + TestName: "empty first and third of three parts", + InputID: "/TestRule/", + ExpectedError: true, + }, + { + TestName: "empty final two of three parts", + InputID: "TestEventBus//", + ExpectedError: true, + }, + { + TestName: "partner event bus", + InputID: "aws.partner/example.com/Test/TestRule/TestTarget", + ExpectedPart0: "aws.partner/example.com/Test", + ExpectedPart1: "TestRule", + ExpectedPart2: "TestTarget", + }, + { + TestName: "empty partner event rule and target", + InputID: "aws.partner/example.com/Test//", + ExpectedError: true, + }, + { + TestName: "four parts", + InputID: "aws.partner/example.com/Test/TestRule", + ExpectedError: true, + }, + { + TestName: "five parts", + InputID: "abc.partner/example.com/Test/TestRule/TestTarget", + ExpectedError: true, + }, + { + TestName: "six parts", + InputID: "test/aws.partner/example.com/Test/TestRule/TestTarget", + ExpectedError: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.TestName, func(t *testing.T) { + gotPart0, gotPart1, gotPart2, err := tfevents.TargetParseImportID(testCase.InputID) + + if err == nil && testCase.ExpectedError { + t.Fatalf("expected error, got no error") + } + + if err != nil && !testCase.ExpectedError { + t.Fatalf("got unexpected error: %s", err) + } + + if gotPart0 != testCase.ExpectedPart0 { + t.Errorf("got part 0 %s, expected %s", gotPart0, testCase.ExpectedPart0) + } + + if gotPart1 != testCase.ExpectedPart1 { + t.Errorf("got part 1 %s, expected %s", gotPart1, testCase.ExpectedPart1) + } + + if gotPart2 != testCase.ExpectedPart2 { + t.Errorf("got part 2 %s, expected %s", gotPart2, testCase.ExpectedPart2) } }) } diff --git a/aws/resource_aws_cloudwatch_event_target_test.go b/aws/resource_aws_cloudwatch_event_target_test.go index b75aa986880..512a4d49854 100644 --- a/aws/resource_aws_cloudwatch_event_target_test.go +++ b/aws/resource_aws_cloudwatch_event_target_test.go @@ -713,8 +713,6 @@ func testAccAWSCloudWatchEventTargetImportStateIdFunc(resourceName string) resou return "", fmt.Errorf("Not found: %s", resourceName) } - fmt.Printf("%#v", rs.Primary.Attributes) - return fmt.Sprintf("%s/%s/%s", rs.Primary.Attributes["event_bus_name"], rs.Primary.Attributes["rule"], rs.Primary.Attributes["target_id"]), nil } } From 81bbfcb4431de6ccccbb6e1cec0097055f621e3b Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 30 Mar 2021 16:54:44 -0400 Subject: [PATCH 10/13] Add CHANGELOG entry. --- .changelog/18491.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changelog/18491.txt diff --git a/.changelog/18491.txt b/.changelog/18491.txt new file mode 100644 index 00000000000..225dc3f2efe --- /dev/null +++ b/.changelog/18491.txt @@ -0,0 +1,7 @@ +```release-note:enhancement +resource/aws_cloudwatch_event_target: Support partner event bus names +``` + +```release-note:enhancement +resource/aws_cloudwatch_event_rule: Support partner event bus names +``` From addbc8fadfbf3befcc895214e4c253d6932e8500 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 31 Mar 2021 09:22:00 -0400 Subject: [PATCH 11/13] Fix terraform errors. --- aws/resource_aws_cloudwatch_event_rule_test.go | 6 +++--- aws/resource_aws_cloudwatch_event_target_test.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws/resource_aws_cloudwatch_event_rule_test.go b/aws/resource_aws_cloudwatch_event_rule_test.go index 488021edeeb..69ed9b6e712 100644 --- a/aws/resource_aws_cloudwatch_event_rule_test.go +++ b/aws/resource_aws_cloudwatch_event_rule_test.go @@ -779,10 +779,10 @@ resource "aws_cloudwatch_event_rule" "test" { func testAccAWSCloudWatchEventRulePartnerEventBusConfig(rName, eventBusName string) string { return fmt.Sprintf(` resource "aws_cloudwatch_event_rule" "test" { - name = %[1]q - event_bus_name = %[2]q + name = %[1]q + event_bus_name = %[2]q - event_pattern = < Date: Wed, 31 Mar 2021 09:30:23 -0400 Subject: [PATCH 12/13] Some additional unit test cases. --- .../service/cloudwatchevents/id_test.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go index 60e46279a23..409ec580ae8 100644 --- a/aws/internal/service/cloudwatchevents/id_test.go +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -22,15 +22,21 @@ func TestRuleParseID(t *testing.T) { { TestName: "single part", InputID: "TestRule", - ExpectedPart0: "default", + ExpectedPart0: tfevents.DefaultEventBusName, ExpectedPart1: "TestRule", }, { TestName: "two parts", - InputID: "TestEventBus/TestRule", + InputID: tfevents.RuleCreateID("TestEventBus", "TestRule"), ExpectedPart0: "TestEventBus", ExpectedPart1: "TestRule", }, + { + TestName: "two parts with default event bus", + InputID: tfevents.RuleCreateID(tfevents.DefaultEventBusName, "TestRule"), + ExpectedPart0: tfevents.DefaultEventBusName, + ExpectedPart1: "TestRule", + }, { TestName: "partner event bus", InputID: "aws.partner/example.com/Test/TestRule", @@ -119,7 +125,7 @@ func TestTargetParseImportID(t *testing.T) { { TestName: "two parts", InputID: "TestTarget/TestRule", - ExpectedPart0: "default", + ExpectedPart0: tfevents.DefaultEventBusName, ExpectedPart1: "TestTarget", ExpectedPart2: "TestRule", }, @@ -130,6 +136,13 @@ func TestTargetParseImportID(t *testing.T) { ExpectedPart1: "TestRule", ExpectedPart2: "TestTarget", }, + { + TestName: "three parts with default event bus", + InputID: tfevents.DefaultEventBusName + "/TestRule/TestTarget", + ExpectedPart0: tfevents.DefaultEventBusName, + ExpectedPart1: "TestRule", + ExpectedPart2: "TestTarget", + }, { TestName: "empty two parts", InputID: "/", From 7c92d94ba9f9eee3e0982b2dc4d0da3a44b5148b Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 31 Mar 2021 09:34:00 -0400 Subject: [PATCH 13/13] Add 'TestPermissionParseID'. --- .../service/cloudwatchevents/id_test.go | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/aws/internal/service/cloudwatchevents/id_test.go b/aws/internal/service/cloudwatchevents/id_test.go index 409ec580ae8..97ae7823a90 100644 --- a/aws/internal/service/cloudwatchevents/id_test.go +++ b/aws/internal/service/cloudwatchevents/id_test.go @@ -6,6 +6,87 @@ import ( tfevents "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents" ) +func TestPermissionParseID(t *testing.T) { + testCases := []struct { + TestName string + InputID string + ExpectedError bool + ExpectedPart0 string + ExpectedPart1 string + }{ + { + TestName: "empty ID", + InputID: "", + ExpectedError: true, + }, + { + TestName: "single part", + InputID: "TestStatement", + ExpectedPart0: tfevents.DefaultEventBusName, + ExpectedPart1: "TestStatement", + }, + { + TestName: "two parts", + InputID: tfevents.PermissionCreateID("TestEventBus", "TestStatement"), + ExpectedPart0: "TestEventBus", + ExpectedPart1: "TestStatement", + }, + { + TestName: "two parts with default event bus", + InputID: tfevents.PermissionCreateID(tfevents.DefaultEventBusName, "TestStatement"), + ExpectedPart0: tfevents.DefaultEventBusName, + ExpectedPart1: "TestStatement", + }, + { + TestName: "partner event bus", + InputID: "aws.partner/example.com/Test/TestStatement", + ExpectedError: true, + }, + { + TestName: "empty both parts", + InputID: "/", + ExpectedError: true, + }, + { + TestName: "empty first part", + InputID: "/TestStatement", + ExpectedError: true, + }, + { + TestName: "empty second part", + InputID: "TestEventBus/", + ExpectedError: true, + }, + { + TestName: "three parts", + InputID: "TestEventBus/TestStatement/Suffix", + ExpectedError: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.TestName, func(t *testing.T) { + gotPart0, gotPart1, err := tfevents.PermissionParseID(testCase.InputID) + + if err == nil && testCase.ExpectedError { + t.Fatalf("expected error, got no error") + } + + if err != nil && !testCase.ExpectedError { + t.Fatalf("got unexpected error: %s", err) + } + + if gotPart0 != testCase.ExpectedPart0 { + t.Errorf("got part 0 %s, expected %s", gotPart0, testCase.ExpectedPart0) + } + + if gotPart1 != testCase.ExpectedPart1 { + t.Errorf("got part 1 %s, expected %s", gotPart1, testCase.ExpectedPart1) + } + }) + } +} + func TestRuleParseID(t *testing.T) { testCases := []struct { TestName string