From 39547bdc5647144e3da4bcbdac7c78cff07ab1bc Mon Sep 17 00:00:00 2001 From: Robert Teller <31879487+r-teller@users.noreply.github.com> Date: Tue, 10 Dec 2024 11:07:24 -0800 Subject: [PATCH] Update Network Connectivity Spoke Router and VPN Tunnels (#12519) --- mmv1/products/networkconnectivity/Spoke.yaml | 12 +- ...esource_network_connectivity_spoke_test.go | 589 +++++++++++++++++- 2 files changed, 582 insertions(+), 19 deletions(-) diff --git a/mmv1/products/networkconnectivity/Spoke.yaml b/mmv1/products/networkconnectivity/Spoke.yaml index 477700582912..b30943cd5866 100644 --- a/mmv1/products/networkconnectivity/Spoke.yaml +++ b/mmv1/products/networkconnectivity/Spoke.yaml @@ -125,12 +125,13 @@ properties: - name: 'linkedVpnTunnels' type: NestedObject description: The URIs of linked VPN tunnel resources - immutable: true conflicts: - linked_interconnect_attachments - linked_router_appliance_instances - linked_vpc_network - linked_producer_vpc_network + update_mask_fields: + - 'linkedVpnTunnels.includeImportRanges' properties: - name: 'uris' type: Array @@ -154,12 +155,13 @@ properties: - name: 'linkedInterconnectAttachments' type: NestedObject description: A collection of VLAN attachment resources. These resources should be redundant attachments that all advertise the same prefixes to Google Cloud. Alternatively, in active/passive configurations, all attachments should be capable of advertising the same prefixes. - immutable: true conflicts: - linked_vpn_tunnels - linked_router_appliance_instances - linked_vpc_network - linked_producer_vpc_network + update_mask_fields: + - 'linkedInterconnectAttachments.includeImportRanges' properties: - name: 'uris' type: Array @@ -183,12 +185,14 @@ properties: - name: 'linkedRouterApplianceInstances' type: NestedObject description: The URIs of linked Router appliance resources - immutable: true conflicts: - linked_interconnect_attachments - linked_vpn_tunnels - linked_vpc_network - linked_producer_vpc_network + update_mask_fields: + - 'linkedRouterApplianceInstances.instances' + - 'linkedRouterApplianceInstances.includeImportRanges' properties: - name: 'instances' type: Array @@ -203,11 +207,13 @@ properties: type: String description: The URI of the virtual machine resource immutable: true + required: true diff_suppress_func: 'tpgresource.CompareSelfLinkOrResourceName' - name: 'ipAddress' type: String description: The IP address on the VM to use for peering. immutable: true + required: true - name: 'siteToSiteDataTransfer' type: Boolean description: A value that controls whether site-to-site data transfer is enabled for these resources. Note that data transfer is available only in supported locations. diff --git a/mmv1/third_party/terraform/services/networkconnectivity/resource_network_connectivity_spoke_test.go b/mmv1/third_party/terraform/services/networkconnectivity/resource_network_connectivity_spoke_test.go index 91f7956ba370..9c28e20a50f9 100644 --- a/mmv1/third_party/terraform/services/networkconnectivity/resource_network_connectivity_spoke_test.go +++ b/mmv1/third_party/terraform/services/networkconnectivity/resource_network_connectivity_spoke_test.go @@ -112,6 +112,15 @@ func TestAccNetworkConnectivitySpoke_RouterApplianceHandWritten(t *testing.T) { ImportStateVerify: true, ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, + { + Config: testAccNetworkConnectivitySpoke_RouterApplianceHandWrittenUpdate1(context), + }, + { + ResourceName: "google_network_connectivity_spoke.primary", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, + }, }, }) } @@ -148,9 +157,91 @@ func TestAccNetworkConnectivitySpoke_RouterApplianceHandWrittenLongForm(t *testi ImportStateVerify: true, ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, + { + Config: testAccNetworkConnectivitySpoke_RouterApplianceHandWrittenUpdate1LongForm(context), + }, + { + ResourceName: "google_network_connectivity_spoke.primary", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, + }, }, }) } + +func TestAccNetworkConnectivitySpoke_VPNTunnelHandWrittenHandWritten(t *testing.T) { + t.Parallel() + + context := map[string]interface{}{ + "project_name": envvar.GetTestProjectFromEnv(), + "region": envvar.GetTestRegionFromEnv(), + "random_suffix": acctest.RandString(t, 10), + } + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckNetworkConnectivitySpokeDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccNetworkConnectivitySpoke_VPNTunnelHandWrittenHandWritten(context), + }, + { + ResourceName: "google_network_connectivity_spoke.primary", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, + }, + { + Config: testAccNetworkConnectivitySpoke_VPNTunnelHandWrittenHandWrittenUpdate0(context), + }, + { + ResourceName: "google_network_connectivity_spoke.primary", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, + }, + }, + }) +} + +func TestAccNetworkConnectivitySpoke_InterconnectAttachmentHandWrittenHandWritten(t *testing.T) { + t.Parallel() + + context := map[string]interface{}{ + "project_name": envvar.GetTestProjectFromEnv(), + "region": envvar.GetTestRegionFromEnv(), + "random_suffix": acctest.RandString(t, 10), + } + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckNetworkConnectivitySpokeDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccNetworkConnectivitySpoke_InterconnectAttachmentHandWrittenHandWritten(context), + }, + { + ResourceName: "google_network_connectivity_spoke.primary", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, + }, + { + Config: testAccNetworkConnectivitySpoke_InterconnectAttachmentHandWrittenHandWrittenUpdate0(context), + }, + { + ResourceName: "google_network_connectivity_spoke.primary", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, + }, + }, + }) +} + func testAccNetworkConnectivitySpoke_LinkedVPCNetworkHandWritten(context map[string]interface{}) string { return acctest.Nprintf(` @@ -244,8 +335,8 @@ resource "google_compute_subnetwork" "subnetwork" { network = google_compute_network.network.self_link } -resource "google_compute_instance" "instance" { - name = "tf-test-instance%{random_suffix}" +resource "google_compute_instance" "router-instance1" { + name = "tf-test-router-instance1%{random_suffix}" machine_type = "e2-medium" can_ip_forward = true zone = "%{zone}" @@ -276,14 +367,14 @@ resource "google_network_connectivity_hub" "basic_hub" { resource "google_network_connectivity_spoke" "primary" { name = "tf-test-name%{random_suffix}" location = "%{region}" - description = "A sample spoke with a linked routher appliance instance" + description = "A sample spoke with a single linked routher appliance instance" labels = { label-one = "value-one" } hub = google_network_connectivity_hub.basic_hub.id linked_router_appliance_instances { instances { - virtual_machine = google_compute_instance.instance.self_link + virtual_machine = google_compute_instance.router-instance1.self_link ip_address = "10.0.0.2" } site_to_site_data_transfer = true @@ -307,8 +398,8 @@ resource "google_compute_subnetwork" "subnetwork" { network = google_compute_network.network.self_link } -resource "google_compute_instance" "instance" { - name = "tf-test-instance%{random_suffix}" +resource "google_compute_instance" "router-instance1" { + name = "tf-test-router-instance1%{random_suffix}" machine_type = "e2-medium" can_ip_forward = true zone = "%{zone}" @@ -339,14 +430,14 @@ resource "google_network_connectivity_hub" "basic_hub" { resource "google_network_connectivity_spoke" "primary" { name = "tf-test-name%{random_suffix}" location = "%{region}" - description = "An UPDATED sample spoke with a linked routher appliance instance" + description = "An UPDATED sample spoke with a single linked routher appliance instance" labels = { label-two = "value-two" } hub = google_network_connectivity_hub.basic_hub.id linked_router_appliance_instances { instances { - virtual_machine = google_compute_instance.instance.self_link + virtual_machine = google_compute_instance.router-instance1.self_link ip_address = "10.0.0.2" } site_to_site_data_transfer = true @@ -354,6 +445,96 @@ resource "google_network_connectivity_spoke" "primary" { } `, context) } + +func testAccNetworkConnectivitySpoke_RouterApplianceHandWrittenUpdate1(context map[string]interface{}) string { + return acctest.Nprintf(` + +resource "google_compute_network" "network" { + name = "tf-test-network%{random_suffix}" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "subnetwork" { + name = "tf-test-subnet%{random_suffix}" + ip_cidr_range = "10.0.0.0/28" + region = "%{region}" + network = google_compute_network.network.self_link +} + +resource "google_compute_instance" "router-instance1" { + name = "tf-test-router-instance1%{random_suffix}" + machine_type = "e2-medium" + can_ip_forward = true + zone = "%{zone}" + + boot_disk { + initialize_params { + image = "projects/debian-cloud/global/images/debian-10-buster-v20210817" + } + } + + network_interface { + subnetwork = google_compute_subnetwork.subnetwork.name + network_ip = "10.0.0.2" + access_config { + network_tier = "PREMIUM" + } + } +} + +resource "google_compute_instance" "router-instance2" { + name = "tf-test-router-instance2%{random_suffix}" + machine_type = "e2-medium" + can_ip_forward = true + zone = "%{zone}" + + boot_disk { + initialize_params { + image = "projects/debian-cloud/global/images/debian-10-buster-v20210817" + } + } + + network_interface { + subnetwork = google_compute_subnetwork.subnetwork.name + network_ip = "10.0.0.3" + access_config { + network_tier = "PREMIUM" + } + } +} + +resource "google_network_connectivity_hub" "basic_hub" { + name = "tf-test-hub%{random_suffix}" + description = "A sample hub" + labels = { + label-two = "value-one" + } +} + +resource "google_network_connectivity_spoke" "primary" { + name = "tf-test-name%{random_suffix}" + location = "%{region}" + description = "An UPDATED sample spoke with two linked routher appliance instances" + labels = { + label-two = "value-two" + } + hub = google_network_connectivity_hub.basic_hub.id + linked_router_appliance_instances { + instances { + virtual_machine = google_compute_instance.router-instance1.self_link + ip_address = "10.0.0.2" + } + instances { + virtual_machine = google_compute_instance.router-instance2.self_link + ip_address = "10.0.0.3" + } + include_import_ranges = ["ALL_IPV4_RANGES"] + site_to_site_data_transfer = true + } +} +`, context) +} + func testAccNetworkConnectivitySpoke_LinkedVPCNetworkHandWrittenLongForm(context map[string]interface{}) string { return acctest.Nprintf(` @@ -447,8 +628,8 @@ resource "google_compute_subnetwork" "subnetwork" { network = google_compute_network.network.self_link } -resource "google_compute_instance" "instance" { - name = "tf-test-instance%{random_suffix}" +resource "google_compute_instance" "router-instance1" { + name = "tf-test-router-instance1%{random_suffix}" machine_type = "e2-medium" can_ip_forward = true zone = "%{zone}" @@ -479,14 +660,14 @@ resource "google_network_connectivity_hub" "basic_hub" { resource "google_network_connectivity_spoke" "primary" { name = "tf-test-name%{random_suffix}" location = "%{region}" - description = "A sample spoke with a linked routher appliance instance" + description = "A sample spoke with a single linked routher appliance instance" labels = { label-one = "value-one" } hub = google_network_connectivity_hub.basic_hub.id linked_router_appliance_instances { instances { - virtual_machine = google_compute_instance.instance.self_link + virtual_machine = google_compute_instance.router-instance1.self_link ip_address = "10.0.0.2" } site_to_site_data_transfer = true @@ -510,8 +691,71 @@ resource "google_compute_subnetwork" "subnetwork" { network = google_compute_network.network.self_link } -resource "google_compute_instance" "instance" { - name = "tf-test-instance%{random_suffix}" +resource "google_compute_instance" "router-instance1" { + name = "tf-test-router-instance1%{random_suffix}" + machine_type = "e2-medium" + can_ip_forward = true + zone = "%{zone}" + + boot_disk { + initialize_params { + image = "projects/debian-cloud/global/images/debian-10-buster-v20210817" + } + } + + network_interface { + subnetwork = google_compute_subnetwork.subnetwork.name + network_ip = "10.0.0.2" + access_config { + network_tier = "PREMIUM" + } + } +} + +resource "google_network_connectivity_hub" "basic_hub" { + name = "tf-test-hub%{random_suffix}" + description = "A sample hub" + labels = { + label-two = "value-one" + } +} + +resource "google_network_connectivity_spoke" "primary" { + name = "tf-test-name%{random_suffix}" + location = "%{region}" + description = "An UPDATED sample spoke with a single linked routher appliance instance" + labels = { + label-two = "value-two" + } + hub = google_network_connectivity_hub.basic_hub.id + linked_router_appliance_instances { + instances { + virtual_machine = google_compute_instance.router-instance1.self_link + ip_address = "10.0.0.2" + } + site_to_site_data_transfer = true + } +} +`, context) +} + +func testAccNetworkConnectivitySpoke_RouterApplianceHandWrittenUpdate1LongForm(context map[string]interface{}) string { + return acctest.Nprintf(` + +resource "google_compute_network" "network" { + name = "tf-test-network%{random_suffix}" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "subnetwork" { + name = "tf-test-subnet%{random_suffix}" + ip_cidr_range = "10.0.0.0/28" + region = "%{region}" + network = google_compute_network.network.self_link +} + +resource "google_compute_instance" "router-instance1" { + name = "tf-test-router-instance1%{random_suffix}" machine_type = "e2-medium" can_ip_forward = true zone = "%{zone}" @@ -531,6 +775,27 @@ resource "google_compute_instance" "instance" { } } +resource "google_compute_instance" "router-instance2" { + name = "tf-test-router-instance2%{random_suffix}" + machine_type = "e2-medium" + can_ip_forward = true + zone = "%{zone}" + + boot_disk { + initialize_params { + image = "projects/debian-cloud/global/images/debian-10-buster-v20210817" + } + } + + network_interface { + subnetwork = google_compute_subnetwork.subnetwork.name + network_ip = "10.0.0.3" + access_config { + network_tier = "PREMIUM" + } + } +} + resource "google_network_connectivity_hub" "basic_hub" { name = "tf-test-hub%{random_suffix}" description = "A sample hub" @@ -542,17 +807,309 @@ resource "google_network_connectivity_hub" "basic_hub" { resource "google_network_connectivity_spoke" "primary" { name = "tf-test-name%{random_suffix}" location = "%{region}" - description = "An UPDATED sample spoke with a linked routher appliance instance" + description = "An UPDATED sample spoke with two linked routher appliance instances" labels = { label-two = "value-two" } hub = google_network_connectivity_hub.basic_hub.id linked_router_appliance_instances { instances { - virtual_machine = google_compute_instance.instance.self_link + virtual_machine = google_compute_instance.router-instance1.self_link ip_address = "10.0.0.2" } + instances { + virtual_machine = google_compute_instance.router-instance2.self_link + ip_address = "10.0.0.3" + } + include_import_ranges = ["ALL_IPV4_RANGES"] + site_to_site_data_transfer = true + } +} +`, context) +} + +func testAccNetworkConnectivitySpoke_VPNTunnelHandWrittenHandWritten(context map[string]interface{}) string { + return acctest.Nprintf(` + +resource "google_compute_network" "network" { + name = "tf-test-network%{random_suffix}" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "subnetwork" { + name = "tf-test-subnet%{random_suffix}" + ip_cidr_range = "10.0.0.0/28" + region = "%{region}" + network = google_compute_network.network.self_link +} + +resource "google_compute_ha_vpn_gateway" "gateway" { + name = "tf-test-gw%{random_suffix}" + network = google_compute_network.network.id +} + +resource "google_compute_external_vpn_gateway" "external_vpn_gw" { + name = "tf-test-external-gw%{random_suffix}" + redundancy_type = "SINGLE_IP_INTERNALLY_REDUNDANT" + description = "An externally managed VPN gateway" + interface { + id = 0 + ip_address = "8.8.8.8" + } +} + +resource "google_compute_router" "router" { + name = "tf-test-router%{random_suffix}" + region = "%{region}" + network = google_compute_network.network.name + bgp { + asn = 64514 + } +} + +resource "google_compute_vpn_tunnel" "tunnel" { + name = "tf-test-tunnel%{random_suffix}" + region = "%{region}" + vpn_gateway = google_compute_ha_vpn_gateway.gateway.id + peer_external_gateway = google_compute_external_vpn_gateway.external_vpn_gw.id + peer_external_gateway_interface = 0 + shared_secret = "a secret message" + router = google_compute_router.router.id + vpn_gateway_interface = 0 +} + +resource "google_compute_router_interface" "router_interface" { + name = "tf-test-ri%{random_suffix}" + router = google_compute_router.router.name + region = "%{region}" + ip_range = "169.254.0.1/30" + vpn_tunnel = google_compute_vpn_tunnel.tunnel.name +} + +resource "google_compute_router_peer" "router_peer" { + name = "tf-test-peer%{random_suffix}" + router = google_compute_router.router.name + region = "%{region}" + peer_ip_address = "169.254.0.2" + peer_asn = 64515 + advertised_route_priority = 100 + interface = google_compute_router_interface.router_interface.name +} + +resource "google_network_connectivity_hub" "basic_hub" { + name = "tf-test-hub%{random_suffix}" + description = "A sample hub" + labels = { + label-two = "value-one" + } +} + +resource "google_network_connectivity_spoke" "primary" { + name = "tf-test-name%{random_suffix}" + location = "%{region}" + description = "A sample spoke with a linked VPN Tunnel, no include_import_ranges yet" + labels = { + label-one = "value-one" + } + hub = google_network_connectivity_hub.basic_hub.id + linked_vpn_tunnels { + uris = [google_compute_vpn_tunnel.tunnel.self_link] + site_to_site_data_transfer = true + } +} +`, context) +} + +func testAccNetworkConnectivitySpoke_VPNTunnelHandWrittenHandWrittenUpdate0(context map[string]interface{}) string { + return acctest.Nprintf(` + +resource "google_compute_network" "network" { + name = "tf-test-network%{random_suffix}" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "subnetwork" { + name = "tf-test-subnet%{random_suffix}" + ip_cidr_range = "10.0.0.0/28" + region = "%{region}" + network = google_compute_network.network.self_link +} + +resource "google_compute_ha_vpn_gateway" "gateway" { + name = "tf-test-gw%{random_suffix}" + network = google_compute_network.network.id +} + +resource "google_compute_external_vpn_gateway" "external_vpn_gw" { + name = "tf-test-external-gw%{random_suffix}" + redundancy_type = "SINGLE_IP_INTERNALLY_REDUNDANT" + description = "An externally managed VPN gateway" + interface { + id = 0 + ip_address = "8.8.8.8" + } +} + +resource "google_compute_router" "router" { + name = "tf-test-router%{random_suffix}" + region = "%{region}" + network = google_compute_network.network.name + bgp { + asn = 64514 + } +} + +resource "google_compute_vpn_tunnel" "tunnel" { + name = "tf-test-tunnel%{random_suffix}" + region = "%{region}" + vpn_gateway = google_compute_ha_vpn_gateway.gateway.id + peer_external_gateway = google_compute_external_vpn_gateway.external_vpn_gw.id + peer_external_gateway_interface = 0 + shared_secret = "a secret message" + router = google_compute_router.router.id + vpn_gateway_interface = 0 +} + +resource "google_compute_router_interface" "router_interface" { + name = "tf-test-ri%{random_suffix}" + router = google_compute_router.router.name + region = "%{region}" + ip_range = "169.254.0.1/30" + vpn_tunnel = google_compute_vpn_tunnel.tunnel.name +} + +resource "google_compute_router_peer" "router_peer" { + name = "tf-test-peer%{random_suffix}" + router = google_compute_router.router.name + region = "%{region}" + peer_ip_address = "169.254.0.2" + peer_asn = 64515 + advertised_route_priority = 100 + interface = google_compute_router_interface.router_interface.name +} + +resource "google_network_connectivity_hub" "basic_hub" { + name = "tf-test-hub%{random_suffix}" + description = "A sample hub" + labels = { + label-two = "value-one" + } +} + +resource "google_network_connectivity_spoke" "primary" { + name = "tf-test-name%{random_suffix}" + location = "%{region}" + description = "An UPDATED sample spoke with a linked VPN Tunnel, now includes ALL_IPV4_RANGES" + labels = { + label-one = "value-one" + } + hub = google_network_connectivity_hub.basic_hub.id + linked_vpn_tunnels { + uris = [google_compute_vpn_tunnel.tunnel.self_link] + site_to_site_data_transfer = true + include_import_ranges = ["ALL_IPV4_RANGES"] + } +} +`, context) +} + +func testAccNetworkConnectivitySpoke_InterconnectAttachmentHandWrittenHandWritten(context map[string]interface{}) string { + return acctest.Nprintf(` + +resource "google_network_connectivity_hub" "basic_hub" { + name = "tf-test-hub%{random_suffix}" + description = "A sample hub" + labels = { + label-two = "value-one" + } +} + +resource "google_compute_network" "network" { + name = "tf-test-network%{random_suffix}" + auto_create_subnetworks = false +} + +resource "google_compute_router" "router" { + name = "tf-test-router%{random_suffix}" + region = "%{region}" + network = google_compute_network.network.name + bgp { + asn = 16550 + } +} + +resource "google_compute_interconnect_attachment" "interconnect_attachment" { + name = "tf-test-ia%{random_suffix}" + edge_availability_domain = "AVAILABILITY_DOMAIN_1" + type = "PARTNER" + router = google_compute_router.router.id + mtu = 1500 + region = "%{region}" +} + +resource "google_network_connectivity_spoke" "primary" { + name = "tf-test-spoke-ia%{random_suffix}" + location = "%{region}" + description = "A sample spoke with a linked interconnect_attachment, no include_import_ranges yet" + labels = { + label-one = "value-one" + } + hub = google_network_connectivity_hub.basic_hub.id + linked_interconnect_attachments { + uris = [google_compute_interconnect_attachment.interconnect_attachment.self_link] + site_to_site_data_transfer = true + # include_import_ranges not set initially + } +} +`, context) +} + +func testAccNetworkConnectivitySpoke_InterconnectAttachmentHandWrittenHandWrittenUpdate0(context map[string]interface{}) string { + return acctest.Nprintf(` + +resource "google_network_connectivity_hub" "basic_hub" { + name = "tf-test-hub%{random_suffix}" + description = "A sample hub" + labels = { + label-two = "value-one" + } +} + +resource "google_compute_network" "network" { + name = "tf-test-network%{random_suffix}" + auto_create_subnetworks = false +} + +resource "google_compute_router" "router" { + name = "tf-test-router%{random_suffix}" + region = "%{region}" + network = google_compute_network.network.name + bgp { + asn = 16550 + } +} + +resource "google_compute_interconnect_attachment" "interconnect_attachment" { + name = "tf-test-ia%{random_suffix}" + edge_availability_domain = "AVAILABILITY_DOMAIN_1" + type = "PARTNER" + router = google_compute_router.router.id + mtu = 1500 + region = "%{region}" +} + +resource "google_network_connectivity_spoke" "primary" { + name = "tf-test-spoke-ia%{random_suffix}" + location = "%{region}" + description = "An updated sample spoke with interconnect_attachment, now includes ALL_IPV4_RANGES" + labels = { + label-one = "value-one" + } + hub = google_network_connectivity_hub.basic_hub.id + linked_interconnect_attachments { + uris = [google_compute_interconnect_attachment.interconnect_attachment.self_link] site_to_site_data_transfer = true + include_import_ranges = ["ALL_IPV4_RANGES"] } } `, context)