Skip to content

Commit 24ca458

Browse files
Adding IP Collection & IPv6 GCE Endpoint to Subnetwork Resource (#13271) (#9490)
[upstream:4bf00c50347784738f6ffc1d5d45d0bb24e09512] Signed-off-by: Modular Magician <[email protected]>
1 parent 379e741 commit 24ca458

File tree

5 files changed

+119
-11
lines changed

5 files changed

+119
-11
lines changed

.changelog/13271.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note: enhancement
2+
compute: added `ip_collection` and `ipv6_gce_endpoint` fields to `google_compute_subnetwork` resource
3+
```

google-beta/services/compute/resource_compute_subnetwork.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,20 @@ Provide this property when you create the subnetwork. For example,
168168
10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and
169169
non-overlapping within a network. Only IPv4 is supported.
170170
Field is optional when 'reserved_internal_range' is defined, otherwise required.`,
171+
},
172+
"ip_collection": {
173+
Type: schema.TypeString,
174+
Optional: true,
175+
ForceNew: true,
176+
Description: `Resource reference of a PublicDelegatedPrefix. The PDP must be a sub-PDP
177+
in EXTERNAL_IPV6_SUBNETWORK_CREATION mode.
178+
Use one of the following formats to specify a sub-PDP when creating an
179+
IPv6 NetLB forwarding rule using BYOIP:
180+
Full resource URL, as in:
181+
* 'https://www.googleapis.com/compute/v1/projects/{{projectId}}/regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}'
182+
Partial URL, as in:
183+
* 'projects/{{projectId}}/regions/region/publicDelegatedPrefixes/{{sub-pdp-name}}'
184+
* 'regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}'`,
171185
},
172186
"ipv6_access_type": {
173187
Type: schema.TypeString,
@@ -366,6 +380,15 @@ outside this subnetwork.`,
366380
Computed: true,
367381
Description: `The range of internal IPv6 addresses that are owned by this subnetwork.`,
368382
},
383+
"ipv6_gce_endpoint": {
384+
Type: schema.TypeString,
385+
Computed: true,
386+
Description: `Possible endpoints of this subnetwork. It can be one of the following:
387+
* VM_ONLY: The subnetwork can be used for creating instances and IPv6 addresses with VM endpoint type. Such a subnetwork
388+
gets external IPv6 ranges from a public delegated prefix and cannot be used to create NetLb.
389+
* VM_AND_FR: The subnetwork can be used for creating both VM instances and Forwarding Rules. It can also be used to reserve
390+
IPv6 addresses with both VM and FR endpoint types. Such a subnetwork gets its IPv6 range from Google IP Pool directly.`,
391+
},
369392
"subnetwork_id": {
370393
Type: schema.TypeInt,
371394
Computed: true,
@@ -542,6 +565,12 @@ func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) e
542565
} else if v, ok := d.GetOkExists("external_ipv6_prefix"); !tpgresource.IsEmptyValue(reflect.ValueOf(externalIpv6PrefixProp)) && (ok || !reflect.DeepEqual(v, externalIpv6PrefixProp)) {
543566
obj["externalIpv6Prefix"] = externalIpv6PrefixProp
544567
}
568+
ipCollectionProp, err := expandComputeSubnetworkIpCollection(d.Get("ip_collection"), d, config)
569+
if err != nil {
570+
return err
571+
} else if v, ok := d.GetOkExists("ip_collection"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipCollectionProp)) && (ok || !reflect.DeepEqual(v, ipCollectionProp)) {
572+
obj["ipCollection"] = ipCollectionProp
573+
}
545574
allowSubnetCidrRoutesOverlapProp, err := expandComputeSubnetworkAllowSubnetCidrRoutesOverlap(d.Get("allow_subnet_cidr_routes_overlap"), d, config)
546575
if err != nil {
547576
return err
@@ -708,6 +737,9 @@ func resourceComputeSubnetworkRead(d *schema.ResourceData, meta interface{}) err
708737
if err := d.Set("external_ipv6_prefix", flattenComputeSubnetworkExternalIpv6Prefix(res["externalIpv6Prefix"], d, config)); err != nil {
709738
return fmt.Errorf("Error reading Subnetwork: %s", err)
710739
}
740+
if err := d.Set("ipv6_gce_endpoint", flattenComputeSubnetworkIpv6GceEndpoint(res["ipv6GceEndpoint"], d, config)); err != nil {
741+
return fmt.Errorf("Error reading Subnetwork: %s", err)
742+
}
711743
if err := d.Set("allow_subnet_cidr_routes_overlap", flattenComputeSubnetworkAllowSubnetCidrRoutesOverlap(res["allowSubnetCidrRoutesOverlap"], d, config)); err != nil {
712744
return fmt.Errorf("Error reading Subnetwork: %s", err)
713745
}
@@ -1502,6 +1534,10 @@ func flattenComputeSubnetworkExternalIpv6Prefix(v interface{}, d *schema.Resourc
15021534
return v
15031535
}
15041536

1537+
func flattenComputeSubnetworkIpv6GceEndpoint(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1538+
return v
1539+
}
1540+
15051541
func flattenComputeSubnetworkAllowSubnetCidrRoutesOverlap(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
15061542
return v
15071543
}
@@ -1645,6 +1681,10 @@ func expandComputeSubnetworkExternalIpv6Prefix(v interface{}, d tpgresource.Terr
16451681
return v, nil
16461682
}
16471683

1684+
func expandComputeSubnetworkIpCollection(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1685+
return v, nil
1686+
}
1687+
16481688
func expandComputeSubnetworkAllowSubnetCidrRoutesOverlap(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
16491689
return v, nil
16501690
}

google-beta/services/compute/resource_compute_subnetwork_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ fields:
1212
- field: 'gateway_address'
1313
- field: 'internal_ipv6_prefix'
1414
- field: 'ip_cidr_range'
15+
- field: 'ip_collection'
1516
- field: 'ipv6_access_type'
1617
- field: 'ipv6_cidr_range'
18+
- field: 'ipv6_gce_endpoint'
1719
- field: 'log_config.aggregation_interval'
1820
- field: 'log_config.filter_expr'
1921
- field: 'log_config.flow_sampling'

google-beta/services/compute/resource_compute_subnetwork_generated_test.go

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestAccComputeSubnetwork_subnetworkBasicExample(t *testing.T) {
4949
ResourceName: "google_compute_subnetwork.network-with-private-secondary-ip-ranges",
5050
ImportState: true,
5151
ImportStateVerify: true,
52-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
52+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
5353
},
5454
},
5555
})
@@ -94,7 +94,7 @@ func TestAccComputeSubnetwork_subnetworkLoggingConfigExample(t *testing.T) {
9494
ResourceName: "google_compute_subnetwork.subnet-with-logging",
9595
ImportState: true,
9696
ImportStateVerify: true,
97-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
97+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
9898
},
9999
},
100100
})
@@ -141,7 +141,7 @@ func TestAccComputeSubnetwork_subnetworkInternalL7lbExample(t *testing.T) {
141141
ResourceName: "google_compute_subnetwork.network-for-l7lb",
142142
ImportState: true,
143143
ImportStateVerify: true,
144-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
144+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
145145
},
146146
},
147147
})
@@ -188,7 +188,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6Example(t *testing.T) {
188188
ResourceName: "google_compute_subnetwork.subnetwork-ipv6",
189189
ImportState: true,
190190
ImportStateVerify: true,
191-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
191+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
192192
},
193193
},
194194
})
@@ -234,7 +234,7 @@ func TestAccComputeSubnetwork_subnetworkInternalIpv6Example(t *testing.T) {
234234
ResourceName: "google_compute_subnetwork.subnetwork-internal-ipv6",
235235
ImportState: true,
236236
ImportStateVerify: true,
237-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
237+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
238238
},
239239
},
240240
})
@@ -281,7 +281,7 @@ func TestAccComputeSubnetwork_subnetworkPurposePrivateNatExample(t *testing.T) {
281281
ResourceName: "google_compute_subnetwork.subnetwork-purpose-private-nat",
282282
ImportState: true,
283283
ImportStateVerify: true,
284-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
284+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
285285
},
286286
},
287287
})
@@ -327,7 +327,7 @@ func TestAccComputeSubnetwork_subnetworkCidrOverlapExample(t *testing.T) {
327327
ResourceName: "google_compute_subnetwork.subnetwork-cidr-overlap",
328328
ImportState: true,
329329
ImportStateVerify: true,
330-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
330+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
331331
},
332332
},
333333
})
@@ -373,7 +373,7 @@ func TestAccComputeSubnetwork_subnetworkReservedInternalRangeExample(t *testing.
373373
ResourceName: "google_compute_subnetwork.subnetwork-reserved-internal-range",
374374
ImportState: true,
375375
ImportStateVerify: true,
376-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
376+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
377377
},
378378
},
379379
})
@@ -428,7 +428,7 @@ func TestAccComputeSubnetwork_subnetworkReservedSecondaryRangeExample(t *testing
428428
ResourceName: "google_compute_subnetwork.subnetwork-reserved-secondary-range",
429429
ImportState: true,
430430
ImportStateVerify: true,
431-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
431+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
432432
},
433433
},
434434
})
@@ -500,7 +500,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6OnlyInternalExample(t *testing.T) {
500500
ResourceName: "google_compute_subnetwork.subnetwork-ipv6-only",
501501
ImportState: true,
502502
ImportStateVerify: true,
503-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
503+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
504504
},
505505
},
506506
})
@@ -524,6 +524,50 @@ resource "google_compute_network" "custom-test" {
524524
`, context)
525525
}
526526

527+
func TestAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(t *testing.T) {
528+
t.Parallel()
529+
530+
context := map[string]interface{}{
531+
"ip_collection_url": "projects/tf-static-byoip/regions/us-central1/publicDelegatedPrefixes/tf-test-subnet-mode-pdp",
532+
"random_suffix": acctest.RandString(t, 10),
533+
}
534+
535+
acctest.VcrTest(t, resource.TestCase{
536+
PreCheck: func() { acctest.AccTestPreCheck(t) },
537+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
538+
CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t),
539+
Steps: []resource.TestStep{
540+
{
541+
Config: testAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(context),
542+
},
543+
{
544+
ResourceName: "google_compute_subnetwork.subnetwork-with-subnet-mode-pdp",
545+
ImportState: true,
546+
ImportStateVerify: true,
547+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
548+
},
549+
},
550+
})
551+
}
552+
553+
func testAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(context map[string]interface{}) string {
554+
return acctest.Nprintf(`
555+
resource "google_compute_subnetwork" "subnetwork-with-subnet-mode-pdp" {
556+
name = "tf-test-subnet-mode-pdp-subnet%{random_suffix}"
557+
region = "us-central1"
558+
network = google_compute_network.custom-test-network.id
559+
stack_type = "IPV6_ONLY"
560+
ipv6_access_type = "EXTERNAL"
561+
ip_collection = "%{ip_collection_url}"
562+
}
563+
564+
resource "google_compute_network" "custom-test-network" {
565+
name = "tf-test-network-byoipv6-external%{random_suffix}"
566+
auto_create_subnetworks = false
567+
}
568+
`, context)
569+
}
570+
527571
func TestAccComputeSubnetwork_subnetworkIpv6OnlyExternalExample(t *testing.T) {
528572
t.Parallel()
529573

@@ -543,7 +587,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6OnlyExternalExample(t *testing.T) {
543587
ResourceName: "google_compute_subnetwork.subnetwork-ipv6-only",
544588
ImportState: true,
545589
ImportStateVerify: true,
546-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
590+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
547591
},
548592
},
549593
})

website/docs/r/compute_subnetwork.html.markdown

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,18 @@ The following arguments are supported:
437437
(Optional)
438438
The range of external IPv6 addresses that are owned by this subnetwork.
439439

440+
* `ip_collection` -
441+
(Optional)
442+
Resource reference of a PublicDelegatedPrefix. The PDP must be a sub-PDP
443+
in EXTERNAL_IPV6_SUBNETWORK_CREATION mode.
444+
Use one of the following formats to specify a sub-PDP when creating an
445+
IPv6 NetLB forwarding rule using BYOIP:
446+
Full resource URL, as in:
447+
* `https://www.googleapis.com/compute/v1/projects/{{projectId}}/regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}`
448+
Partial URL, as in:
449+
* `projects/{{projectId}}/regions/region/publicDelegatedPrefixes/{{sub-pdp-name}}`
450+
* `regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}`
451+
440452
* `allow_subnet_cidr_routes_overlap` -
441453
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
442454
Typically packets destined to IPs within the subnetwork range that do not match
@@ -536,6 +548,13 @@ In addition to the arguments listed above, the following computed attributes are
536548

537549
* `internal_ipv6_prefix` -
538550
The internal IPv6 address range that is assigned to this subnetwork.
551+
552+
* `ipv6_gce_endpoint` -
553+
Possible endpoints of this subnetwork. It can be one of the following:
554+
* VM_ONLY: The subnetwork can be used for creating instances and IPv6 addresses with VM endpoint type. Such a subnetwork
555+
gets external IPv6 ranges from a public delegated prefix and cannot be used to create NetLb.
556+
* VM_AND_FR: The subnetwork can be used for creating both VM instances and Forwarding Rules. It can also be used to reserve
557+
IPv6 addresses with both VM and FR endpoint types. Such a subnetwork gets its IPv6 range from Google IP Pool directly.
539558
* `self_link` - The URI of the created resource.
540559

541560

0 commit comments

Comments
 (0)