Src/Private/Report/Get-AbrAzVirtualNetworkGateway.ps1

function Get-AbrAzVirtualNetworkGateway {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve Azure Virtual Network Gateway information
    .DESCRIPTION
        Documents the configuration of Azure Virtual Network Gateways including gateway type,
        SKU, BGP settings, active-active mode, and VPN connections.
    .NOTES
        Version: 0.1.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    .EXAMPLE
 
    .LINK
 
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrAzVirtualNetworkGateway
        Write-PScriboMessage ($LocalizedData.InfoLevel -f $InfoLevel.VirtualNetworkGateway)
    }

    process {
        try {
            if ($InfoLevel.VirtualNetworkGateway -ge 1) {
                $AzVNetGateways = Get-AzResource -ResourceType 'Microsoft.Network/virtualNetworkGateways' -ErrorAction SilentlyContinue |
                    ForEach-Object { Get-AzVirtualNetworkGateway -Name $_.Name -ResourceGroupName $_.ResourceGroupName } |
                    Sort-Object Name
                if ($AzVNetGateways) {
                    Write-PScriboMessage $LocalizedData.Collecting
                    Section -Style Heading4 $LocalizedData.Heading {
                        if ($Options.ShowSectionInfo) {
                            Paragraph $LocalizedData.SectionInfo
                            BlankLine
                        }

                        # Pre-collect all connections in the subscription for InfoLevel 2 detail
                        $ConnectionsMap = @{}
                        if ($InfoLevel.VirtualNetworkGateway -ge 2) {
                            $AllConnections = Get-AzResource -ResourceType 'Microsoft.Network/connections' -ErrorAction SilentlyContinue |
                                ForEach-Object { Get-AzVirtualNetworkGatewayConnection -Name $_.Name -ResourceGroupName $_.ResourceGroupName -ErrorAction SilentlyContinue }
                            foreach ($AzVNetGateway in $AzVNetGateways) {
                                $ConnectionsMap[$AzVNetGateway.Name] = $AllConnections | Where-Object { $_.VirtualNetworkGateway1.Id -eq $AzVNetGateway.Id }
                            }
                        }

                        $LockMap = @{}
                        $AllLocks = Get-AzResourceLock -ErrorAction SilentlyContinue
                        foreach ($Lock in $AllLocks) {
                            $Key = $Lock.ResourceId.ToLower()
                            if (-not $LockMap.ContainsKey($Key)) { $LockMap[$Key] = @() }
                            $LockMap[$Key] += $Lock
                        }

                        $AzVNetGatewayInfo = @()
                        foreach ($AzVNetGateway in $AzVNetGateways) {
                            $VirtualNetwork = if ($AzVNetGateway.IpConfigurations -and $AzVNetGateway.IpConfigurations[0].Subnet.Id) {
                                ($AzVNetGateway.IpConfigurations[0].Subnet.Id).split('/')[8]
                            } else {
                                $LocalizedData.None
                            }
                            $InObj = [Ordered]@{
                                $LocalizedData.Name              = $AzVNetGateway.Name
                                $LocalizedData.ResourceGroup     = $AzVNetGateway.ResourceGroupName
                                $LocalizedData.Location          = $AzLocationLookup."$($AzVNetGateway.Location)"
                                $LocalizedData.Subscription      = "$($AzSubscriptionLookup.(($AzVNetGateway.Id).split('/')[2]))"
                                $LocalizedData.SubscriptionID    = ($AzVNetGateway.Id).split('/')[2]
                                $LocalizedData.VirtualNetwork    = $VirtualNetwork
                                $LocalizedData.GatewayType       = $AzVNetGateway.GatewayType
                                $LocalizedData.VpnType           = if ($AzVNetGateway.GatewayType -eq 'Vpn') { $AzVNetGateway.VpnType } else { $LocalizedData.NotApplicable }
                                $LocalizedData.SKU               = $AzVNetGateway.Sku.Name
                                $LocalizedData.Generation        = if ($AzVNetGateway.VpnGatewayGeneration -and $AzVNetGateway.VpnGatewayGeneration -ne 'None') { $AzVNetGateway.VpnGatewayGeneration } else { $LocalizedData.NotApplicable }
                                $LocalizedData.ActiveActive      = $AzVNetGateway.ActiveActive
                                $LocalizedData.EnableBgp         = $AzVNetGateway.EnableBgp
                                $LocalizedData.BgpAsn            = if ($AzVNetGateway.EnableBgp) { $AzVNetGateway.BgpSettings.Asn } else { $LocalizedData.NotApplicable }
                                $LocalizedData.BgpPeeringAddress = if ($AzVNetGateway.EnableBgp) { $AzVNetGateway.BgpSettings.BgpPeeringAddress } else { $LocalizedData.NotApplicable }
                                $LocalizedData.ProvisioningState = $AzVNetGateway.ProvisioningState
                            }

                            $InObj[$LocalizedData.Locks] = $(
                                $rl = $LockMap[$AzVNetGateway.Id.ToLower()]
                                if ($rl) { ($rl | ForEach-Object { "$($_.Name) ($($_.Properties.Level))" }) -join [Environment]::NewLine }
                                else { $LocalizedData.None }
                            )

                            if ($Options.ShowTags) {
                                $InObj[$LocalizedData.Tags] = if ($null -eq $AzVNetGateway.Tag -or $AzVNetGateway.Tag.Count -eq 0) {
                                    $LocalizedData.None
                                } else {
                                    ($AzVNetGateway.Tag.Keys | ForEach-Object { "$_`:`t$($AzVNetGateway.Tag[$_])" }) -join [Environment]::NewLine
                                }
                            }

                            $AzVNetGatewayInfo += [PSCustomObject]$InObj
                        }

                        if ($Healthcheck.VirtualNetworkGateway.ProvisioningState) {
                            $AzVNetGatewayInfo | Where-Object { $_.$($LocalizedData.ProvisioningState) -ne 'Succeeded' } | Set-Style -Style Critical -Property $LocalizedData.ProvisioningState
                        }

                        if ($InfoLevel.VirtualNetworkGateway -ge 2) {
                            Paragraph ($LocalizedData.ParagraphDetail -f $AzSubscription.Name)
                            foreach ($AzVNetGateway in $AzVNetGatewayInfo) {
                                Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzVNetGateway.($LocalizedData.Name))" {
                                    $TableParams = @{
                                        Name         = "$($LocalizedData.TableHeading) - $($AzVNetGateway.($LocalizedData.Name))"
                                        List         = $true
                                        ColumnWidths = 40, 60
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $AzVNetGateway | Table @TableParams

                                    $AzGatewayName = $AzVNetGateway.($LocalizedData.Name)
                                    $Connections = $ConnectionsMap[$AzGatewayName]
                                    if ($Connections) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.Connections {
                                            $ConnectionInfo = @()
                                            foreach ($Connection in $Connections) {
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.ConnectionName     = $Connection.Name
                                                    $LocalizedData.ConnectionType     = $Connection.ConnectionType
                                                    $LocalizedData.ConnectionStatus   = if ($Connection.ConnectionStatus) { $Connection.ConnectionStatus } else { $LocalizedData.NotApplicable }
                                                    $LocalizedData.ConnectionProtocol = if ($Connection.ConnectionProtocol) { $Connection.ConnectionProtocol } else { $LocalizedData.NotApplicable }
                                                    $LocalizedData.RoutingWeight      = $Connection.RoutingWeight
                                                    $LocalizedData.EnableBgp          = $Connection.EnableBgp
                                                    $LocalizedData.ProvisioningState  = $Connection.ProvisioningState
                                                }
                                                $ConnectionInfo += [PSCustomObject]$InObj
                                            }

                                            if ($Healthcheck.VirtualNetworkGateway.ConnectionStatus) {
                                                $ConnectionInfo | Where-Object { $_.$($LocalizedData.ConnectionStatus) -notin @('Connected', $LocalizedData.NotApplicable) } | Set-Style -Style Warning -Property $LocalizedData.ConnectionStatus
                                            }

                                            $TableParams = @{
                                                Name         = "$($LocalizedData.Connections) - $($AzGatewayName)"
                                                List         = $false
                                                ColumnWidths = 25, 15, 15, 15, 10, 10, 10
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $ConnectionInfo | Table @TableParams
                                        }
                                    }
                                }
                            }
                        } else {
                            Paragraph ($LocalizedData.ParagraphSummary -f $AzSubscription.Name)
                            BlankLine
                            $TableParams = @{
                                Name         = "$($LocalizedData.TableHeading) - $($AzSubscription.Name)"
                                List         = $false
                                Columns      = $LocalizedData.Name, $LocalizedData.ResourceGroup, $LocalizedData.Location, $LocalizedData.GatewayType, $LocalizedData.SKU, $LocalizedData.ProvisioningState
                                ColumnWidths = 25, 20, 15, 15, 10, 15
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $AzVNetGatewayInfo | Table @TableParams
                        }
                    }
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning "$($LocalizedData.ErrorMessage) $($_.Exception.Message)"
        }
    }

    end {}
}