Skip to content

Commit

Permalink
Merge pull request #2414 from cloudflare/allow-preserve-query-string-…
Browse files Browse the repository at this point in the history
…to-be-nullable

resource/cloudflare_ruleset: allow `FromValue.PreserveQueryString` to be nullable
  • Loading branch information
jacobbednarz committed May 11, 2023
2 parents 5fe8179 + 30e748b commit 475bf8b
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .changelog/2414.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/cloudflare_ruleset: allow `FromValue.PreserveQueryString` to be nullable and handled correctly
```
11 changes: 8 additions & 3 deletions internal/framework/service/rulesets/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -665,13 +665,18 @@ func toRulesetResourceModel(ctx context.Context, zoneID, accountID basetypes.Str

if ruleResponse.ActionParameters.FromValue != nil {
rule.ActionParameters[0].FromValue = []*ActionParameterFromValueModel{{
StatusCode: flatteners.Int64(int64(ruleResponse.ActionParameters.FromValue.StatusCode)),
PreserveQueryString: flatteners.Bool(&ruleResponse.ActionParameters.FromValue.PreserveQueryString),
StatusCode: flatteners.Int64(int64(ruleResponse.ActionParameters.FromValue.StatusCode)),
TargetURL: []*ActionParameterFromValueTargetURLModel{{
Value: flatteners.String(ruleResponse.ActionParameters.FromValue.TargetURL.Value),
Expression: flatteners.String(ruleResponse.ActionParameters.FromValue.TargetURL.Expression),
}},
}}

if !reflect.ValueOf(ruleResponse.ActionParameters.FromValue.PreserveQueryString).IsNil() {
rule.ActionParameters[0].FromValue[0].PreserveQueryString = flatteners.Bool(ruleResponse.ActionParameters.FromValue.PreserveQueryString)
} else {
rule.ActionParameters[0].FromValue[0].PreserveQueryString = types.BoolNull()
}
}

if len(ruleResponse.ActionParameters.Algorithms) > 0 {
Expand Down Expand Up @@ -1230,7 +1235,7 @@ func (r *RulesModel) toRulesetRule(ctx context.Context) cloudflare.RulesetRule {
}

if !ap.FromValue[0].PreserveQueryString.IsNull() {
from.PreserveQueryString = ap.FromValue[0].PreserveQueryString.ValueBool()
from.PreserveQueryString = cloudflare.BoolPtr(ap.FromValue[0].PreserveQueryString.ValueBool())
}

from.TargetURL.Expression = ap.FromValue[0].TargetURL[0].Expression.ValueString()
Expand Down
55 changes: 55 additions & 0 deletions internal/framework/service/rulesets/resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1986,6 +1986,35 @@ func TestAccCloudflareRuleset_DynamicRedirect(t *testing.T) {
})
}

func TestAccCloudflareRuleset_DynamicRedirectWithoutPreservingQueryString(t *testing.T) {
rnd := utils.GenerateRandomResourceName()
zoneID := os.Getenv("CLOUDFLARE_ZONE_ID")
resourceName := "cloudflare_ruleset." + rnd

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.TestAccPreCheck(t) },
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
Steps: []resource.TestStep{
{
Config: testAccCloudflareRulesetRedirectFromValueWithoutPreservingQueryString(rnd, zoneID),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "name", rnd),
resource.TestCheckResourceAttr(resourceName, "kind", "zone"),
resource.TestCheckResourceAttr(resourceName, "phase", "http_request_dynamic_redirect"),

resource.TestCheckResourceAttr(resourceName, "rules.#", "1"),
resource.TestCheckResourceAttr(resourceName, "rules.0.action", "redirect"),

resource.TestCheckResourceAttr(resourceName, "rules.0.action_parameters.0.from_value.0.status_code", "301"),
resource.TestCheckResourceAttr(resourceName, "rules.0.action_parameters.0.from_value.0.target_url.#", "1"),
resource.TestCheckNoResourceAttr(resourceName, "rules.0.action_parameters.0.from_value.0.target_url.0.expression"),
resource.TestCheckResourceAttr(resourceName, "rules.0.action_parameters.0.from_value.0.target_url.0.value", "some_host.com"),
),
},
},
})
}

func TestAccCloudflareRuleset_TransformationRuleURIStripOffQueryString(t *testing.T) {
rnd := utils.GenerateRandomResourceName()
zoneID := os.Getenv("CLOUDFLARE_ZONE_ID")
Expand Down Expand Up @@ -3752,6 +3781,32 @@ func testAccCloudflareRulesetRedirectFromValue(rnd, zoneID string) string {
}`, rnd, zoneID)
}

func testAccCloudflareRulesetRedirectFromValueWithoutPreservingQueryString(rnd, zoneID string) string {
return fmt.Sprintf(`
resource "cloudflare_ruleset" "%[1]s" {
zone_id = "%[2]s"
name = "%[1]s"
description = "%[1]s ruleset description"
kind = "zone"
phase = "http_request_dynamic_redirect"
rules {
action = "redirect"
action_parameters {
from_value {
status_code = 301
target_url {
value = "some_host.com"
}
}
}
expression = "true"
description = "Apply redirect from value"
enabled = true
}
}`, rnd, zoneID)
}

func testAccCheckCloudflareRulesetActionParametersOverrideSensitivityForAllRulesetRules(rnd, name, zoneID, zoneName string) string {
return fmt.Sprintf(`
resource "cloudflare_ruleset" "%[1]s" {
Expand Down

0 comments on commit 475bf8b

Please sign in to comment.