Skip to content

Commit 410d23f

Browse files
Set networkFirewallPolicyEnforcementOrder as mutable and default value from API (#7650) (#14364)
Signed-off-by: Modular Magician <[email protected]>
1 parent bc3f5db commit 410d23f

5 files changed

+124
-10
lines changed

.changelog/7650.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: made `network_firewall_policy_enforcement_order` field mutable in `google_compute_network`.
3+
```

google/resource_compute_network.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,8 @@ with varying MTUs.`,
106106
"network_firewall_policy_enforcement_order": {
107107
Type: schema.TypeString,
108108
Optional: true,
109-
ForceNew: true,
110109
ValidateFunc: validateEnum([]string{"BEFORE_CLASSIC_FIREWALL", "AFTER_CLASSIC_FIREWALL", ""}),
111-
Description: `Set the order that Firewall Rules and Firewall Policies are evaluated. Needs to be either 'AFTER_CLASSIC_FIREWALL' or 'BEFORE_CLASSIC_FIREWALL' Default 'AFTER_CLASSIC_FIREWALL' Default value: "AFTER_CLASSIC_FIREWALL" Possible values: ["BEFORE_CLASSIC_FIREWALL", "AFTER_CLASSIC_FIREWALL"]`,
110+
Description: `Set the order that Firewall Rules and Firewall Policies are evaluated. Default value: "AFTER_CLASSIC_FIREWALL" Possible values: ["BEFORE_CLASSIC_FIREWALL", "AFTER_CLASSIC_FIREWALL"]`,
112111
Default: "AFTER_CLASSIC_FIREWALL",
113112
},
114113
"routing_mode": {
@@ -389,7 +388,7 @@ func resourceComputeNetworkUpdate(d *schema.ResourceData, meta interface{}) erro
389388

390389
d.Partial(true)
391390

392-
if d.HasChange("routing_mode") {
391+
if d.HasChange("routing_mode") || d.HasChange("network_firewall_policy_enforcement_order") {
393392
obj := make(map[string]interface{})
394393

395394
routingConfigProp, err := expandComputeNetworkRoutingConfig(nil, d, config)
@@ -398,6 +397,12 @@ func resourceComputeNetworkUpdate(d *schema.ResourceData, meta interface{}) erro
398397
} else if !isEmptyValue(reflect.ValueOf(routingConfigProp)) {
399398
obj["routingConfig"] = routingConfigProp
400399
}
400+
networkFirewallPolicyEnforcementOrderProp, err := expandComputeNetworkNetworkFirewallPolicyEnforcementOrder(d.Get("network_firewall_policy_enforcement_order"), d, config)
401+
if err != nil {
402+
return err
403+
} else if v, ok := d.GetOkExists("network_firewall_policy_enforcement_order"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, networkFirewallPolicyEnforcementOrderProp)) {
404+
obj["networkFirewallPolicyEnforcementOrder"] = networkFirewallPolicyEnforcementOrderProp
405+
}
401406

402407
url, err := ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/networks/{{name}}")
403408
if err != nil {

google/resource_compute_network_generated_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ func TestAccComputeNetwork_networkCustomFirewallEnforcementOrderExample(t *testi
119119
func testAccComputeNetwork_networkCustomFirewallEnforcementOrderExample(context map[string]interface{}) string {
120120
return Nprintf(`
121121
resource "google_compute_network" "vpc_network" {
122-
project = "%{project}"
123-
name = "tf-test-vpc-network%{random_suffix}"
124-
auto_create_subnetworks = true
122+
project = "%{project}"
123+
name = "tf-test-vpc-network%{random_suffix}"
124+
auto_create_subnetworks = true
125125
network_firewall_policy_enforcement_order = "BEFORE_CLASSIC_FIREWALL"
126126
}
127127
`, context)

google/resource_compute_network_test.go

+106
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,57 @@ func TestAccComputeNetwork_networkDeleteDefaultRoute(t *testing.T) {
148148
})
149149
}
150150

151+
func TestAccComputeNetwork_networkFirewallPolicyEnforcementOrderAndUpdate(t *testing.T) {
152+
t.Parallel()
153+
154+
var network compute.Network
155+
var updatedNetwork compute.Network
156+
networkName := RandString(t, 10)
157+
158+
defaultNetworkFirewallPolicyEnforcementOrder := "AFTER_CLASSIC_FIREWALL"
159+
explicitNetworkFirewallPolicyEnforcementOrder := "BEFORE_CLASSIC_FIREWALL"
160+
161+
VcrTest(t, resource.TestCase{
162+
PreCheck: func() { AccTestPreCheck(t) },
163+
ProtoV5ProviderFactories: ProtoV5ProviderFactories(t),
164+
CheckDestroy: testAccCheckComputeNetworkDestroyProducer(t),
165+
Steps: []resource.TestStep{
166+
{
167+
Config: testAccComputeNetwork_networkFirewallPolicyEnforcementOrderDefault(networkName),
168+
Check: resource.ComposeTestCheckFunc(
169+
testAccCheckComputeNetworkExists(
170+
t, "google_compute_network.acc_network_firewall_policy_enforcement_order", &network),
171+
testAccCheckComputeNetworkHasNetworkFirewallPolicyEnforcementOrder(
172+
t, "google_compute_network.acc_network_firewall_policy_enforcement_order", &network, defaultNetworkFirewallPolicyEnforcementOrder),
173+
),
174+
},
175+
{
176+
ResourceName: "google_compute_network.acc_network_firewall_policy_enforcement_order",
177+
ImportState: true,
178+
ImportStateVerify: true,
179+
ImportStateVerifyIgnore: []string{"force_destroy"},
180+
},
181+
// Test updating the enforcement order works and updates in-place
182+
{
183+
Config: testAccComputeNetwork_networkFirewallPolicyEnforcementOrderUpdate(networkName, explicitNetworkFirewallPolicyEnforcementOrder),
184+
Check: resource.ComposeTestCheckFunc(
185+
testAccCheckComputeNetworkExists(
186+
t, "google_compute_network.acc_network_firewall_policy_enforcement_order", &updatedNetwork),
187+
testAccCheckComputeNetworkHasNetworkFirewallPolicyEnforcementOrder(
188+
t, "google_compute_network.acc_network_firewall_policy_enforcement_order", &updatedNetwork, explicitNetworkFirewallPolicyEnforcementOrder),
189+
testAccCheckComputeNetworkWasUpdated(&updatedNetwork, &network),
190+
),
191+
},
192+
{
193+
ResourceName: "google_compute_network.acc_network_firewall_policy_enforcement_order",
194+
ImportState: true,
195+
ImportStateVerify: true,
196+
ImportStateVerifyIgnore: []string{"force_destroy"},
197+
},
198+
},
199+
})
200+
}
201+
151202
func testAccCheckComputeNetworkExists(t *testing.T, n string, network *compute.Network) resource.TestCheckFunc {
152203
return func(s *terraform.State) error {
153204
rs, ok := s.RootModule().Resources[n]
@@ -276,6 +327,44 @@ func testAccCheckComputeNetworkHasRoutingMode(t *testing.T, n string, network *c
276327
}
277328
}
278329

330+
func testAccCheckComputeNetworkHasNetworkFirewallPolicyEnforcementOrder(t *testing.T, n string, network *compute.Network, order string) resource.TestCheckFunc {
331+
return func(s *terraform.State) error {
332+
config := GoogleProviderConfig(t)
333+
334+
rs, ok := s.RootModule().Resources[n]
335+
if !ok {
336+
return fmt.Errorf("Not found: %s", n)
337+
}
338+
339+
if rs.Primary.Attributes["network_firewall_policy_enforcement_order"] == "" {
340+
return fmt.Errorf("Network firewall policy enforcement order not found on resource")
341+
}
342+
343+
found, err := config.NewComputeClient(config.UserAgent).Networks.Get(
344+
config.Project, network.Name).Do()
345+
if err != nil {
346+
return err
347+
}
348+
349+
foundNetworkFirewallPolicyEnforcementOrder := found.NetworkFirewallPolicyEnforcementOrder
350+
351+
if order != foundNetworkFirewallPolicyEnforcementOrder {
352+
return fmt.Errorf("Expected network firewall policy enforcement order %s to match %s", order, foundNetworkFirewallPolicyEnforcementOrder)
353+
}
354+
355+
return nil
356+
}
357+
}
358+
359+
func testAccCheckComputeNetworkWasUpdated(newNetwork *compute.Network, oldNetwork *compute.Network) resource.TestCheckFunc {
360+
return func(s *terraform.State) error {
361+
if oldNetwork.CreationTimestamp != newNetwork.CreationTimestamp {
362+
return fmt.Errorf("expected compute network to have been updated (had same creation time), instead was recreated - old creation time %s, new creation time %s", oldNetwork.CreationTimestamp, newNetwork.CreationTimestamp)
363+
}
364+
return nil
365+
}
366+
}
367+
279368
func testAccComputeNetwork_basic(suffix string) string {
280369
return fmt.Sprintf(`
281370
resource "google_compute_network" "bar" {
@@ -312,3 +401,20 @@ resource "google_compute_network" "bar" {
312401
}
313402
`, suffix)
314403
}
404+
405+
func testAccComputeNetwork_networkFirewallPolicyEnforcementOrderDefault(network string) string {
406+
return fmt.Sprintf(`
407+
resource "google_compute_network" "acc_network_firewall_policy_enforcement_order" {
408+
name = "tf-test-network-firewall-policy-enforcement-order-%s"
409+
}
410+
`, network)
411+
}
412+
413+
func testAccComputeNetwork_networkFirewallPolicyEnforcementOrderUpdate(network, order string) string {
414+
return fmt.Sprintf(`
415+
resource "google_compute_network" "acc_network_firewall_policy_enforcement_order" {
416+
name = "tf-test-network-firewall-policy-enforcement-order-%s"
417+
network_firewall_policy_enforcement_order = "%s"
418+
}
419+
`, network, order)
420+
}

website/docs/r/compute_network.html.markdown

+4-4
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ resource "google_compute_network" "vpc_network" {
5757

5858
```hcl
5959
resource "google_compute_network" "vpc_network" {
60-
project = "my-project-name"
61-
name = "vpc-network"
62-
auto_create_subnetworks = true
60+
project = "my-project-name"
61+
name = "vpc-network"
62+
auto_create_subnetworks = true
6363
network_firewall_policy_enforcement_order = "BEFORE_CLASSIC_FIREWALL"
6464
}
6565
```
@@ -128,7 +128,7 @@ The following arguments are supported:
128128

129129
* `network_firewall_policy_enforcement_order` -
130130
(Optional)
131-
Set the order that Firewall Rules and Firewall Policies are evaluated. Needs to be either 'AFTER_CLASSIC_FIREWALL' or 'BEFORE_CLASSIC_FIREWALL' Default 'AFTER_CLASSIC_FIREWALL'
131+
Set the order that Firewall Rules and Firewall Policies are evaluated.
132132
Default value is `AFTER_CLASSIC_FIREWALL`.
133133
Possible values are: `BEFORE_CLASSIC_FIREWALL`, `AFTER_CLASSIC_FIREWALL`.
134134

0 commit comments

Comments
 (0)