Skip to content

Commit

Permalink
Merge pull request #31541 from dancorne/add-stream-exception-policy
Browse files Browse the repository at this point in the history
r/aws_networkfirewall_firewall_policy: Add stream exception policy
  • Loading branch information
ewbankkit authored Jun 5, 2023
2 parents af38671 + 53aee85 commit 42957ea
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 9 deletions.
3 changes: 3 additions & 0 deletions .changelog/31541.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/aws_networkfirewall_firewall_policy: Add `stream_exception_policy` option to `firewall_policy.stateful_engine_options`
```
20 changes: 16 additions & 4 deletions internal/service/networkfirewall/firewall_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,14 @@ func ResourceFirewallPolicy() *schema.Resource {
Schema: map[string]*schema.Schema{
"rule_order": {
Type: schema.TypeString,
Required: true,
Optional: true,
ValidateFunc: validation.StringInSlice(networkfirewall.RuleOrder_Values(), false),
},
"stream_exception_policy": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice(networkfirewall.StreamExceptionPolicy_Values(), false),
},
},
},
},
Expand Down Expand Up @@ -335,9 +340,12 @@ func expandStatefulEngineOptions(l []interface{}) *networkfirewall.StatefulEngin
options := &networkfirewall.StatefulEngineOptions{}

m := l[0].(map[string]interface{})
if v, ok := m["rule_order"].(string); ok {
if v, ok := m["rule_order"].(string); ok && v != "" {
options.RuleOrder = aws.String(v)
}
if v, ok := m["stream_exception_policy"].(string); ok && v != "" {
options.StreamExceptionPolicy = aws.String(v)
}

return options
}
Expand Down Expand Up @@ -476,8 +484,12 @@ func flattenStatefulEngineOptions(options *networkfirewall.StatefulEngineOptions
return []interface{}{}
}

m := map[string]interface{}{
"rule_order": aws.StringValue(options.RuleOrder),
m := map[string]interface{}{}
if options.RuleOrder != nil {
m["rule_order"] = aws.StringValue(options.RuleOrder)
}
if options.StreamExceptionPolicy != nil {
m["stream_exception_policy"] = aws.StringValue(options.StreamExceptionPolicy)
}

return []interface{}{m}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ func DataSourceFirewallPolicy() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"stream_exception_policy": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
Expand Down
87 changes: 83 additions & 4 deletions internal/service/networkfirewall/firewall_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,12 +156,13 @@ func TestAccNetworkFirewallFirewallPolicy_statefulEngineOption(t *testing.T) {
CheckDestroy: testAccCheckFirewallPolicyDestroy(ctx),
Steps: []resource.TestStep{
{
Config: testAccFirewallPolicyConfig_statefulEngineOptions(rName, "STRICT_ORDER"),
Config: testAccFirewallPolicyConfig_statefulEngineOptions(rName, "STRICT_ORDER", "DROP"),
Check: resource.ComposeTestCheckFunc(
testAccCheckFirewallPolicyExists(ctx, resourceName, &firewallPolicy),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.rule_order", networkfirewall.RuleOrderStrictOrder),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.stream_exception_policy", networkfirewall.StreamExceptionPolicyDrop),
),
},
{
Expand All @@ -186,12 +187,13 @@ func TestAccNetworkFirewallFirewallPolicy_updateStatefulEngineOption(t *testing.
CheckDestroy: testAccCheckFirewallPolicyDestroy(ctx),
Steps: []resource.TestStep{
{
Config: testAccFirewallPolicyConfig_statefulEngineOptions(rName, "DEFAULT_ACTION_ORDER"),
Config: testAccFirewallPolicyConfig_statefulEngineOptions(rName, "DEFAULT_ACTION_ORDER", "CONTINUE"),
Check: resource.ComposeTestCheckFunc(
testAccCheckFirewallPolicyExists(ctx, resourceName, &firewallPolicy1),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.rule_order", networkfirewall.RuleOrderDefaultActionOrder),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.stream_exception_policy", networkfirewall.StreamExceptionPolicyContinue),
),
},
{
Expand All @@ -203,13 +205,55 @@ func TestAccNetworkFirewallFirewallPolicy_updateStatefulEngineOption(t *testing.
),
},
{
Config: testAccFirewallPolicyConfig_statefulEngineOptions(rName, "STRICT_ORDER"),
Config: testAccFirewallPolicyConfig_statefulEngineOptions(rName, "STRICT_ORDER", "REJECT"),
Check: resource.ComposeTestCheckFunc(
testAccCheckFirewallPolicyExists(ctx, resourceName, &firewallPolicy3),
testAccCheckFirewallPolicyRecreated(&firewallPolicy2, &firewallPolicy3),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.rule_order", networkfirewall.RuleOrderStrictOrder),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.stream_exception_policy", networkfirewall.StreamExceptionPolicyReject),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccNetworkFirewallFirewallPolicy_statefulEngineOptionsSingle(t *testing.T) {
ctx := acctest.Context(t)
var firewallPolicy networkfirewall.DescribeFirewallPolicyOutput
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
resourceName := "aws_networkfirewall_firewall_policy.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) },
ErrorCheck: acctest.ErrorCheck(t, networkfirewall.EndpointsID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckFirewallPolicyDestroy(ctx),
Steps: []resource.TestStep{
{
Config: testAccFirewallPolicyConfig_ruleOrderOnly(rName, "DEFAULT_ACTION_ORDER"),
Check: resource.ComposeTestCheckFunc(
testAccCheckFirewallPolicyExists(ctx, resourceName, &firewallPolicy),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.rule_order", networkfirewall.RuleOrderDefaultActionOrder),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.stream_exception_policy", ""),
),
},
{
Config: testAccFirewallPolicyConfig_streamExceptionPolicyOnly(rName, "REJECT"),
Check: resource.ComposeTestCheckFunc(
testAccCheckFirewallPolicyExists(ctx, resourceName, &firewallPolicy),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.#", "1"),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.rule_order", ""),
resource.TestCheckResourceAttr(resourceName, "firewall_policy.0.stateful_engine_options.0.stream_exception_policy", networkfirewall.StreamExceptionPolicyReject),
),
},
{
Expand Down Expand Up @@ -1110,7 +1154,25 @@ resource "aws_networkfirewall_firewall_policy" "test" {
`, rName, tagKey1, tagValue1, tagKey2, tagValue2)
}

func testAccFirewallPolicyConfig_statefulEngineOptions(rName, ruleOrder string) string {
func testAccFirewallPolicyConfig_statefulEngineOptions(rName, ruleOrder, streamExceptionPolicy string) string {
return fmt.Sprintf(`
resource "aws_networkfirewall_firewall_policy" "test" {
name = %[1]q
firewall_policy {
stateless_fragment_default_actions = ["aws:drop"]
stateless_default_actions = ["aws:pass"]
stateful_engine_options {
rule_order = %[2]q
stream_exception_policy = %[3]q
}
}
}
`, rName, ruleOrder, streamExceptionPolicy)
}

func testAccFirewallPolicyConfig_ruleOrderOnly(rName, ruleOrder string) string {
return fmt.Sprintf(`
resource "aws_networkfirewall_firewall_policy" "test" {
name = %[1]q
Expand All @@ -1127,6 +1189,23 @@ resource "aws_networkfirewall_firewall_policy" "test" {
`, rName, ruleOrder)
}

func testAccFirewallPolicyConfig_streamExceptionPolicyOnly(rName, streamExceptionPolicy string) string {
return fmt.Sprintf(`
resource "aws_networkfirewall_firewall_policy" "test" {
name = %[1]q
firewall_policy {
stateless_fragment_default_actions = ["aws:drop"]
stateless_default_actions = ["aws:pass"]
stateful_engine_options {
stream_exception_policy = %[2]q
}
}
}
`, rName, streamExceptionPolicy)
}

func testAccFirewallPolicyConfig_statefulDefaultActions(rName string) string {
return fmt.Sprintf(`
resource "aws_networkfirewall_firewall_policy" "test" {
Expand Down
4 changes: 3 additions & 1 deletion website/docs/r/networkfirewall_firewall_policy.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ The `stateful_engine_options` block supports the following argument:

~> **NOTE:** If the `STRICT_ORDER` rule order is specified, this firewall policy can only reference stateful rule groups that utilize `STRICT_ORDER`.

* `rule_order` - (Required) Indicates how to manage the order of stateful rule evaluation for the policy. Default value: `DEFAULT_ACTION_ORDER`. Valid values: `DEFAULT_ACTION_ORDER`, `STRICT_ORDER`.
* `rule_order` - Indicates how to manage the order of stateful rule evaluation for the policy. Default value: `DEFAULT_ACTION_ORDER`. Valid values: `DEFAULT_ACTION_ORDER`, `STRICT_ORDER`.

* `stream_exception_policy` - Describes how to treat traffic which has broken midstream. Default value: `DROP`. Valid values: `DROP`, `CONTINUE`, `REJECT`.

### Stateful Rule Group Reference

Expand Down

0 comments on commit 42957ea

Please sign in to comment.