Skip to content

Commit 8e7d14a

Browse files
Breaking change - Add integration for subnetworks with internal ranges API (#10897) (#7980)
[upstream:cb56491a4cbb5453b0ba4f784f3fdb04831376f5] Signed-off-by: Modular Magician <magic-modules@google.com>
1 parent 66c1262 commit 8e7d14a

File tree

4 files changed

+322
-35
lines changed

4 files changed

+322
-35
lines changed

.changelog/10897.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 fields `reserved_internal_range` and `secondary_ip_ranges[].reserved_internal_range` to `google_compute_subnetwork` resource
3+
```

google-beta/services/compute/resource_compute_subnetwork.go

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,6 @@ func ResourceComputeSubnetwork() *schema.Resource {
7979
),
8080

8181
Schema: map[string]*schema.Schema{
82-
"ip_cidr_range": {
83-
Type: schema.TypeString,
84-
Required: true,
85-
ValidateFunc: verify.ValidateIpCidrRange,
86-
Description: `The range of internal addresses that are owned by this subnetwork.
87-
Provide this property when you create the subnetwork. For example,
88-
10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and
89-
non-overlapping within a network. Only IPv4 is supported.`,
90-
},
9182
"name": {
9283
Type: schema.TypeString,
9384
Required: true,
@@ -133,6 +124,17 @@ creation time.`,
133124
ForceNew: true,
134125
Description: `The range of external IPv6 addresses that are owned by this subnetwork.`,
135126
},
127+
"ip_cidr_range": {
128+
Type: schema.TypeString,
129+
Computed: true,
130+
Optional: true,
131+
ValidateFunc: verify.ValidateIpCidrRange,
132+
Description: `The range of internal addresses that are owned by this subnetwork.
133+
Provide this property when you create the subnetwork. For example,
134+
10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and
135+
non-overlapping within a network. Only IPv4 is supported.
136+
Field is optional when 'reserved_internal_range' is defined, otherwise required.`,
137+
},
136138
"ipv6_access_type": {
137139
Type: schema.TypeString,
138140
Optional: true,
@@ -239,6 +241,14 @@ If unspecified, the purpose defaults to 'PRIVATE_RFC_1918'.`,
239241
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
240242
Description: `The GCP region for this subnetwork.`,
241243
},
244+
"reserved_internal_range": {
245+
Type: schema.TypeString,
246+
Optional: true,
247+
ForceNew: true,
248+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
249+
Description: `The ID of the reserved internal range. Must be prefixed with 'networkconnectivity.googleapis.com'
250+
E.g. 'networkconnectivity.googleapis.com/projects/{project}/locations/global/internalRanges/{rangeId}'`,
251+
},
242252
"role": {
243253
Type: schema.TypeString,
244254
Optional: true,
@@ -266,15 +276,6 @@ of zero objects you must use the following syntax:
266276
For more details about this behavior, see [this section](https://www.terraform.io/docs/configuration/attr-as-blocks.html#defining-a-fixed-object-collection-value).`,
267277
Elem: &schema.Resource{
268278
Schema: map[string]*schema.Schema{
269-
"ip_cidr_range": {
270-
Type: schema.TypeString,
271-
Required: true,
272-
ValidateFunc: verify.ValidateIpCidrRange,
273-
Description: `The range of IP addresses belonging to this subnetwork secondary
274-
range. Provide this property when you create the subnetwork.
275-
Ranges must be unique and non-overlapping with all primary and
276-
secondary IP ranges within a network. Only IPv4 is supported.`,
277-
},
278279
"range_name": {
279280
Type: schema.TypeString,
280281
Required: true,
@@ -284,6 +285,24 @@ when adding an alias IP range to a VM instance. The name must
284285
be 1-63 characters long, and comply with RFC1035. The name
285286
must be unique within the subnetwork.`,
286287
},
288+
"ip_cidr_range": {
289+
Type: schema.TypeString,
290+
Computed: true,
291+
Optional: true,
292+
ValidateFunc: verify.ValidateIpCidrRange,
293+
Description: `The range of IP addresses belonging to this subnetwork secondary
294+
range. Provide this property when you create the subnetwork.
295+
Ranges must be unique and non-overlapping with all primary and
296+
secondary IP ranges within a network. Only IPv4 is supported.
297+
Field is optional when 'reserved_internal_range' is defined, otherwise required.`,
298+
},
299+
"reserved_internal_range": {
300+
Type: schema.TypeString,
301+
Optional: true,
302+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
303+
Description: `The ID of the reserved internal range. Must be prefixed with 'networkconnectivity.googleapis.com'
304+
E.g. 'networkconnectivity.googleapis.com/projects/{project}/locations/global/internalRanges/{rangeId}'`,
305+
},
287306
},
288307
},
289308
},
@@ -399,6 +418,12 @@ func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) e
399418
} else if v, ok := d.GetOkExists("ip_cidr_range"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipCidrRangeProp)) && (ok || !reflect.DeepEqual(v, ipCidrRangeProp)) {
400419
obj["ipCidrRange"] = ipCidrRangeProp
401420
}
421+
reservedInternalRangeProp, err := expandComputeSubnetworkReservedInternalRange(d.Get("reserved_internal_range"), d, config)
422+
if err != nil {
423+
return err
424+
} else if v, ok := d.GetOkExists("reserved_internal_range"); !tpgresource.IsEmptyValue(reflect.ValueOf(reservedInternalRangeProp)) && (ok || !reflect.DeepEqual(v, reservedInternalRangeProp)) {
425+
obj["reservedInternalRange"] = reservedInternalRangeProp
426+
}
402427
nameProp, err := expandComputeSubnetworkName(d.Get("name"), d, config)
403428
if err != nil {
404429
return err
@@ -588,6 +613,9 @@ func resourceComputeSubnetworkRead(d *schema.ResourceData, meta interface{}) err
588613
if err := d.Set("ip_cidr_range", flattenComputeSubnetworkIpCidrRange(res["ipCidrRange"], d, config)); err != nil {
589614
return fmt.Errorf("Error reading Subnetwork: %s", err)
590615
}
616+
if err := d.Set("reserved_internal_range", flattenComputeSubnetworkReservedInternalRange(res["reservedInternalRange"], d, config)); err != nil {
617+
return fmt.Errorf("Error reading Subnetwork: %s", err)
618+
}
591619
if err := d.Set("name", flattenComputeSubnetworkName(res["name"], d, config)); err != nil {
592620
return fmt.Errorf("Error reading Subnetwork: %s", err)
593621
}
@@ -1136,6 +1164,13 @@ func flattenComputeSubnetworkIpCidrRange(v interface{}, d *schema.ResourceData,
11361164
return v
11371165
}
11381166

1167+
func flattenComputeSubnetworkReservedInternalRange(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1168+
if v == nil {
1169+
return v
1170+
}
1171+
return tpgresource.ConvertSelfLinkToV1(v.(string))
1172+
}
1173+
11391174
func flattenComputeSubnetworkName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
11401175
return v
11411176
}
@@ -1168,8 +1203,9 @@ func flattenComputeSubnetworkSecondaryIpRange(v interface{}, d *schema.ResourceD
11681203
continue
11691204
}
11701205
transformed = append(transformed, map[string]interface{}{
1171-
"range_name": flattenComputeSubnetworkSecondaryIpRangeRangeName(original["rangeName"], d, config),
1172-
"ip_cidr_range": flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(original["ipCidrRange"], d, config),
1206+
"range_name": flattenComputeSubnetworkSecondaryIpRangeRangeName(original["rangeName"], d, config),
1207+
"ip_cidr_range": flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(original["ipCidrRange"], d, config),
1208+
"reserved_internal_range": flattenComputeSubnetworkSecondaryIpRangeReservedInternalRange(original["reservedInternalRange"], d, config),
11731209
})
11741210
}
11751211
return transformed
@@ -1182,6 +1218,13 @@ func flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(v interface{}, d *schem
11821218
return v
11831219
}
11841220

1221+
func flattenComputeSubnetworkSecondaryIpRangeReservedInternalRange(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1222+
if v == nil {
1223+
return v
1224+
}
1225+
return tpgresource.ConvertSelfLinkToV1(v.(string))
1226+
}
1227+
11851228
func flattenComputeSubnetworkPrivateIpGoogleAccess(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
11861229
return v
11871230
}
@@ -1262,6 +1305,10 @@ func expandComputeSubnetworkIpCidrRange(v interface{}, d tpgresource.TerraformRe
12621305
return v, nil
12631306
}
12641307

1308+
func expandComputeSubnetworkReservedInternalRange(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1309+
return v, nil
1310+
}
1311+
12651312
func expandComputeSubnetworkName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
12661313
return v, nil
12671314
}
@@ -1306,6 +1353,13 @@ func expandComputeSubnetworkSecondaryIpRange(v interface{}, d tpgresource.Terraf
13061353
transformed["ipCidrRange"] = transformedIpCidrRange
13071354
}
13081355

1356+
transformedReservedInternalRange, err := expandComputeSubnetworkSecondaryIpRangeReservedInternalRange(original["reserved_internal_range"], d, config)
1357+
if err != nil {
1358+
return nil, err
1359+
} else if val := reflect.ValueOf(transformedReservedInternalRange); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1360+
transformed["reservedInternalRange"] = transformedReservedInternalRange
1361+
}
1362+
13091363
req = append(req, transformed)
13101364
}
13111365
return req, nil
@@ -1319,6 +1373,10 @@ func expandComputeSubnetworkSecondaryIpRangeIpCidrRange(v interface{}, d tpgreso
13191373
return v, nil
13201374
}
13211375

1376+
func expandComputeSubnetworkSecondaryIpRangeReservedInternalRange(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1377+
return v, nil
1378+
}
1379+
13221380
func expandComputeSubnetworkPrivateIpGoogleAccess(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
13231381
return v, nil
13241382
}

google-beta/services/compute/resource_compute_subnetwork_generated_test.go

Lines changed: 134 additions & 7 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"},
52+
ImportStateVerifyIgnore: []string{"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"},
97+
ImportStateVerifyIgnore: []string{"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"},
144+
ImportStateVerifyIgnore: []string{"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"},
191+
ImportStateVerifyIgnore: []string{"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"},
237+
ImportStateVerifyIgnore: []string{"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"},
284+
ImportStateVerifyIgnore: []string{"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"},
330+
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
331331
},
332332
},
333333
})
@@ -354,6 +354,133 @@ resource "google_compute_network" "net-cidr-overlap" {
354354
`, context)
355355
}
356356

357+
func TestAccComputeSubnetwork_subnetworkReservedInternalRangeExample(t *testing.T) {
358+
t.Parallel()
359+
360+
context := map[string]interface{}{
361+
"random_suffix": acctest.RandString(t, 10),
362+
}
363+
364+
acctest.VcrTest(t, resource.TestCase{
365+
PreCheck: func() { acctest.AccTestPreCheck(t) },
366+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
367+
CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t),
368+
Steps: []resource.TestStep{
369+
{
370+
Config: testAccComputeSubnetwork_subnetworkReservedInternalRangeExample(context),
371+
},
372+
{
373+
ResourceName: "google_compute_subnetwork.subnetwork-reserved-internal-range",
374+
ImportState: true,
375+
ImportStateVerify: true,
376+
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
377+
},
378+
},
379+
})
380+
}
381+
382+
func testAccComputeSubnetwork_subnetworkReservedInternalRangeExample(context map[string]interface{}) string {
383+
return acctest.Nprintf(`
384+
resource "google_compute_subnetwork" "subnetwork-reserved-internal-range" {
385+
provider = google-beta
386+
name = "tf-test-subnetwork-reserved-internal-range%{random_suffix}"
387+
region = "us-central1"
388+
network = google_compute_network.default.id
389+
reserved_internal_range = "networkconnectivity.googleapis.com/${google_network_connectivity_internal_range.reserved.id}"
390+
}
391+
392+
resource "google_compute_network" "default" {
393+
provider = google-beta
394+
name = "tf-test-network-reserved-internal-range%{random_suffix}"
395+
auto_create_subnetworks = false
396+
}
397+
398+
resource "google_network_connectivity_internal_range" "reserved" {
399+
provider = google-beta
400+
name = "reserved"
401+
network = google_compute_network.default.id
402+
usage = "FOR_VPC"
403+
peering = "FOR_SELF"
404+
prefix_length = 24
405+
target_cidr_range = [
406+
"10.0.0.0/8"
407+
]
408+
}
409+
`, context)
410+
}
411+
412+
func TestAccComputeSubnetwork_subnetworkReservedSecondaryRangeExample(t *testing.T) {
413+
t.Parallel()
414+
415+
context := map[string]interface{}{
416+
"random_suffix": acctest.RandString(t, 10),
417+
}
418+
419+
acctest.VcrTest(t, resource.TestCase{
420+
PreCheck: func() { acctest.AccTestPreCheck(t) },
421+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
422+
CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t),
423+
Steps: []resource.TestStep{
424+
{
425+
Config: testAccComputeSubnetwork_subnetworkReservedSecondaryRangeExample(context),
426+
},
427+
{
428+
ResourceName: "google_compute_subnetwork.subnetwork-reserved-secondary-range",
429+
ImportState: true,
430+
ImportStateVerify: true,
431+
ImportStateVerifyIgnore: []string{"network", "region", "reserved_internal_range"},
432+
},
433+
},
434+
})
435+
}
436+
437+
func testAccComputeSubnetwork_subnetworkReservedSecondaryRangeExample(context map[string]interface{}) string {
438+
return acctest.Nprintf(`
439+
resource "google_compute_subnetwork" "subnetwork-reserved-secondary-range" {
440+
provider = google-beta
441+
name = "tf-test-subnetwork-reserved-secondary-range%{random_suffix}"
442+
region = "us-central1"
443+
network = google_compute_network.default.id
444+
reserved_internal_range = "networkconnectivity.googleapis.com/${google_network_connectivity_internal_range.reserved.id}"
445+
446+
secondary_ip_range {
447+
range_name = "secondary"
448+
reserved_internal_range = "networkconnectivity.googleapis.com/${google_network_connectivity_internal_range.reserved_secondary.id}"
449+
}
450+
}
451+
452+
resource "google_compute_network" "default" {
453+
provider = google-beta
454+
name = "tf-test-network-reserved-secondary-range%{random_suffix}"
455+
auto_create_subnetworks = false
456+
}
457+
458+
resource "google_network_connectivity_internal_range" "reserved" {
459+
provider = google-beta
460+
name = "reserved"
461+
network = google_compute_network.default.id
462+
usage = "FOR_VPC"
463+
peering = "FOR_SELF"
464+
prefix_length = 24
465+
target_cidr_range = [
466+
"10.0.0.0/8"
467+
]
468+
}
469+
470+
resource "google_network_connectivity_internal_range" "reserved_secondary" {
471+
provider = google-beta
472+
name = "reserved-secondary"
473+
network = google_compute_network.default.id
474+
usage = "FOR_VPC"
475+
peering = "FOR_SELF"
476+
prefix_length = 16
477+
target_cidr_range = [
478+
"10.0.0.0/8"
479+
]
480+
}
481+
`, context)
482+
}
483+
357484
func testAccCheckComputeSubnetworkDestroyProducer(t *testing.T) func(s *terraform.State) error {
358485
return func(s *terraform.State) error {
359486
for name, rs := range s.RootModule().Resources {

0 commit comments

Comments
 (0)