Skip to content

Commit ab76144

Browse files
NCC Producer VPC Spoke resource added (#11934) (#8376)
[upstream:aef29d4aee109af32f440e86c90c241d0e4a91b3] Signed-off-by: Modular Magician <[email protected]>
1 parent 9a8160c commit ab76144

File tree

4 files changed

+339
-4
lines changed

4 files changed

+339
-4
lines changed

Diff for: .changelog/11934.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
networkconnectivity: added `linked_producer_vpc_network` field to `google_network_connectivity_spoke` resource
3+
```

Diff for: google-beta/services/networkconnectivity/resource_network_connectivity_spoke.go

+169-4
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,55 @@ The only allowed value for now is "ALL_IPV4_RANGES".`,
123123
},
124124
},
125125
},
126-
ConflictsWith: []string{"linked_vpn_tunnels", "linked_router_appliance_instances", "linked_vpc_network"},
126+
ConflictsWith: []string{"linked_vpn_tunnels", "linked_router_appliance_instances", "linked_vpc_network", "linked_producer_vpc_network"},
127+
},
128+
"linked_producer_vpc_network": {
129+
Type: schema.TypeList,
130+
Optional: true,
131+
ForceNew: true,
132+
Description: `Producer VPC network that is associated with the spoke.`,
133+
MaxItems: 1,
134+
Elem: &schema.Resource{
135+
Schema: map[string]*schema.Schema{
136+
"network": {
137+
Type: schema.TypeString,
138+
Required: true,
139+
ForceNew: true,
140+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
141+
Description: `The URI of the Service Consumer VPC that the Producer VPC is peered with.`,
142+
},
143+
"peering": {
144+
Type: schema.TypeString,
145+
Required: true,
146+
ForceNew: true,
147+
Description: `The name of the VPC peering between the Service Consumer VPC and the Producer VPC (defined in the Tenant project) which is added to the NCC hub. This peering must be in ACTIVE state.`,
148+
},
149+
"exclude_export_ranges": {
150+
Type: schema.TypeList,
151+
Optional: true,
152+
ForceNew: true,
153+
Description: `IP ranges encompassing the subnets to be excluded from peering.`,
154+
Elem: &schema.Schema{
155+
Type: schema.TypeString,
156+
},
157+
},
158+
"include_export_ranges": {
159+
Type: schema.TypeList,
160+
Optional: true,
161+
ForceNew: true,
162+
Description: `IP ranges allowed to be included from peering.`,
163+
Elem: &schema.Schema{
164+
Type: schema.TypeString,
165+
},
166+
},
167+
"producer_network": {
168+
Type: schema.TypeString,
169+
Computed: true,
170+
Description: `The URI of the Producer VPC.`,
171+
},
172+
},
173+
},
174+
ConflictsWith: []string{"linked_interconnect_attachments", "linked_router_appliance_instances", "linked_vpn_tunnels", "linked_vpc_network"},
127175
},
128176
"linked_router_appliance_instances": {
129177
Type: schema.TypeList,
@@ -173,7 +221,7 @@ The only allowed value for now is "ALL_IPV4_RANGES".`,
173221
},
174222
},
175223
},
176-
ConflictsWith: []string{"linked_interconnect_attachments", "linked_vpn_tunnels", "linked_vpc_network"},
224+
ConflictsWith: []string{"linked_interconnect_attachments", "linked_vpn_tunnels", "linked_vpc_network", "linked_producer_vpc_network"},
177225
},
178226
"linked_vpc_network": {
179227
Type: schema.TypeList,
@@ -210,7 +258,7 @@ The only allowed value for now is "ALL_IPV4_RANGES".`,
210258
},
211259
},
212260
},
213-
ConflictsWith: []string{"linked_interconnect_attachments", "linked_router_appliance_instances", "linked_vpn_tunnels"},
261+
ConflictsWith: []string{"linked_interconnect_attachments", "linked_router_appliance_instances", "linked_vpn_tunnels", "linked_producer_vpc_network"},
214262
},
215263
"linked_vpn_tunnels": {
216264
Type: schema.TypeList,
@@ -246,7 +294,7 @@ The only allowed value for now is "ALL_IPV4_RANGES".`,
246294
},
247295
},
248296
},
249-
ConflictsWith: []string{"linked_interconnect_attachments", "linked_router_appliance_instances", "linked_vpc_network"},
297+
ConflictsWith: []string{"linked_interconnect_attachments", "linked_router_appliance_instances", "linked_vpc_network", "linked_producer_vpc_network"},
250298
},
251299
"create_time": {
252300
Type: schema.TypeString,
@@ -343,6 +391,12 @@ func resourceNetworkConnectivitySpokeCreate(d *schema.ResourceData, meta interfa
343391
} else if v, ok := d.GetOkExists("linked_vpc_network"); !tpgresource.IsEmptyValue(reflect.ValueOf(linkedVpcNetworkProp)) && (ok || !reflect.DeepEqual(v, linkedVpcNetworkProp)) {
344392
obj["linkedVpcNetwork"] = linkedVpcNetworkProp
345393
}
394+
linkedProducerVpcNetworkProp, err := expandNetworkConnectivitySpokeLinkedProducerVpcNetwork(d.Get("linked_producer_vpc_network"), d, config)
395+
if err != nil {
396+
return err
397+
} else if v, ok := d.GetOkExists("linked_producer_vpc_network"); !tpgresource.IsEmptyValue(reflect.ValueOf(linkedProducerVpcNetworkProp)) && (ok || !reflect.DeepEqual(v, linkedProducerVpcNetworkProp)) {
398+
obj["linkedProducerVpcNetwork"] = linkedProducerVpcNetworkProp
399+
}
346400
labelsProp, err := expandNetworkConnectivitySpokeEffectiveLabels(d.Get("effective_labels"), d, config)
347401
if err != nil {
348402
return err
@@ -478,6 +532,9 @@ func resourceNetworkConnectivitySpokeRead(d *schema.ResourceData, meta interface
478532
if err := d.Set("linked_vpc_network", flattenNetworkConnectivitySpokeLinkedVpcNetwork(res["linkedVpcNetwork"], d, config)); err != nil {
479533
return fmt.Errorf("Error reading Spoke: %s", err)
480534
}
535+
if err := d.Set("linked_producer_vpc_network", flattenNetworkConnectivitySpokeLinkedProducerVpcNetwork(res["linkedProducerVpcNetwork"], d, config)); err != nil {
536+
return fmt.Errorf("Error reading Spoke: %s", err)
537+
}
481538
if err := d.Set("unique_id", flattenNetworkConnectivitySpokeUniqueId(res["uniqueId"], d, config)); err != nil {
482539
return fmt.Errorf("Error reading Spoke: %s", err)
483540
}
@@ -835,6 +892,47 @@ func flattenNetworkConnectivitySpokeLinkedVpcNetworkIncludeExportRanges(v interf
835892
return v
836893
}
837894

895+
func flattenNetworkConnectivitySpokeLinkedProducerVpcNetwork(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
896+
if v == nil {
897+
return nil
898+
}
899+
original := v.(map[string]interface{})
900+
if len(original) == 0 {
901+
return nil
902+
}
903+
transformed := make(map[string]interface{})
904+
transformed["network"] =
905+
flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkNetwork(original["network"], d, config)
906+
transformed["peering"] =
907+
flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkPeering(original["peering"], d, config)
908+
transformed["producer_network"] =
909+
flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkProducerNetwork(original["producerNetwork"], d, config)
910+
transformed["include_export_ranges"] =
911+
flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkIncludeExportRanges(original["includeExportRanges"], d, config)
912+
transformed["exclude_export_ranges"] =
913+
flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkExcludeExportRanges(original["excludeExportRanges"], d, config)
914+
return []interface{}{transformed}
915+
}
916+
func flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkNetwork(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
917+
return v
918+
}
919+
920+
func flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkPeering(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
921+
return v
922+
}
923+
924+
func flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkProducerNetwork(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
925+
return v
926+
}
927+
928+
func flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkIncludeExportRanges(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
929+
return v
930+
}
931+
932+
func flattenNetworkConnectivitySpokeLinkedProducerVpcNetworkExcludeExportRanges(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
933+
return v
934+
}
935+
838936
func flattenNetworkConnectivitySpokeUniqueId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
839937
return v
840938
}
@@ -1087,6 +1185,73 @@ func expandNetworkConnectivitySpokeLinkedVpcNetworkIncludeExportRanges(v interfa
10871185
return v, nil
10881186
}
10891187

1188+
func expandNetworkConnectivitySpokeLinkedProducerVpcNetwork(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1189+
l := v.([]interface{})
1190+
if len(l) == 0 || l[0] == nil {
1191+
return nil, nil
1192+
}
1193+
raw := l[0]
1194+
original := raw.(map[string]interface{})
1195+
transformed := make(map[string]interface{})
1196+
1197+
transformedNetwork, err := expandNetworkConnectivitySpokeLinkedProducerVpcNetworkNetwork(original["network"], d, config)
1198+
if err != nil {
1199+
return nil, err
1200+
} else if val := reflect.ValueOf(transformedNetwork); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1201+
transformed["network"] = transformedNetwork
1202+
}
1203+
1204+
transformedPeering, err := expandNetworkConnectivitySpokeLinkedProducerVpcNetworkPeering(original["peering"], d, config)
1205+
if err != nil {
1206+
return nil, err
1207+
} else if val := reflect.ValueOf(transformedPeering); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1208+
transformed["peering"] = transformedPeering
1209+
}
1210+
1211+
transformedProducerNetwork, err := expandNetworkConnectivitySpokeLinkedProducerVpcNetworkProducerNetwork(original["producer_network"], d, config)
1212+
if err != nil {
1213+
return nil, err
1214+
} else if val := reflect.ValueOf(transformedProducerNetwork); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1215+
transformed["producerNetwork"] = transformedProducerNetwork
1216+
}
1217+
1218+
transformedIncludeExportRanges, err := expandNetworkConnectivitySpokeLinkedProducerVpcNetworkIncludeExportRanges(original["include_export_ranges"], d, config)
1219+
if err != nil {
1220+
return nil, err
1221+
} else if val := reflect.ValueOf(transformedIncludeExportRanges); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1222+
transformed["includeExportRanges"] = transformedIncludeExportRanges
1223+
}
1224+
1225+
transformedExcludeExportRanges, err := expandNetworkConnectivitySpokeLinkedProducerVpcNetworkExcludeExportRanges(original["exclude_export_ranges"], d, config)
1226+
if err != nil {
1227+
return nil, err
1228+
} else if val := reflect.ValueOf(transformedExcludeExportRanges); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1229+
transformed["excludeExportRanges"] = transformedExcludeExportRanges
1230+
}
1231+
1232+
return transformed, nil
1233+
}
1234+
1235+
func expandNetworkConnectivitySpokeLinkedProducerVpcNetworkNetwork(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1236+
return v, nil
1237+
}
1238+
1239+
func expandNetworkConnectivitySpokeLinkedProducerVpcNetworkPeering(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1240+
return v, nil
1241+
}
1242+
1243+
func expandNetworkConnectivitySpokeLinkedProducerVpcNetworkProducerNetwork(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1244+
return v, nil
1245+
}
1246+
1247+
func expandNetworkConnectivitySpokeLinkedProducerVpcNetworkIncludeExportRanges(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1248+
return v, nil
1249+
}
1250+
1251+
func expandNetworkConnectivitySpokeLinkedProducerVpcNetworkExcludeExportRanges(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1252+
return v, nil
1253+
}
1254+
10901255
func expandNetworkConnectivitySpokeEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
10911256
if v == nil {
10921257
return map[string]string{}, nil

Diff for: google-beta/services/networkconnectivity/resource_network_connectivity_spoke_generated_test.go

+80
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,86 @@ resource "google_network_connectivity_spoke" "primary" {
418418
`, context)
419419
}
420420

421+
func TestAccNetworkConnectivitySpoke_networkConnectivitySpokeLinkedProducerVpcNetworkBasicExample(t *testing.T) {
422+
t.Parallel()
423+
424+
context := map[string]interface{}{
425+
"random_suffix": acctest.RandString(t, 10),
426+
}
427+
428+
acctest.VcrTest(t, resource.TestCase{
429+
PreCheck: func() { acctest.AccTestPreCheck(t) },
430+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
431+
CheckDestroy: testAccCheckNetworkConnectivitySpokeDestroyProducer(t),
432+
Steps: []resource.TestStep{
433+
{
434+
Config: testAccNetworkConnectivitySpoke_networkConnectivitySpokeLinkedProducerVpcNetworkBasicExample(context),
435+
},
436+
{
437+
ResourceName: "google_network_connectivity_spoke.primary",
438+
ImportState: true,
439+
ImportStateVerify: true,
440+
ImportStateVerifyIgnore: []string{"hub", "labels", "location", "terraform_labels"},
441+
},
442+
},
443+
})
444+
}
445+
446+
func testAccNetworkConnectivitySpoke_networkConnectivitySpokeLinkedProducerVpcNetworkBasicExample(context map[string]interface{}) string {
447+
return acctest.Nprintf(`
448+
resource "google_compute_network" "network" {
449+
name = "tf-test-net-spoke%{random_suffix}"
450+
auto_create_subnetworks = false
451+
}
452+
453+
resource "google_compute_global_address" "address" {
454+
name = "tf-test-test-address%{random_suffix}"
455+
purpose = "VPC_PEERING"
456+
address_type = "INTERNAL"
457+
prefix_length = 16
458+
network = google_compute_network.network.id
459+
}
460+
461+
resource "google_service_networking_connection" "peering" {
462+
network = google_compute_network.network.id
463+
service = "servicenetworking.googleapis.com"
464+
reserved_peering_ranges = [google_compute_global_address.address.name]
465+
}
466+
467+
resource "google_network_connectivity_hub" "basic_hub" {
468+
name = "tf-test-hub-basic%{random_suffix}"
469+
}
470+
471+
resource "google_network_connectivity_spoke" "linked_vpc_spoke" {
472+
name = "tf-test-vpc-spoke%{random_suffix}"
473+
location = "global"
474+
hub = google_network_connectivity_hub.basic_hub.id
475+
linked_vpc_network {
476+
uri = google_compute_network.network.self_link
477+
}
478+
}
479+
480+
resource "google_network_connectivity_spoke" "primary" {
481+
name = "tf-test-producer-spoke%{random_suffix}"
482+
location = "global"
483+
description = "A sample spoke with a linked router appliance instance"
484+
labels = {
485+
label-one = "value-one"
486+
}
487+
hub = google_network_connectivity_hub.basic_hub.id
488+
linked_producer_vpc_network {
489+
network = google_compute_network.network.name
490+
peering = google_service_networking_connection.peering.peering
491+
exclude_export_ranges = [
492+
"198.51.100.0/24",
493+
"10.10.0.0/16"
494+
]
495+
}
496+
depends_on = [google_network_connectivity_spoke.linked_vpc_spoke]
497+
}
498+
`, context)
499+
}
500+
421501
func testAccCheckNetworkConnectivitySpokeDestroyProducer(t *testing.T) func(s *terraform.State) error {
422502
return func(s *terraform.State) error {
423503
for name, rs := range s.RootModule().Resources {

0 commit comments

Comments
 (0)