From 4c91c1d5921b148db805731670633dfe63d49ec6 Mon Sep 17 00:00:00 2001 From: Junyeong Yim Date: Sun, 14 May 2023 21:13:30 +0900 Subject: [PATCH 1/6] add `drop` options to email_routing_rule Detail ====== - the `action` should be one of `forward`, `worker`, `drop`, but there was no `drop` in latest provider. - ref: cloudflare/terraform-provider-cloudflare#1947 --- .../sdkv2provider/resource_cloudflare_email_routing_rule.go | 6 ++++-- .../sdkv2provider/schema_cloudflare_email_routing_rules.go | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/sdkv2provider/resource_cloudflare_email_routing_rule.go b/internal/sdkv2provider/resource_cloudflare_email_routing_rule.go index 48c3ec1ab5..9892f17433 100644 --- a/internal/sdkv2provider/resource_cloudflare_email_routing_rule.go +++ b/internal/sdkv2provider/resource_cloudflare_email_routing_rule.go @@ -46,8 +46,10 @@ func buildMatchersAndActions(d *schema.ResourceData) (matchers []cloudflare.Emai action := item.(map[string]interface{}) ruleAction := cloudflare.EmailRoutingRuleAction{} ruleAction.Type = action["type"].(string) - for _, value := range action["value"].([]interface{}) { - ruleAction.Value = append(ruleAction.Value, value.(string)) + if val, ok := action["value"]; ok { + for _, value := range val.([]interface{}) { + ruleAction.Value = append(ruleAction.Value, value.(string)) + } } actions = append(actions, ruleAction) diff --git a/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go b/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go index f8900948c0..2e09d511bd 100644 --- a/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go +++ b/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go @@ -71,7 +71,7 @@ func resourceCloudflareEmailRoutingRuleSchema() map[string]*schema.Schema { Description: "Type of supported action.", Type: schema.TypeString, Required: true, - ValidateFunc: validation.StringInSlice([]string{"forward", "worker"}, true), + ValidateFunc: validation.StringInSlice([]string{"forward", "worker", "drop"}, true), }, "value": { Description: "An array with items in the following form.", From 85e4e22c1a5a38d4d078dc8eccbbf5add4b33e95 Mon Sep 17 00:00:00 2001 From: Junyeong Yim Date: Thu, 18 May 2023 13:14:39 +0900 Subject: [PATCH 2/6] add action type `drop` to email routing rule --- .changelog/2449.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/2449.txt diff --git a/.changelog/2449.txt b/.changelog/2449.txt new file mode 100644 index 0000000000..992c5a92be --- /dev/null +++ b/.changelog/2449.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/cloudflare_email_routing_rule: add action type `drop` +``` From 788891d0f27a7af15928ee61f2316479a1592a37 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Thu, 23 Nov 2023 13:15:19 +1100 Subject: [PATCH 3/6] `make docs` --- docs/resources/email_routing_rule.md | 4 ++-- .../sdkv2provider/schema_cloudflare_email_routing_rules.go | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/resources/email_routing_rule.md b/docs/resources/email_routing_rule.md index 9f83406840..22b584e4a2 100644 --- a/docs/resources/email_routing_rule.md +++ b/docs/resources/email_routing_rule.md @@ -54,7 +54,7 @@ resource "cloudflare_email_routing_rule" "main" { Required: -- `type` (String) Type of supported action. +- `type` (String) Type of supported action. Available values: `forward`, `worker`, `drop`. - `value` (List of String) An array with items in the following form. @@ -63,7 +63,7 @@ Required: Required: -- `type` (String) Type of matcher. +- `type` (String) Type of matcher. Available values: `literal`, `all`. Optional: diff --git a/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go b/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go index 2e09d511bd..2e20059e62 100644 --- a/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go +++ b/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go @@ -1,6 +1,8 @@ package sdkv2provider import ( + "fmt" + "github.com/cloudflare/terraform-provider-cloudflare/internal/consts" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" @@ -42,7 +44,7 @@ func resourceCloudflareEmailRoutingRuleSchema() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "type": { - Description: "Type of matcher.", + Description: fmt.Sprintf("Type of matcher. %s", renderAvailableDocumentationValuesStringSlice([]string{"literal", "all"})), Type: schema.TypeString, Required: true, ValidateFunc: validation.StringInSlice([]string{"literal", "all"}, true), @@ -68,7 +70,7 @@ func resourceCloudflareEmailRoutingRuleSchema() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "type": { - Description: "Type of supported action.", + Description: fmt.Sprintf("Type of supported action. %s", renderAvailableDocumentationValuesStringSlice([]string{"forward", "worker", "drop"})), Type: schema.TypeString, Required: true, ValidateFunc: validation.StringInSlice([]string{"forward", "worker", "drop"}, true), From cc801c357339fd1a335b2515353525c4f75a6bd4 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Thu, 23 Nov 2023 13:27:14 +1100 Subject: [PATCH 4/6] fix email routing test naming --- .../resource_cloudflare_email_routing_address_test.go | 2 +- .../resource_cloudflare_email_routing_catch_all_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/sdkv2provider/resource_cloudflare_email_routing_address_test.go b/internal/sdkv2provider/resource_cloudflare_email_routing_address_test.go index c4fc0677b0..3fec5349a6 100644 --- a/internal/sdkv2provider/resource_cloudflare_email_routing_address_test.go +++ b/internal/sdkv2provider/resource_cloudflare_email_routing_address_test.go @@ -18,7 +18,7 @@ func testEmailRoutingAddressConfig(resourceID, accountID, email string) string { `, resourceID, accountID, email) } -func TestAccTestEmailRoutingAddress(t *testing.T) { +func TestAccCloudflareEmailRoutingAddress(t *testing.T) { rnd := generateRandomResourceName() name := "cloudflare_email_routing_address." + rnd accountID := os.Getenv("CLOUDFLARE_ACCOUNT_ID") diff --git a/internal/sdkv2provider/resource_cloudflare_email_routing_catch_all_test.go b/internal/sdkv2provider/resource_cloudflare_email_routing_catch_all_test.go index 5a5cd874f3..3d5b08cab7 100644 --- a/internal/sdkv2provider/resource_cloudflare_email_routing_catch_all_test.go +++ b/internal/sdkv2provider/resource_cloudflare_email_routing_catch_all_test.go @@ -28,7 +28,7 @@ func testEmailRoutingRuleCatchAllConfig(resourceID, zoneID string, enabled bool) `, resourceID, zoneID, enabled) } -func TestAccTestEmailRoutingCatchAll(t *testing.T) { +func TestAccCloudflareEmailRoutingCatchAll(t *testing.T) { rnd := generateRandomResourceName() name := "cloudflare_email_routing_catch_all." + rnd zoneID := os.Getenv("CLOUDFLARE_ZONE_ID") From 8ca26a4cd64a2cdb8bde5014f7415ef54fc1bf55 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Thu, 23 Nov 2023 13:30:56 +1100 Subject: [PATCH 5/6] mark `actions.value` optional to account for `drop` rules --- .changelog/2449.txt | 4 ++++ docs/resources/email_routing_rule.md | 5 ++++- .../sdkv2provider/schema_cloudflare_email_routing_rules.go | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.changelog/2449.txt b/.changelog/2449.txt index 992c5a92be..6812791e84 100644 --- a/.changelog/2449.txt +++ b/.changelog/2449.txt @@ -1,3 +1,7 @@ ```release-note:enhancement resource/cloudflare_email_routing_rule: add action type `drop` ``` + +```release-note:enhancement +resource/cloudflare_email_routing_rule: `action.value` is now optional to support `drop` rules not requiring it +``` diff --git a/docs/resources/email_routing_rule.md b/docs/resources/email_routing_rule.md index 22b584e4a2..a38f0ffa0d 100644 --- a/docs/resources/email_routing_rule.md +++ b/docs/resources/email_routing_rule.md @@ -55,7 +55,10 @@ resource "cloudflare_email_routing_rule" "main" { Required: - `type` (String) Type of supported action. Available values: `forward`, `worker`, `drop`. -- `value` (List of String) An array with items in the following form. + +Optional: + +- `value` (List of String) An array with items in the following form. Only required when `type` is `forward` or `worker`. diff --git a/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go b/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go index 2e20059e62..f0978b448c 100644 --- a/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go +++ b/internal/sdkv2provider/schema_cloudflare_email_routing_rules.go @@ -76,9 +76,9 @@ func resourceCloudflareEmailRoutingRuleSchema() map[string]*schema.Schema { ValidateFunc: validation.StringInSlice([]string{"forward", "worker", "drop"}, true), }, "value": { - Description: "An array with items in the following form.", + Description: "An array with items in the following form. Only required when `type` is `forward` or `worker`.", Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{ Type: schema.TypeString, ValidateFunc: validation.StringLenBetween(0, 90), From fe44307c855d04c023ad5e4cfa74859cff0229d1 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Thu, 23 Nov 2023 13:31:05 +1100 Subject: [PATCH 6/6] add test coverage for drop rules --- ...urce_cloudflare_email_routing_rule_test.go | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/internal/sdkv2provider/resource_cloudflare_email_routing_rule_test.go b/internal/sdkv2provider/resource_cloudflare_email_routing_rule_test.go index 045f88df6b..d45f16f17e 100644 --- a/internal/sdkv2provider/resource_cloudflare_email_routing_rule_test.go +++ b/internal/sdkv2provider/resource_cloudflare_email_routing_rule_test.go @@ -30,7 +30,27 @@ func testEmailRoutingRuleConfig(resourceID, zoneID string, enabled bool, priorit `, resourceID, zoneID, enabled, priority) } -func TestAccTestEmailRoutingRule(t *testing.T) { +func testEmailRoutingRuleConfigDrop(resourceID, zoneID string, enabled bool, priority int) string { + return fmt.Sprintf(` + resource "cloudflare_email_routing_rule" "%[1]s" { + zone_id = "%[2]s" + enabled = "%[3]t" + priority = "%[4]d" + name = "%[1]s" + matcher { + field = "to" + type = "literal" + value = "test@example.com" + } + + action { + type = "drop" + } + } + `, resourceID, zoneID, enabled, priority) +} + +func TestAccCloudflareEmailRoutingRule_Basic(t *testing.T) { rnd := generateRandomResourceName() name := "cloudflare_email_routing_rule." + rnd zoneID := os.Getenv("CLOUDFLARE_ZONE_ID") @@ -59,3 +79,31 @@ func TestAccTestEmailRoutingRule(t *testing.T) { }, }) } + +func TestAccCloudflareEmailRoutingRule_Drop(t *testing.T) { + rnd := generateRandomResourceName() + name := "cloudflare_email_routing_rule." + rnd + zoneID := os.Getenv("CLOUDFLARE_ZONE_ID") + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProviderFactories: providerFactories, + Steps: []resource.TestStep{ + { + Config: testEmailRoutingRuleConfigDrop(rnd, zoneID, true, 10), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(name, "enabled", "true"), + resource.TestCheckResourceAttr(name, consts.ZoneIDSchemaKey, zoneID), + resource.TestCheckResourceAttr(name, "priority", "10"), + resource.TestCheckResourceAttr(name, "name", rnd), + + resource.TestCheckResourceAttr(name, "matcher.0.type", "literal"), + resource.TestCheckResourceAttr(name, "matcher.0.field", "to"), + resource.TestCheckResourceAttr(name, "matcher.0.value", "test@example.com"), + + resource.TestCheckResourceAttr(name, "action.0.type", "drop"), + ), + }, + }, + }) +}