Skip to content

Commit cf77659

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

File tree

5 files changed

+114
-6
lines changed

5 files changed

+114
-6
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/services/compute/resource_compute_subnetwork.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,20 @@ Provide this property when you create the subnetwork. For example,
159159
10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and
160160
non-overlapping within a network. Only IPv4 is supported.
161161
Field is optional when 'reserved_internal_range' is defined, otherwise required.`,
162+
},
163+
"ip_collection": {
164+
Type: schema.TypeString,
165+
Optional: true,
166+
ForceNew: true,
167+
Description: `Resource reference of a PublicDelegatedPrefix. The PDP must be a sub-PDP
168+
in EXTERNAL_IPV6_SUBNETWORK_CREATION mode.
169+
Use one of the following formats to specify a sub-PDP when creating an
170+
IPv6 NetLB forwarding rule using BYOIP:
171+
Full resource URL, as in:
172+
* 'https://www.googleapis.com/compute/v1/projects/{{projectId}}/regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}'
173+
Partial URL, as in:
174+
* 'projects/{{projectId}}/regions/region/publicDelegatedPrefixes/{{sub-pdp-name}}'
175+
* 'regions/{{region}}/publicDelegatedPrefixes/{{sub-pdp-name}}'`,
162176
},
163177
"ipv6_access_type": {
164178
Type: schema.TypeString,
@@ -357,6 +371,15 @@ outside this subnetwork.`,
357371
Computed: true,
358372
Description: `The range of internal IPv6 addresses that are owned by this subnetwork.`,
359373
},
374+
"ipv6_gce_endpoint": {
375+
Type: schema.TypeString,
376+
Computed: true,
377+
Description: `Possible endpoints of this subnetwork. It can be one of the following:
378+
* VM_ONLY: The subnetwork can be used for creating instances and IPv6 addresses with VM endpoint type. Such a subnetwork
379+
gets external IPv6 ranges from a public delegated prefix and cannot be used to create NetLb.
380+
* VM_AND_FR: The subnetwork can be used for creating both VM instances and Forwarding Rules. It can also be used to reserve
381+
IPv6 addresses with both VM and FR endpoint types. Such a subnetwork gets its IPv6 range from Google IP Pool directly.`,
382+
},
360383
"subnetwork_id": {
361384
Type: schema.TypeInt,
362385
Computed: true,
@@ -533,6 +556,12 @@ func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) e
533556
} else if v, ok := d.GetOkExists("external_ipv6_prefix"); !tpgresource.IsEmptyValue(reflect.ValueOf(externalIpv6PrefixProp)) && (ok || !reflect.DeepEqual(v, externalIpv6PrefixProp)) {
534557
obj["externalIpv6Prefix"] = externalIpv6PrefixProp
535558
}
559+
ipCollectionProp, err := expandComputeSubnetworkIpCollection(d.Get("ip_collection"), d, config)
560+
if err != nil {
561+
return err
562+
} else if v, ok := d.GetOkExists("ip_collection"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipCollectionProp)) && (ok || !reflect.DeepEqual(v, ipCollectionProp)) {
563+
obj["ipCollection"] = ipCollectionProp
564+
}
536565

537566
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks")
538567
if err != nil {
@@ -693,6 +722,9 @@ func resourceComputeSubnetworkRead(d *schema.ResourceData, meta interface{}) err
693722
if err := d.Set("external_ipv6_prefix", flattenComputeSubnetworkExternalIpv6Prefix(res["externalIpv6Prefix"], d, config)); err != nil {
694723
return fmt.Errorf("Error reading Subnetwork: %s", err)
695724
}
725+
if err := d.Set("ipv6_gce_endpoint", flattenComputeSubnetworkIpv6GceEndpoint(res["ipv6GceEndpoint"], d, config)); err != nil {
726+
return fmt.Errorf("Error reading Subnetwork: %s", err)
727+
}
696728
if err := d.Set("self_link", tpgresource.ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil {
697729
return fmt.Errorf("Error reading Subnetwork: %s", err)
698730
}
@@ -1478,6 +1510,10 @@ func flattenComputeSubnetworkExternalIpv6Prefix(v interface{}, d *schema.Resourc
14781510
return v
14791511
}
14801512

1513+
func flattenComputeSubnetworkIpv6GceEndpoint(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1514+
return v
1515+
}
1516+
14811517
func expandComputeSubnetworkDescription(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
14821518
return v, nil
14831519
}
@@ -1616,3 +1652,7 @@ func expandComputeSubnetworkIpv6AccessType(v interface{}, d tpgresource.Terrafor
16161652
func expandComputeSubnetworkExternalIpv6Prefix(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
16171653
return v, nil
16181654
}
1655+
1656+
func expandComputeSubnetworkIpCollection(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1657+
return v, nil
1658+
}

google/services/compute/resource_compute_subnetwork_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ fields:
1111
- field: 'gateway_address'
1212
- field: 'internal_ipv6_prefix'
1313
- field: 'ip_cidr_range'
14+
- field: 'ip_collection'
1415
- field: 'ipv6_access_type'
1516
- field: 'ipv6_cidr_range'
17+
- field: 'ipv6_gce_endpoint'
1618
- field: 'log_config.aggregation_interval'
1719
- field: 'log_config.filter_expr'
1820
- field: 'log_config.flow_sampling'

google/services/compute/resource_compute_subnetwork_generated_test.go

Lines changed: 50 additions & 6 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_subnetworkIpv6Example(t *testing.T) {
141141
ResourceName: "google_compute_subnetwork.subnetwork-ipv6",
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
})
@@ -187,7 +187,7 @@ func TestAccComputeSubnetwork_subnetworkInternalIpv6Example(t *testing.T) {
187187
ResourceName: "google_compute_subnetwork.subnetwork-internal-ipv6",
188188
ImportState: true,
189189
ImportStateVerify: true,
190-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
190+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
191191
},
192192
},
193193
})
@@ -234,7 +234,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6OnlyInternalExample(t *testing.T) {
234234
ResourceName: "google_compute_subnetwork.subnetwork-ipv6-only",
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
})
@@ -258,6 +258,50 @@ resource "google_compute_network" "custom-test" {
258258
`, context)
259259
}
260260

261+
func TestAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(t *testing.T) {
262+
t.Parallel()
263+
264+
context := map[string]interface{}{
265+
"ip_collection_url": "projects/tf-static-byoip/regions/us-central1/publicDelegatedPrefixes/tf-test-subnet-mode-pdp",
266+
"random_suffix": acctest.RandString(t, 10),
267+
}
268+
269+
acctest.VcrTest(t, resource.TestCase{
270+
PreCheck: func() { acctest.AccTestPreCheck(t) },
271+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
272+
CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t),
273+
Steps: []resource.TestStep{
274+
{
275+
Config: testAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(context),
276+
},
277+
{
278+
ResourceName: "google_compute_subnetwork.subnetwork-with-subnet-mode-pdp",
279+
ImportState: true,
280+
ImportStateVerify: true,
281+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
282+
},
283+
},
284+
})
285+
}
286+
287+
func testAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(context map[string]interface{}) string {
288+
return acctest.Nprintf(`
289+
resource "google_compute_subnetwork" "subnetwork-with-subnet-mode-pdp" {
290+
name = "tf-test-subnet-mode-pdp-subnet%{random_suffix}"
291+
region = "us-central1"
292+
network = google_compute_network.custom-test-network.id
293+
stack_type = "IPV6_ONLY"
294+
ipv6_access_type = "EXTERNAL"
295+
ip_collection = "%{ip_collection_url}"
296+
}
297+
298+
resource "google_compute_network" "custom-test-network" {
299+
name = "tf-test-network-byoipv6-external%{random_suffix}"
300+
auto_create_subnetworks = false
301+
}
302+
`, context)
303+
}
304+
261305
func TestAccComputeSubnetwork_subnetworkIpv6OnlyExternalExample(t *testing.T) {
262306
t.Parallel()
263307

@@ -277,7 +321,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6OnlyExternalExample(t *testing.T) {
277321
ResourceName: "google_compute_subnetwork.subnetwork-ipv6-only",
278322
ImportState: true,
279323
ImportStateVerify: true,
280-
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
324+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
281325
},
282326
},
283327
})

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)