@@ -351,6 +351,14 @@ This field can only be set when enableDynamicPortAllocation is enabled.`,
351351 Optional : true ,
352352 Description : `Minimum number of ports allocated to a VM from this NAT. Defaults to 64 for static port allocation and 32 dynamic port allocation if not set.` ,
353353 },
354+ "nat64_subnetwork" : {
355+ Type : schema .TypeSet ,
356+ Optional : true ,
357+ Description : `One or more subnetwork NAT configurations whose traffic should be translated by NAT64 Gateway.
358+ Only used if 'source_subnetwork_ip_ranges_to_nat64' is set to 'LIST_OF_IPV6_SUBNETWORKS'` ,
359+ Elem : computeRouterNatNat64SubnetworkSchema (),
360+ Set : computeRouterNatSubnetworkHash ,
361+ },
354362 "nat_ip_allocate_option" : {
355363 Type : schema .TypeString ,
356364 Optional : true ,
@@ -389,6 +397,16 @@ the number of resources can be increased/decreased without triggering the 'resou
389397 Elem : computeRouterNatRulesSchema (),
390398 Set : computeRouterNatRulesHash ,
391399 },
400+ "source_subnetwork_ip_ranges_to_nat64" : {
401+ Type : schema .TypeString ,
402+ Optional : true ,
403+ ValidateFunc : verify .ValidateEnum ([]string {"ALL_IPV6_SUBNETWORKS" , "LIST_OF_IPV6_SUBNETWORKS" , "" }),
404+ Description : `Specify the Nat option for NAT64, which can take one of the following values:
405+ ALL_IPV6_SUBNETWORKS: All of the IP ranges in every Subnetwork are allowed to Nat.
406+ LIST_OF_IPV6_SUBNETWORKS: A list of Subnetworks are allowed to Nat (specified in the field nat64Subnetwork below).
407+ Note that if this field contains NAT64_ALL_V6_SUBNETWORKS no other Router.Nat section in this region can also enable NAT64 for any Subnetworks in this network.
408+ Other Router.Nat sections can still be present to enable NAT44 only. Possible values: ["ALL_IPV6_SUBNETWORKS", "LIST_OF_IPV6_SUBNETWORKS"]` ,
409+ },
392410 "subnetwork" : {
393411 Type : schema .TypeSet ,
394412 Optional : true ,
@@ -484,6 +502,19 @@ sourceIpRangesToNat`,
484502 }
485503}
486504
505+ func computeRouterNatNat64SubnetworkSchema () * schema.Resource {
506+ return & schema.Resource {
507+ Schema : map [string ]* schema.Schema {
508+ "name" : {
509+ Type : schema .TypeString ,
510+ Required : true ,
511+ DiffSuppressFunc : tpgresource .CompareSelfLinkOrResourceName ,
512+ Description : `Self-link of the subnetwork resource that will use NAT64` ,
513+ },
514+ },
515+ }
516+ }
517+
487518func computeRouterNatRulesSchema () * schema.Resource {
488519 return & schema.Resource {
489520 Schema : map [string ]* schema.Schema {
@@ -629,6 +660,18 @@ func resourceComputeRouterNatCreate(d *schema.ResourceData, meta interface{}) er
629660 } else if v , ok := d .GetOkExists ("subnetwork" ); ok || ! reflect .DeepEqual (v , subnetworksProp ) {
630661 obj ["subnetworks" ] = subnetworksProp
631662 }
663+ sourceSubnetworkIpRangesToNat64Prop , err := expandNestedComputeRouterNatSourceSubnetworkIpRangesToNat64 (d .Get ("source_subnetwork_ip_ranges_to_nat64" ), d , config )
664+ if err != nil {
665+ return err
666+ } else if v , ok := d .GetOkExists ("source_subnetwork_ip_ranges_to_nat64" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (sourceSubnetworkIpRangesToNat64Prop )) && (ok || ! reflect .DeepEqual (v , sourceSubnetworkIpRangesToNat64Prop )) {
667+ obj ["sourceSubnetworkIpRangesToNat64" ] = sourceSubnetworkIpRangesToNat64Prop
668+ }
669+ nat64SubnetworksProp , err := expandNestedComputeRouterNatNat64Subnetwork (d .Get ("nat64_subnetwork" ), d , config )
670+ if err != nil {
671+ return err
672+ } else if v , ok := d .GetOkExists ("nat64_subnetwork" ); ok || ! reflect .DeepEqual (v , nat64SubnetworksProp ) {
673+ obj ["nat64Subnetworks" ] = nat64SubnetworksProp
674+ }
632675 minPortsPerVmProp , err := expandNestedComputeRouterNatMinPortsPerVm (d .Get ("min_ports_per_vm" ), d , config )
633676 if err != nil {
634677 return err
@@ -885,6 +928,12 @@ func resourceComputeRouterNatRead(d *schema.ResourceData, meta interface{}) erro
885928 if err := d .Set ("subnetwork" , flattenNestedComputeRouterNatSubnetwork (res ["subnetworks" ], d , config )); err != nil {
886929 return fmt .Errorf ("Error reading RouterNat: %s" , err )
887930 }
931+ if err := d .Set ("source_subnetwork_ip_ranges_to_nat64" , flattenNestedComputeRouterNatSourceSubnetworkIpRangesToNat64 (res ["sourceSubnetworkIpRangesToNat64" ], d , config )); err != nil {
932+ return fmt .Errorf ("Error reading RouterNat: %s" , err )
933+ }
934+ if err := d .Set ("nat64_subnetwork" , flattenNestedComputeRouterNatNat64Subnetwork (res ["nat64Subnetworks" ], d , config )); err != nil {
935+ return fmt .Errorf ("Error reading RouterNat: %s" , err )
936+ }
888937 if err := d .Set ("min_ports_per_vm" , flattenNestedComputeRouterNatMinPortsPerVm (res ["minPortsPerVm" ], d , config )); err != nil {
889938 return fmt .Errorf ("Error reading RouterNat: %s" , err )
890939 }
@@ -977,6 +1026,18 @@ func resourceComputeRouterNatUpdate(d *schema.ResourceData, meta interface{}) er
9771026 } else if v , ok := d .GetOkExists ("subnetwork" ); ok || ! reflect .DeepEqual (v , subnetworksProp ) {
9781027 obj ["subnetworks" ] = subnetworksProp
9791028 }
1029+ sourceSubnetworkIpRangesToNat64Prop , err := expandNestedComputeRouterNatSourceSubnetworkIpRangesToNat64 (d .Get ("source_subnetwork_ip_ranges_to_nat64" ), d , config )
1030+ if err != nil {
1031+ return err
1032+ } else if v , ok := d .GetOkExists ("source_subnetwork_ip_ranges_to_nat64" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , sourceSubnetworkIpRangesToNat64Prop )) {
1033+ obj ["sourceSubnetworkIpRangesToNat64" ] = sourceSubnetworkIpRangesToNat64Prop
1034+ }
1035+ nat64SubnetworksProp , err := expandNestedComputeRouterNatNat64Subnetwork (d .Get ("nat64_subnetwork" ), d , config )
1036+ if err != nil {
1037+ return err
1038+ } else if v , ok := d .GetOkExists ("nat64_subnetwork" ); ok || ! reflect .DeepEqual (v , nat64SubnetworksProp ) {
1039+ obj ["nat64Subnetworks" ] = nat64SubnetworksProp
1040+ }
9801041 minPortsPerVmProp , err := expandNestedComputeRouterNatMinPortsPerVm (d .Get ("min_ports_per_vm" ), d , config )
9811042 if err != nil {
9821043 return err
@@ -1290,6 +1351,35 @@ func flattenNestedComputeRouterNatSubnetworkSecondaryIpRangeNames(v interface{},
12901351 return schema .NewSet (schema .HashString , v .([]interface {}))
12911352}
12921353
1354+ func flattenNestedComputeRouterNatSourceSubnetworkIpRangesToNat64 (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1355+ return v
1356+ }
1357+
1358+ func flattenNestedComputeRouterNatNat64Subnetwork (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1359+ if v == nil {
1360+ return v
1361+ }
1362+ l := v .([]interface {})
1363+ transformed := schema .NewSet (computeRouterNatSubnetworkHash , []interface {}{})
1364+ for _ , raw := range l {
1365+ original := raw .(map [string ]interface {})
1366+ if len (original ) < 1 {
1367+ // Do not include empty json objects coming back from the api
1368+ continue
1369+ }
1370+ transformed .Add (map [string ]interface {}{
1371+ "name" : flattenNestedComputeRouterNatNat64SubnetworkName (original ["name" ], d , config ),
1372+ })
1373+ }
1374+ return transformed
1375+ }
1376+ func flattenNestedComputeRouterNatNat64SubnetworkName (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1377+ if v == nil {
1378+ return v
1379+ }
1380+ return tpgresource .ConvertSelfLinkToV1 (v .(string ))
1381+ }
1382+
12931383func flattenNestedComputeRouterNatMinPortsPerVm (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
12941384 // Handles the string fixed64 format
12951385 if strVal , ok := v .(string ); ok {
@@ -1648,6 +1738,41 @@ func expandNestedComputeRouterNatSubnetworkSecondaryIpRangeNames(v interface{},
16481738 return v , nil
16491739}
16501740
1741+ func expandNestedComputeRouterNatSourceSubnetworkIpRangesToNat64 (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
1742+ return v , nil
1743+ }
1744+
1745+ func expandNestedComputeRouterNatNat64Subnetwork (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
1746+ v = v .(* schema.Set ).List ()
1747+ l := v .([]interface {})
1748+ req := make ([]interface {}, 0 , len (l ))
1749+ for _ , raw := range l {
1750+ if raw == nil {
1751+ continue
1752+ }
1753+ original := raw .(map [string ]interface {})
1754+ transformed := make (map [string ]interface {})
1755+
1756+ transformedName , err := expandNestedComputeRouterNatNat64SubnetworkName (original ["name" ], d , config )
1757+ if err != nil {
1758+ return nil , err
1759+ } else if val := reflect .ValueOf (transformedName ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
1760+ transformed ["name" ] = transformedName
1761+ }
1762+
1763+ req = append (req , transformed )
1764+ }
1765+ return req , nil
1766+ }
1767+
1768+ func expandNestedComputeRouterNatNat64SubnetworkName (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
1769+ f , err := tpgresource .ParseRegionalFieldValue ("subnetworks" , v .(string ), "project" , "region" , "zone" , d , config , true )
1770+ if err != nil {
1771+ return nil , fmt .Errorf ("Invalid value for name: %s" , err )
1772+ }
1773+ return f .RelativeLink (), nil
1774+ }
1775+
16511776func expandNestedComputeRouterNatMinPortsPerVm (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
16521777 return v , nil
16531778}
@@ -2021,6 +2146,8 @@ func resourceComputeRouterNatPatchUpdateEncoder(d *schema.ResourceData, meta int
20212146 "drainNatIps" : struct {}{},
20222147 "sourceSubnetworkIpRangesToNat" : struct {}{},
20232148 "subnetworks" : struct {}{},
2149+ "sourceSubnetworkIpRangesToNat64" : struct {}{},
2150+ "nat64Subnetworks" : struct {}{},
20242151 "minPortsPerVm" : struct {}{},
20252152 "maxPortsPerVm" : struct {}{},
20262153 "enableDynamicPortAllocation" : struct {}{},
0 commit comments