Skip to content

Commit 82e00b5

Browse files
add autoNetworkTier to Router NAT (#9379) (#18055)
[upstream:f8831fb24cf0875492c4d141499a6a628daf838a] Signed-off-by: Modular Magician <[email protected]>
1 parent 7ef3a03 commit 82e00b5

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed

google/services/compute/resource_compute_router_nat.go

+32
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,15 @@ ranges in every Subnetwork are allowed to Nat.
219219
contains ALL_SUBNETWORKS_ALL_IP_RANGES or
220220
ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES, then there should not be any
221221
other RouterNat section in any Router for this network in this region. Possible values: ["ALL_SUBNETWORKS_ALL_IP_RANGES", "ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES", "LIST_OF_SUBNETWORKS"]`,
222+
},
223+
"auto_network_tier": {
224+
Type: schema.TypeString,
225+
Computed: true,
226+
Optional: true,
227+
ValidateFunc: verify.ValidateEnum([]string{"PREMIUM", "STANDARD", ""}),
228+
Description: `The network tier to use when automatically reserving NAT IP addresses.
229+
Must be one of: PREMIUM, STANDARD. If not specified, then the current
230+
project-level default tier is used. Possible values: ["PREMIUM", "STANDARD"]`,
222231
},
223232
"drain_nat_ips": {
224233
Type: schema.TypeSet,
@@ -608,6 +617,12 @@ func resourceComputeRouterNatCreate(d *schema.ResourceData, meta interface{}) er
608617
} else if v, ok := d.GetOkExists("enable_endpoint_independent_mapping"); ok || !reflect.DeepEqual(v, enableEndpointIndependentMappingProp) {
609618
obj["enableEndpointIndependentMapping"] = enableEndpointIndependentMappingProp
610619
}
620+
autoNetworkTierProp, err := expandNestedComputeRouterNatAutoNetworkTier(d.Get("auto_network_tier"), d, config)
621+
if err != nil {
622+
return err
623+
} else if v, ok := d.GetOkExists("auto_network_tier"); !tpgresource.IsEmptyValue(reflect.ValueOf(autoNetworkTierProp)) && (ok || !reflect.DeepEqual(v, autoNetworkTierProp)) {
624+
obj["autoNetworkTier"] = autoNetworkTierProp
625+
}
611626

612627
lockName, err := tpgresource.ReplaceVars(d, config, "router/{{region}}/{{router}}")
613628
if err != nil {
@@ -785,6 +800,9 @@ func resourceComputeRouterNatRead(d *schema.ResourceData, meta interface{}) erro
785800
if err := d.Set("enable_endpoint_independent_mapping", flattenNestedComputeRouterNatEnableEndpointIndependentMapping(res["enableEndpointIndependentMapping"], d, config)); err != nil {
786801
return fmt.Errorf("Error reading RouterNat: %s", err)
787802
}
803+
if err := d.Set("auto_network_tier", flattenNestedComputeRouterNatAutoNetworkTier(res["autoNetworkTier"], d, config)); err != nil {
804+
return fmt.Errorf("Error reading RouterNat: %s", err)
805+
}
788806

789807
return nil
790808
}
@@ -901,6 +919,12 @@ func resourceComputeRouterNatUpdate(d *schema.ResourceData, meta interface{}) er
901919
} else if v, ok := d.GetOkExists("enable_endpoint_independent_mapping"); ok || !reflect.DeepEqual(v, enableEndpointIndependentMappingProp) {
902920
obj["enableEndpointIndependentMapping"] = enableEndpointIndependentMappingProp
903921
}
922+
autoNetworkTierProp, err := expandNestedComputeRouterNatAutoNetworkTier(d.Get("auto_network_tier"), d, config)
923+
if err != nil {
924+
return err
925+
} else if v, ok := d.GetOkExists("auto_network_tier"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, autoNetworkTierProp)) {
926+
obj["autoNetworkTier"] = autoNetworkTierProp
927+
}
904928

905929
lockName, err := tpgresource.ReplaceVars(d, config, "router/{{region}}/{{router}}")
906930
if err != nil {
@@ -1325,6 +1349,10 @@ func flattenNestedComputeRouterNatEnableEndpointIndependentMapping(v interface{}
13251349
return v
13261350
}
13271351

1352+
func flattenNestedComputeRouterNatAutoNetworkTier(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1353+
return v
1354+
}
1355+
13281356
func expandNestedComputeRouterNatName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
13291357
return v, nil
13301358
}
@@ -1616,6 +1644,10 @@ func expandNestedComputeRouterNatEnableEndpointIndependentMapping(v interface{},
16161644
return v, nil
16171645
}
16181646

1647+
func expandNestedComputeRouterNatAutoNetworkTier(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1648+
return v, nil
1649+
}
1650+
16191651
func flattenNestedComputeRouterNat(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
16201652
var v interface{}
16211653
var ok bool

google/services/compute/resource_compute_router_nat_test.go

+109
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,31 @@ func TestAccComputeRouterNat_withEndpointTypes(t *testing.T) {
417417
})
418418
}
419419

420+
func TestAccComputeRouterNat_AutoNetworkTier(t *testing.T) {
421+
t.Parallel()
422+
423+
testId := acctest.RandString(t, 10)
424+
routerName := fmt.Sprintf("tf-test-router-private-nat-%s", testId)
425+
hubName := fmt.Sprintf("%s-hub", routerName)
426+
427+
acctest.VcrTest(t, resource.TestCase{
428+
PreCheck: func() { acctest.AccTestPreCheck(t) },
429+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
430+
CheckDestroy: testAccCheckComputeRouterNatDestroyProducer(t),
431+
Steps: []resource.TestStep{
432+
{
433+
Config: testAccComputeRouterNatWitAutoNetworkTier(routerName, hubName),
434+
},
435+
{
436+
// implicitly full ImportStateId
437+
ResourceName: "google_compute_router_nat.foobar",
438+
ImportState: true,
439+
ImportStateVerify: true,
440+
},
441+
},
442+
})
443+
}
444+
420445
func testAccCheckComputeRouterNatDestroyProducer(t *testing.T) func(s *terraform.State) error {
421446
return func(s *terraform.State) error {
422447
config := acctest.GoogleProviderConfig(t)
@@ -1303,3 +1328,87 @@ resource "google_compute_router_nat" "foobar" {
13031328
}
13041329
`, routerName, routerName, routerName, routerName)
13051330
}
1331+
1332+
func testAccComputeRouterNatBaseResourcesWithPrivateNatSubnetworks(routerName, hubName string) string {
1333+
return fmt.Sprintf(`
1334+
resource "google_compute_network" "foobar" {
1335+
name = "%s-net"
1336+
auto_create_subnetworks = "false"
1337+
}
1338+
1339+
resource "google_compute_subnetwork" "subnet1" {
1340+
name = "%s-subnet1"
1341+
network = google_compute_network.foobar.self_link
1342+
ip_cidr_range = "10.0.0.0/16"
1343+
region = "us-central1"
1344+
purpose = "PRIVATE_NAT"
1345+
}
1346+
1347+
resource "google_compute_subnetwork" "subnet2" {
1348+
name = "%s-subnet2"
1349+
network = google_compute_network.foobar.self_link
1350+
ip_cidr_range = "10.10.1.0/24"
1351+
region = "us-central1"
1352+
purpose = "PRIVATE_NAT"
1353+
}
1354+
1355+
resource "google_compute_subnetwork" "subnet3" {
1356+
name = "%s-subnet3"
1357+
network = google_compute_network.foobar.self_link
1358+
ip_cidr_range = "10.158.1.0/24"
1359+
region = "us-central1"
1360+
purpose = "PRIVATE_NAT"
1361+
}
1362+
1363+
resource "google_compute_subnetwork" "subnet4" {
1364+
name = "%s-subnet4"
1365+
network = google_compute_network.foobar.self_link
1366+
ip_cidr_range = "10.168.1.0/24"
1367+
region = "us-central1"
1368+
purpose = "PRIVATE_NAT"
1369+
}
1370+
1371+
resource "google_network_connectivity_hub" "foobar" {
1372+
name = "%s"
1373+
description = "vpc hub for inter vpc nat"
1374+
}
1375+
1376+
resource "google_network_connectivity_spoke" "primary" {
1377+
name = "%s-spoke"
1378+
location = "global"
1379+
description = "vpc spoke for inter vpc nat"
1380+
hub = google_network_connectivity_hub.foobar.id
1381+
linked_vpc_network {
1382+
exclude_export_ranges = [
1383+
"10.10.0.0/16"
1384+
]
1385+
uri = google_compute_network.foobar.self_link
1386+
}
1387+
}
1388+
1389+
resource "google_compute_router" "foobar" {
1390+
name = "%s"
1391+
region = google_compute_subnetwork.subnet1.region
1392+
network = google_compute_network.foobar.self_link
1393+
depends_on = [
1394+
google_network_connectivity_spoke.primary
1395+
]
1396+
}
1397+
`, routerName, routerName, routerName, routerName, routerName, hubName, routerName, routerName)
1398+
}
1399+
1400+
func testAccComputeRouterNatWitAutoNetworkTier(routerName, hubName string) string {
1401+
return fmt.Sprintf(`
1402+
%s
1403+
1404+
resource "google_compute_router_nat" "foobar" {
1405+
name = "%s"
1406+
router = google_compute_router.foobar.name
1407+
region = google_compute_router.foobar.region
1408+
1409+
source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
1410+
nat_ip_allocate_option = "AUTO_ONLY"
1411+
auto_network_tier = "PREMIUM"
1412+
}
1413+
`, testAccComputeRouterNatBaseResourcesWithPrivateNatSubnetworks(routerName, hubName), routerName)
1414+
}

website/docs/r/compute_router_nat.html.markdown

+7
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,13 @@ The following arguments are supported:
377377
Default value is `PUBLIC`.
378378
Possible values are: `PUBLIC`, `PRIVATE`.
379379

380+
* `auto_network_tier` -
381+
(Optional)
382+
The network tier to use when automatically reserving NAT IP addresses.
383+
Must be one of: PREMIUM, STANDARD. If not specified, then the current
384+
project-level default tier is used.
385+
Possible values are: `PREMIUM`, `STANDARD`.
386+
380387
* `region` -
381388
(Optional)
382389
Region where the router and NAT reside.

0 commit comments

Comments
 (0)