Skip to content

Commit

Permalink
resource/cloudflare_ruleset: allow FromValue.PreserveQueryString to…
Browse files Browse the repository at this point in the history
… be nullable

Updates the `FromValue.PreserveQueryString` handling in the request + state
handler to use the changes from cloudflare/cloudflare-go#1275 and allows
conditional handling of null in resources.

Closes #2408
  • Loading branch information
jacobbednarz committed May 8, 2023
1 parent cd313ec commit ec5db29
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 3 deletions.
11 changes: 8 additions & 3 deletions internal/framework/service/rulesets/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -657,13 +657,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)

Check failure on line 668 in internal/framework/service/rulesets/resource.go

View workflow job for this annotation

GitHub Actions / tfproviderlint (ubuntu-latest)

cannot use ruleResponse.ActionParameters.FromValue.PreserveQueryString (variable of type bool) as *bool value in argument to flatteners.Bool

Check failure on line 668 in internal/framework/service/rulesets/resource.go

View workflow job for this annotation

GitHub Actions / tfproviderlint (ubuntu-latest)

cannot use ruleResponse.ActionParameters.FromValue.PreserveQueryString (variable of type bool) as *bool value in argument to flatteners.Bool

Check failure on line 668 in internal/framework/service/rulesets/resource.go

View workflow job for this annotation

GitHub Actions / test

cannot use ruleResponse.ActionParameters.FromValue.PreserveQueryString (variable of type bool) as *bool value in argument to flatteners.Bool
} else {
rule.ActionParameters[0].FromValue[0].PreserveQueryString = types.BoolNull()
}
}

if len(ruleResponse.ActionParameters.Algorithms) > 0 {
Expand Down Expand Up @@ -1222,7 +1227,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())

Check failure on line 1230 in internal/framework/service/rulesets/resource.go

View workflow job for this annotation

GitHub Actions / tfproviderlint (ubuntu-latest)

cannot use cloudflare.BoolPtr(ap.FromValue[0].PreserveQueryString.ValueBool()) (value of type *bool) as bool value in assignment

Check failure on line 1230 in internal/framework/service/rulesets/resource.go

View workflow job for this annotation

GitHub Actions / tfproviderlint (ubuntu-latest)

cannot use cloudflare.BoolPtr(ap.FromValue[0].PreserveQueryString.ValueBool()) (value of type *bool) as bool value in assignment

Check failure on line 1230 in internal/framework/service/rulesets/resource.go

View workflow job for this annotation

GitHub Actions / test

cannot use cloudflare.BoolPtr(ap.FromValue[0].PreserveQueryString.ValueBool()) (value of type *bool) as bool value in assignment
}

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 @@ -1954,6 +1954,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 @@ -3689,6 +3718,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 ec5db29

Please sign in to comment.