Skip to content

Commit 53d01b6

Browse files
Added network and subnetwork fields to google_compute_region_network_endpoint_group for PSC. (#6275) (#4528)
Signed-off-by: Modular Magician <[email protected]>
1 parent 035fe8c commit 53d01b6

File tree

4 files changed

+257
-4
lines changed

4 files changed

+257
-4
lines changed

.changelog/6275.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 `network` and `subnetwork` fields to `google_compute_region_network_endpoint_group` for PSC.
3+
```

google-beta/resource_compute_region_network_endpoint_group.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,15 @@ and { service="bar2", tag="foo2" } respectively.`,
187187
ForceNew: true,
188188
Description: `An optional description of this resource. Provide this property when
189189
you create the resource.`,
190+
},
191+
"network": {
192+
Type: schema.TypeString,
193+
Optional: true,
194+
ForceNew: true,
195+
DiffSuppressFunc: compareSelfLinkOrResourceName,
196+
Description: `This field is only used for PSC.
197+
The URL of the network to which all network endpoints in the NEG belong. Uses
198+
"default" project network if unspecified.`,
190199
},
191200
"network_endpoint_type": {
192201
Type: schema.TypeString,
@@ -247,6 +256,14 @@ API Gateway: Unused, App Engine: The service version, Cloud Functions: Unused, C
247256
},
248257
ConflictsWith: []string{"cloud_run", "cloud_function", "app_engine"},
249258
},
259+
"subnetwork": {
260+
Type: schema.TypeString,
261+
Optional: true,
262+
ForceNew: true,
263+
DiffSuppressFunc: compareSelfLinkOrResourceName,
264+
Description: `This field is only used for PSC.
265+
Optional URL of the subnetwork to which all network endpoints in the NEG belong.`,
266+
},
250267
"project": {
251268
Type: schema.TypeString,
252269
Optional: true,
@@ -294,6 +311,18 @@ func resourceComputeRegionNetworkEndpointGroupCreate(d *schema.ResourceData, met
294311
} else if v, ok := d.GetOkExists("psc_target_service"); !isEmptyValue(reflect.ValueOf(pscTargetServiceProp)) && (ok || !reflect.DeepEqual(v, pscTargetServiceProp)) {
295312
obj["pscTargetService"] = pscTargetServiceProp
296313
}
314+
networkProp, err := expandComputeRegionNetworkEndpointGroupNetwork(d.Get("network"), d, config)
315+
if err != nil {
316+
return err
317+
} else if v, ok := d.GetOkExists("network"); !isEmptyValue(reflect.ValueOf(networkProp)) && (ok || !reflect.DeepEqual(v, networkProp)) {
318+
obj["network"] = networkProp
319+
}
320+
subnetworkProp, err := expandComputeRegionNetworkEndpointGroupSubnetwork(d.Get("subnetwork"), d, config)
321+
if err != nil {
322+
return err
323+
} else if v, ok := d.GetOkExists("subnetwork"); !isEmptyValue(reflect.ValueOf(subnetworkProp)) && (ok || !reflect.DeepEqual(v, subnetworkProp)) {
324+
obj["subnetwork"] = subnetworkProp
325+
}
297326
cloudRunProp, err := expandComputeRegionNetworkEndpointGroupCloudRun(d.Get("cloud_run"), d, config)
298327
if err != nil {
299328
return err
@@ -417,6 +446,12 @@ func resourceComputeRegionNetworkEndpointGroupRead(d *schema.ResourceData, meta
417446
if err := d.Set("psc_target_service", flattenComputeRegionNetworkEndpointGroupPscTargetService(res["pscTargetService"], d, config)); err != nil {
418447
return fmt.Errorf("Error reading RegionNetworkEndpointGroup: %s", err)
419448
}
449+
if err := d.Set("network", flattenComputeRegionNetworkEndpointGroupNetwork(res["network"], d, config)); err != nil {
450+
return fmt.Errorf("Error reading RegionNetworkEndpointGroup: %s", err)
451+
}
452+
if err := d.Set("subnetwork", flattenComputeRegionNetworkEndpointGroupSubnetwork(res["subnetwork"], d, config)); err != nil {
453+
return fmt.Errorf("Error reading RegionNetworkEndpointGroup: %s", err)
454+
}
420455
if err := d.Set("cloud_run", flattenComputeRegionNetworkEndpointGroupCloudRun(res["cloudRun"], d, config)); err != nil {
421456
return fmt.Errorf("Error reading RegionNetworkEndpointGroup: %s", err)
422457
}
@@ -521,6 +556,20 @@ func flattenComputeRegionNetworkEndpointGroupPscTargetService(v interface{}, d *
521556
return v
522557
}
523558

559+
func flattenComputeRegionNetworkEndpointGroupNetwork(v interface{}, d *schema.ResourceData, config *Config) interface{} {
560+
if v == nil {
561+
return v
562+
}
563+
return ConvertSelfLinkToV1(v.(string))
564+
}
565+
566+
func flattenComputeRegionNetworkEndpointGroupSubnetwork(v interface{}, d *schema.ResourceData, config *Config) interface{} {
567+
if v == nil {
568+
return v
569+
}
570+
return ConvertSelfLinkToV1(v.(string))
571+
}
572+
524573
func flattenComputeRegionNetworkEndpointGroupCloudRun(v interface{}, d *schema.ResourceData, config *Config) interface{} {
525574
if v == nil {
526575
return nil
@@ -654,6 +703,22 @@ func expandComputeRegionNetworkEndpointGroupPscTargetService(v interface{}, d Te
654703
return v, nil
655704
}
656705

706+
func expandComputeRegionNetworkEndpointGroupNetwork(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
707+
f, err := parseGlobalFieldValue("networks", v.(string), "project", d, config, true)
708+
if err != nil {
709+
return nil, fmt.Errorf("Invalid value for network: %s", err)
710+
}
711+
return f.RelativeLink(), nil
712+
}
713+
714+
func expandComputeRegionNetworkEndpointGroupSubnetwork(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
715+
f, err := parseRegionalFieldValue("subnetworks", v.(string), "project", "region", "zone", d, config, true)
716+
if err != nil {
717+
return nil, fmt.Errorf("Invalid value for subnetwork: %s", err)
718+
}
719+
return f.RelativeLink(), nil
720+
}
721+
657722
func expandComputeRegionNetworkEndpointGroupCloudRun(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
658723
l := v.([]interface{})
659724
if len(l) == 0 || l[0] == nil {

google-beta/resource_compute_region_network_endpoint_group_generated_test.go

Lines changed: 101 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func TestAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupFunction
4343
ResourceName: "google_compute_region_network_endpoint_group.function_neg",
4444
ImportState: true,
4545
ImportStateVerify: true,
46-
ImportStateVerifyIgnore: []string{"region"},
46+
ImportStateVerifyIgnore: []string{"network", "subnetwork", "region"},
4747
},
4848
},
4949
})
@@ -106,7 +106,7 @@ func TestAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupCloudrun
106106
ResourceName: "google_compute_region_network_endpoint_group.cloudrun_neg",
107107
ImportState: true,
108108
ImportStateVerify: true,
109-
ImportStateVerifyIgnore: []string{"region"},
109+
ImportStateVerifyIgnore: []string{"network", "subnetwork", "region"},
110110
},
111111
},
112112
})
@@ -163,7 +163,7 @@ func TestAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupAppengin
163163
ResourceName: "google_compute_region_network_endpoint_group.appengine_neg",
164164
ImportState: true,
165165
ImportStateVerify: true,
166-
ImportStateVerifyIgnore: []string{"region"},
166+
ImportStateVerifyIgnore: []string{"network", "subnetwork", "region"},
167167
},
168168
},
169169
})
@@ -263,7 +263,7 @@ func TestAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupPscExamp
263263
ResourceName: "google_compute_region_network_endpoint_group.psc_neg",
264264
ImportState: true,
265265
ImportStateVerify: true,
266-
ImportStateVerifyIgnore: []string{"region"},
266+
ImportStateVerifyIgnore: []string{"network", "subnetwork", "region"},
267267
},
268268
},
269269
})
@@ -281,6 +281,103 @@ resource "google_compute_region_network_endpoint_group" "psc_neg" {
281281
`, context)
282282
}
283283

284+
func TestAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupPscServiceAttachmentExample(t *testing.T) {
285+
t.Parallel()
286+
287+
context := map[string]interface{}{
288+
"random_suffix": randString(t, 10),
289+
}
290+
291+
vcrTest(t, resource.TestCase{
292+
PreCheck: func() { testAccPreCheck(t) },
293+
Providers: testAccProviders,
294+
CheckDestroy: testAccCheckComputeRegionNetworkEndpointGroupDestroyProducer(t),
295+
Steps: []resource.TestStep{
296+
{
297+
Config: testAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupPscServiceAttachmentExample(context),
298+
},
299+
{
300+
ResourceName: "google_compute_region_network_endpoint_group.psc_neg_service_attachment",
301+
ImportState: true,
302+
ImportStateVerify: true,
303+
ImportStateVerifyIgnore: []string{"network", "subnetwork", "region"},
304+
},
305+
},
306+
})
307+
}
308+
309+
func testAccComputeRegionNetworkEndpointGroup_regionNetworkEndpointGroupPscServiceAttachmentExample(context map[string]interface{}) string {
310+
return Nprintf(`
311+
resource "google_compute_network" "default" {
312+
name = "tf-test-psc-network%{random_suffix}"
313+
}
314+
315+
resource "google_compute_subnetwork" "default" {
316+
name = "tf-test-psc-subnetwork%{random_suffix}"
317+
ip_cidr_range = "10.0.0.0/16"
318+
region = "europe-west4"
319+
network = google_compute_network.default.id
320+
}
321+
322+
resource "google_compute_subnetwork" "psc_subnetwork" {
323+
name = "tf-test-psc-subnetwork-nat%{random_suffix}"
324+
ip_cidr_range = "10.1.0.0/16"
325+
region = "europe-west4"
326+
purpose = "PRIVATE_SERVICE_CONNECT"
327+
network = google_compute_network.default.id
328+
}
329+
330+
resource "google_compute_health_check" "default" {
331+
name = "tf-test-psc-healthcheck%{random_suffix}"
332+
333+
check_interval_sec = 1
334+
timeout_sec = 1
335+
tcp_health_check {
336+
port = "80"
337+
}
338+
}
339+
resource "google_compute_region_backend_service" "default" {
340+
name = "tf-test-psc-backend%{random_suffix}"
341+
region = "europe-west4"
342+
343+
health_checks = [google_compute_health_check.default.id]
344+
}
345+
346+
resource "google_compute_forwarding_rule" "default" {
347+
name = "tf-test-psc-forwarding-rule%{random_suffix}"
348+
region = "europe-west4"
349+
350+
load_balancing_scheme = "INTERNAL"
351+
backend_service = google_compute_region_backend_service.default.id
352+
all_ports = true
353+
network = google_compute_network.default.name
354+
subnetwork = google_compute_subnetwork.default.name
355+
}
356+
357+
resource "google_compute_service_attachment" "default" {
358+
name = "tf-test-psc-service-attachment%{random_suffix}"
359+
region = "europe-west4"
360+
description = "A service attachment configured with Terraform"
361+
362+
enable_proxy_protocol = false
363+
connection_preference = "ACCEPT_AUTOMATIC"
364+
nat_subnets = [google_compute_subnetwork.psc_subnetwork.self_link]
365+
target_service = google_compute_forwarding_rule.default.self_link
366+
}
367+
368+
resource "google_compute_region_network_endpoint_group" "psc_neg_service_attachment" {
369+
name = "tf-test-psc-neg%{random_suffix}"
370+
region = "europe-west4"
371+
372+
network_endpoint_type = "PRIVATE_SERVICE_CONNECT"
373+
psc_target_service = google_compute_service_attachment.default.self_link
374+
375+
network = google_compute_network.default.self_link
376+
subnetwork = google_compute_subnetwork.default.self_link
377+
}
378+
`, context)
379+
}
380+
284381
func testAccCheckComputeRegionNetworkEndpointGroupDestroyProducer(t *testing.T) func(s *terraform.State) error {
285382
return func(s *terraform.State) error {
286383
for name, rs := range s.RootModule().Resources {

website/docs/r/compute_region_network_endpoint_group.html.markdown

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,83 @@ resource "google_compute_region_network_endpoint_group" "psc_neg" {
210210
psc_target_service = "asia-northeast3-cloudkms.googleapis.com"
211211
}
212212
```
213+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
214+
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=region_network_endpoint_group_psc_service_attachment&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
215+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
216+
</a>
217+
</div>
218+
## Example Usage - Region Network Endpoint Group Psc Service Attachment
219+
220+
221+
```hcl
222+
resource "google_compute_network" "default" {
223+
name = "psc-network"
224+
}
225+
226+
resource "google_compute_subnetwork" "default" {
227+
name = "psc-subnetwork"
228+
ip_cidr_range = "10.0.0.0/16"
229+
region = "europe-west4"
230+
network = google_compute_network.default.id
231+
}
232+
233+
resource "google_compute_subnetwork" "psc_subnetwork" {
234+
name = "psc-subnetwork-nat"
235+
ip_cidr_range = "10.1.0.0/16"
236+
region = "europe-west4"
237+
purpose = "PRIVATE_SERVICE_CONNECT"
238+
network = google_compute_network.default.id
239+
}
240+
241+
resource "google_compute_health_check" "default" {
242+
name = "psc-healthcheck"
243+
244+
check_interval_sec = 1
245+
timeout_sec = 1
246+
tcp_health_check {
247+
port = "80"
248+
}
249+
}
250+
resource "google_compute_region_backend_service" "default" {
251+
name = "psc-backend"
252+
region = "europe-west4"
253+
254+
health_checks = [google_compute_health_check.default.id]
255+
}
256+
257+
resource "google_compute_forwarding_rule" "default" {
258+
name = "psc-forwarding-rule"
259+
region = "europe-west4"
260+
261+
load_balancing_scheme = "INTERNAL"
262+
backend_service = google_compute_region_backend_service.default.id
263+
all_ports = true
264+
network = google_compute_network.default.name
265+
subnetwork = google_compute_subnetwork.default.name
266+
}
267+
268+
resource "google_compute_service_attachment" "default" {
269+
name = "psc-service-attachment"
270+
region = "europe-west4"
271+
description = "A service attachment configured with Terraform"
272+
273+
enable_proxy_protocol = false
274+
connection_preference = "ACCEPT_AUTOMATIC"
275+
nat_subnets = [google_compute_subnetwork.psc_subnetwork.self_link]
276+
target_service = google_compute_forwarding_rule.default.self_link
277+
}
278+
279+
resource "google_compute_region_network_endpoint_group" "psc_neg_service_attachment" {
280+
name = "psc-neg"
281+
region = "europe-west4"
282+
283+
network_endpoint_type = "PRIVATE_SERVICE_CONNECT"
284+
psc_target_service = google_compute_service_attachment.default.self_link
285+
286+
network = google_compute_network.default.self_link
287+
subnetwork = google_compute_subnetwork.default.self_link
288+
}
289+
```
213290

214291
## Argument Reference
215292

@@ -250,6 +327,17 @@ The following arguments are supported:
250327
The target service url used to set up private service connection to
251328
a Google API or a PSC Producer Service Attachment.
252329

330+
* `network` -
331+
(Optional)
332+
This field is only used for PSC.
333+
The URL of the network to which all network endpoints in the NEG belong. Uses
334+
"default" project network if unspecified.
335+
336+
* `subnetwork` -
337+
(Optional)
338+
This field is only used for PSC.
339+
Optional URL of the subnetwork to which all network endpoints in the NEG belong.
340+
253341
* `cloud_run` -
254342
(Optional)
255343
Only valid when networkEndpointType is "SERVERLESS".

0 commit comments

Comments
 (0)