Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Data Source: azurerm_virtual_network_peering - resolve issue (#27486) #27530

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/labeler-issue-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ service/netapp:
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_netapp_((.|\n)*)###'

service/network:
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_(application_gateway\W+|application_security_group\W+|bastion_host|custom_ip_prefix|express_route_|ip_group|local_network_gateway|nat_gateway|network_connection_monitor\W+|network_ddos_protection_plan\W+|network_interface\W+|network_interface_application_gateway_backend_address_pool_association\W+|network_interface_application_security_group_association\W+|network_interface_backend_address_pool_association\W+|network_interface_nat_rule_association\W+|network_interface_security_group_association\W+|network_manager\W+|network_manager\W+|network_manager_admin_rule\W+|network_manager_admin_rule_collection\W+|network_manager_connectivity_configuration\W+|network_manager_connectivity_configuration\W+|network_manager_deployment\W+|network_manager_management_group_connection\W+|network_manager_network_group\W+|network_manager_network_group\W+|network_manager_scope_connection\W+|network_manager_security_admin_configuration\W+|network_manager_static_member\W+|network_manager_subscription_connection\W+|network_packet_capture\W+|network_profile\W+|network_security_group\W+|network_security_rule\W+|network_service_tags\W+|network_watcher\W+|network_watcher_flow_log\W+|point_to_site_vpn_gateway|private_endpoint\W+|private_endpoint_application_security_group_association\W+|private_endpoint_connection\W+|private_link_service\W+|private_link_service_endpoint_connections\W+|public_ip|route|subnet|virtual_hub\W+|virtual_hub_bgp_connection\W+|virtual_hub_connection\W+|virtual_hub_ip\W+|virtual_hub_route_table\W+|virtual_hub_route_table_route\W+|virtual_hub_routing_intent\W+|virtual_hub_security_partner_provider\W+|virtual_machine_packet_capture\W+|virtual_machine_scale_set_packet_capture\W+|virtual_network\W+|virtual_network_dns_servers\W+|virtual_network_gateway\W+|virtual_network_gateway_connection\W+|virtual_network_gateway_nat_rule\W+|virtual_network_peering\W+|virtual_wan\W+|vpn_|web_application_firewall_policy)((.|\n)*)###'
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_(application_gateway\W+|application_security_group\W+|bastion_host|custom_ip_prefix|express_route_|ip_group|local_network_gateway|nat_gateway|network_connection_monitor\W+|network_ddos_protection_plan\W+|network_interface\W+|network_interface_application_gateway_backend_address_pool_association\W+|network_interface_application_security_group_association\W+|network_interface_backend_address_pool_association\W+|network_interface_nat_rule_association\W+|network_interface_security_group_association\W+|network_manager\W+|network_manager\W+|network_manager_admin_rule\W+|network_manager_admin_rule_collection\W+|network_manager_connectivity_configuration\W+|network_manager_connectivity_configuration\W+|network_manager_deployment\W+|network_manager_management_group_connection\W+|network_manager_network_group\W+|network_manager_network_group\W+|network_manager_scope_connection\W+|network_manager_security_admin_configuration\W+|network_manager_static_member\W+|network_manager_subscription_connection\W+|network_packet_capture\W+|network_profile\W+|network_security_group\W+|network_security_rule\W+|network_service_tags\W+|network_watcher\W+|network_watcher_flow_log\W+|point_to_site_vpn_gateway|private_endpoint\W+|private_endpoint_application_security_group_association\W+|private_endpoint_connection\W+|private_link_service\W+|private_link_service_endpoint_connections\W+|public_ip|route|subnet|virtual_hub\W+|virtual_hub_bgp_connection\W+|virtual_hub_connection\W+|virtual_hub_ip\W+|virtual_hub_route_table\W+|virtual_hub_route_table_route\W+|virtual_hub_routing_intent\W+|virtual_hub_security_partner_provider\W+|virtual_machine_packet_capture\W+|virtual_machine_scale_set_packet_capture\W+|virtual_network\W+|virtual_network_dns_servers\W+|virtual_network_gateway\W+|virtual_network_gateway_connection\W+|virtual_network_gateway_nat_rule\W+|virtual_network_peering\W+|virtual_network_peering\W+|virtual_wan\W+|vpn_|web_application_firewall_policy)((.|\n)*)###'

service/network-function:
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_network_function_((.|\n)*)###'
Expand Down
1 change: 1 addition & 0 deletions internal/services/network/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func (r Registration) DataSources() []sdk.DataSource {
ManagerNetworkGroupDataSource{},
ManagerConnectivityConfigurationDataSource{},
VPNServerConfigurationDataSource{},
VirtualNetworkPeeringDataSource{},
}
}

Expand Down
149 changes: 149 additions & 0 deletions internal/services/network/virtual_network_peering_data_source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package network

import (
"context"
"fmt"
"time"

"github.com/hashicorp/go-azure-helpers/lang/pointer"
"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonids"
"github.com/hashicorp/go-azure-sdk/resource-manager/network/2024-03-01/virtualnetworkpeerings"
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
)

var _ sdk.DataSource = VirtualNetworkPeeringDataSource{}

type VirtualNetworkPeeringDataSource struct{}

type VirtualNetworkPeeringDataSourceModel struct {
Name string `tfschema:"name"`
VirtualNetworkId string `tfschema:"virtual_network_id"`
RemoteVirtualNetworkId string `tfschema:"remote_virtual_network_id"`
AllowVirtualNetworkAccess bool `tfschema:"allow_virtual_network_access"`
AllowForwardedTraffic bool `tfschema:"allow_forwarded_traffic"`
AllowGatewayTransit bool `tfschema:"allow_gateway_transit"`
OnlyIPv6PeeringEnabled bool `tfschema:"only_ipv6_peering_enabled"`
PeerCompleteVnetsEnabled bool `tfschema:"peer_complete_virtual_networks_enabled"`
UseRemoteGateways bool `tfschema:"use_remote_gateways"`
}

func (VirtualNetworkPeeringDataSource) Arguments() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"name": {
Type: pluginsdk.TypeString,
Required: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"virtual_network_id": {
Type: pluginsdk.TypeString,
Required: true,
ValidateFunc: commonids.ValidateVirtualNetworkID,
},
}
}

func (VirtualNetworkPeeringDataSource) Attributes() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"remote_virtual_network_id": {
Type: pluginsdk.TypeString,
Computed: true,
},

"allow_virtual_network_access": {
Type: pluginsdk.TypeBool,
Computed: true,
},

"allow_forwarded_traffic": {
Type: pluginsdk.TypeBool,
Computed: true,
},

"allow_gateway_transit": {
Type: pluginsdk.TypeBool,
Computed: true,
},

"only_ipv6_peering_enabled": {
Type: pluginsdk.TypeBool,
Computed: true,
},

"peer_complete_virtual_networks_enabled": {
Type: pluginsdk.TypeBool,
Computed: true,
},

"use_remote_gateways": {
Type: pluginsdk.TypeBool,
Computed: true,
},
}
}

func (VirtualNetworkPeeringDataSource) ModelObject() interface{} {
return &VirtualNetworkPeeringDataSourceModel{}
}

func (VirtualNetworkPeeringDataSource) ResourceType() string {
return "azurerm_virtual_network_peering"
}

func (VirtualNetworkPeeringDataSource) Read() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 5 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.Network.VirtualNetworkPeerings

subscriptionId := metadata.Client.Account.SubscriptionId

var state VirtualNetworkPeeringDataSourceModel
if err := metadata.Decode(&state); err != nil {
return fmt.Errorf("decoding: %+v", err)
}

virtualNetworkId, err := commonids.ParseVirtualNetworkID(state.VirtualNetworkId)
if err != nil {
return err
}

id := virtualnetworkpeerings.NewVirtualNetworkPeeringID(subscriptionId, virtualNetworkId.ResourceGroupName, virtualNetworkId.VirtualNetworkName, state.Name)

resp, err := client.Get(ctx, id)
if err != nil {
if response.WasNotFound(resp.HttpResponse) {
return fmt.Errorf("%s was not found", id)
}
return fmt.Errorf("retrieving %s: %+v", id, err)
}

metadata.SetID(id)

if model := resp.Model; model != nil {
if props := model.Properties; props != nil {
state.AllowVirtualNetworkAccess = pointer.From(props.AllowVirtualNetworkAccess)
state.AllowForwardedTraffic = pointer.From(props.AllowForwardedTraffic)
state.AllowGatewayTransit = pointer.From(props.AllowGatewayTransit)
state.OnlyIPv6PeeringEnabled = pointer.From(props.EnableOnlyIPv6Peering)
state.PeerCompleteVnetsEnabled = pointer.From(props.PeerCompleteVnets)
state.UseRemoteGateways = pointer.From(props.UseRemoteGateways)

remoteVirtualNetworkId := ""
if network := props.RemoteVirtualNetwork; network != nil {
parsed, err := commonids.ParseVirtualNetworkIDInsensitively(*network.Id)
if err != nil {
return err
}
remoteVirtualNetworkId = parsed.ID()
}
state.RemoteVirtualNetworkId = remoteVirtualNetworkId
}
}
return metadata.Encode(&state)
},
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package network_test

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check"
)

type VirtualNetworkPeeringDataSource struct{}

func TestAccDataSourceVirtualNetworkPeering_basic(t *testing.T) {
data := acceptance.BuildTestData(t, "data.azurerm_virtual_network_peering", "test-1")
secondResourceName := "data.azurerm_virtual_network_peering.test-2"

r := VirtualNetworkPeeringDataSource{}

data.DataSourceTest(t, []acceptance.TestStep{
{
Config: r.basic(data),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).Key("allow_virtual_network_access").HasValue("true"),
check.That(data.ResourceName).Key("allow_forwarded_traffic").HasValue("false"),
check.That(data.ResourceName).Key("allow_gateway_transit").HasValue("false"),
check.That(data.ResourceName).Key("only_ipv6_peering_enabled").HasValue("false"),
check.That(data.ResourceName).Key("peer_complete_virtual_networks_enabled").HasValue("true"),
check.That(data.ResourceName).Key("use_remote_gateways").HasValue("false"),
check.That(secondResourceName).Key("allow_virtual_network_access").HasValue("true"),
check.That(secondResourceName).Key("allow_forwarded_traffic").HasValue("false"),
check.That(secondResourceName).Key("allow_gateway_transit").HasValue("false"),
check.That(secondResourceName).Key("only_ipv6_peering_enabled").HasValue("false"),
check.That(secondResourceName).Key("peer_complete_virtual_networks_enabled").HasValue("true"),
check.That(secondResourceName).Key("use_remote_gateways").HasValue("false"),
),
},
})
}

func (r VirtualNetworkPeeringDataSource) basic(data acceptance.TestData) string {
return fmt.Sprintf(`
provider "azurerm" {
features {}
}

resource "azurerm_resource_group" "test" {
name = "acctestRg-%[1]d"
location = "%[2]s"
}

resource "azurerm_virtual_network" "test-1" {
name = "acctestvnet1-%[1]d"
resource_group_name = azurerm_resource_group.test.name
address_space = ["10.0.1.0/24"]
location = azurerm_resource_group.test.location
}

resource "azurerm_virtual_network" "test-2" {
name = "acctestvnet2-%[1]d"
resource_group_name = azurerm_resource_group.test.name
address_space = ["10.0.2.0/24"]
location = azurerm_resource_group.test.location
}

resource "azurerm_virtual_network_peering" "test-1" {
name = "acctestpeer1to2"
resource_group_name = azurerm_resource_group.test.name
virtual_network_name = azurerm_virtual_network.test-1.name
remote_virtual_network_id = azurerm_virtual_network.test-2.id
allow_virtual_network_access = true
}

resource "azurerm_virtual_network_peering" "test-2" {
name = "acctestpeer2to1"
resource_group_name = azurerm_resource_group.test.name
virtual_network_name = azurerm_virtual_network.test-2.name
remote_virtual_network_id = azurerm_virtual_network.test-1.id
allow_virtual_network_access = true
}

data "azurerm_virtual_network_peering" "test-1" {
name = azurerm_virtual_network_peering.test-1.name
virtual_network_id = azurerm_virtual_network.test-1.id
}

data "azurerm_virtual_network_peering" "test-2" {
name = azurerm_virtual_network_peering.test-2.name
virtual_network_id = azurerm_virtual_network.test-2.id
}
`, data.RandomInteger, data.Locations.Primary)
}
63 changes: 63 additions & 0 deletions website/docs/d/virtual_network_peering.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
---
subcategory: "Network"
layout: "azurerm"
page_title: "Azure Resource Manager: Data Source: azurerm_virtual_network_peering"
description: |-
Gets information about an existing virtual network peering.
---

# Data Source: azurerm_virtual_network_peering

Use this data source to access information about an existing virtual network peering.

## Example Usage

```hcl
data "azurerm_virtual_network" "example" {
name = "vnet01"
resource_group_name = "networking"
}

data "azurerm_virtual_network_peering" "example" {
name = "peer-vnet01-to-vnet02"
virtual_network_id = data.azurerm_virtual_network.example.id
}

output "id" {
value = data.azurerm_virtual_network_peering.example.id
}
```

## Arguments Reference

The following arguments are supported:

* `name` - (Required) The name of this virtual network peering.

* `virtual_network_id` - (Required) The resource ID of the virtual network.

## Attributes Reference

In addition to the Arguments listed above - the following Attributes are exported:

* `id` - The ID of the virtual network peering.

* `allow_forwarded_traffic` - Controls if forwarded traffic from VMs in the remote virtual network is allowed.

* `allow_gateway_transit` - Controls gatewayLinks can be used in the remote virtual network’s link to the local virtual network.

* `allow_virtual_network_access` - Controls if the traffic from the local virtual network can reach the remote virtual network.

* `only_ipv6_peering_enabled` - Specifies whether only IPv6 address space is peered for Subnet peering.

* `peer_complete_virtual_networks_enabled` - Specifies whether complete Virtual Network address space is peered.

* `remote_virtual_network_id` - The full Azure resource ID of the remote virtual network.

* `use_remote_gateways` - Controls if remote gateways can be used on the local virtual network.

## Timeouts

The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/language/resources/syntax#operation-timeouts) for certain actions:

* `read` - (Defaults to 5 minutes) Used when retrieving the virtual network peering.
Loading