Public/Tenant/Get-VergeTenantLayer2Network.ps1

function Get-VergeTenantLayer2Network {
    <#
    .SYNOPSIS
        Retrieves Layer 2 network assignments for a VergeOS tenant.

    .DESCRIPTION
        Get-VergeTenantLayer2Network retrieves the Layer 2 networks that have been
        assigned to a tenant. Layer 2 networks allow tenants direct access to
        parent network segments for bridged connectivity.

    .PARAMETER Tenant
        A tenant object from Get-VergeTenant. Accepts pipeline input.

    .PARAMETER TenantName
        The name of the tenant to get Layer 2 networks for.

    .PARAMETER TenantKey
        The unique key (ID) of the tenant to get Layer 2 networks for.

    .PARAMETER Key
        The unique key of a specific Layer 2 network assignment.

    .PARAMETER Server
        The VergeOS connection to use. Defaults to the current default connection.

    .EXAMPLE
        Get-VergeTenantLayer2Network -TenantName "Customer01"

        Gets all Layer 2 network assignments for the tenant.

    .EXAMPLE
        Get-VergeTenant -Name "Customer01" | Get-VergeTenantLayer2Network

        Gets Layer 2 networks using pipeline input.

    .EXAMPLE
        Get-VergeTenantLayer2Network -Key 42

        Gets a specific Layer 2 network assignment by key.

    .OUTPUTS
        PSCustomObject with PSTypeName 'Verge.TenantLayer2Network'

    .NOTES
        Layer 2 networks provide bridged connectivity between parent and tenant
        networks. Only certain network types can be assigned as Layer 2 networks.
    #>

    [CmdletBinding(DefaultParameterSetName = 'ByTenantName')]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'ByTenant')]
        [PSTypeName('Verge.Tenant')]
        [PSCustomObject]$Tenant,

        [Parameter(Mandatory, Position = 0, ParameterSetName = 'ByTenantName')]
        [string]$TenantName,

        [Parameter(Mandatory, ParameterSetName = 'ByTenantKey')]
        [int]$TenantKey,

        [Parameter(Mandatory, ParameterSetName = 'ByKey')]
        [int]$Key,

        [Parameter()]
        [object]$Server
    )

    begin {
        # Resolve connection
        if (-not $Server) {
            $Server = $script:DefaultConnection
        }
        if (-not $Server) {
            throw [System.InvalidOperationException]::new(
                'Not connected to VergeOS. Use Connect-VergeOS to establish a connection.'
            )
        }
    }

    process {
        # Handle direct key lookup
        if ($PSCmdlet.ParameterSetName -eq 'ByKey') {
            $queryParams = @{
                filter = "`$key eq $Key"
                fields = '$key,tenant,tenant#name as tenant_name,vnet,vnet#name as vnet_name,vnet#type as vnet_type,enabled'
            }

            try {
                $response = Invoke-VergeAPI -Method GET -Endpoint 'tenant_layer2_vnets' -Query $queryParams -Connection $Server

                if ($response) {
                    $output = [PSCustomObject]@{
                        PSTypeName   = 'Verge.TenantLayer2Network'
                        Key          = [int]$response.'$key'
                        TenantKey    = [int]$response.tenant
                        TenantName   = $response.tenant_name
                        NetworkKey   = [int]$response.vnet
                        NetworkName  = $response.vnet_name
                        NetworkType  = $response.vnet_type
                        Enabled      = [bool]$response.enabled
                    }
                    $output | Add-Member -MemberType NoteProperty -Name '_Connection' -Value $Server -Force
                    Write-Output $output
                }
                else {
                    Write-Error -Message "Layer 2 network assignment with key $Key not found." -ErrorId 'Layer2NetworkNotFound'
                }
            }
            catch {
                Write-Error -Message "Failed to get Layer 2 network assignment: $($_.Exception.Message)" -ErrorId 'Layer2NetworkQueryFailed'
            }
            return
        }

        # Resolve tenant based on parameter set
        $targetTenant = switch ($PSCmdlet.ParameterSetName) {
            'ByTenantName' {
                Get-VergeTenant -Name $TenantName -Server $Server
            }
            'ByTenantKey' {
                Get-VergeTenant -Key $TenantKey -Server $Server
            }
            'ByTenant' {
                $Tenant
            }
        }

        foreach ($t in $targetTenant) {
            if (-not $t) {
                continue
            }

            # Build query parameters
            $queryParams = @{
                filter = "tenant eq $($t.Key)"
                fields = '$key,tenant,vnet,vnet#name as vnet_name,vnet#type as vnet_type,enabled'
            }

            try {
                Write-Verbose "Querying Layer 2 networks for tenant '$($t.Name)' from $($Server.Server)"
                $response = Invoke-VergeAPI -Method GET -Endpoint 'tenant_layer2_vnets' -Query $queryParams -Connection $Server

                # Handle both single object and array responses
                $networks = if ($response -is [array]) { $response } else { @($response) }

                foreach ($net in $networks) {
                    # Skip null entries
                    if (-not $net -or -not $net.'$key') {
                        continue
                    }

                    # Create output object
                    $output = [PSCustomObject]@{
                        PSTypeName   = 'Verge.TenantLayer2Network'
                        Key          = [int]$net.'$key'
                        TenantKey    = $t.Key
                        TenantName   = $t.Name
                        NetworkKey   = [int]$net.vnet
                        NetworkName  = $net.vnet_name
                        NetworkType  = $net.vnet_type
                        Enabled      = [bool]$net.enabled
                    }

                    # Add hidden properties for pipeline support
                    $output | Add-Member -MemberType NoteProperty -Name '_Connection' -Value $Server -Force

                    Write-Output $output
                }
            }
            catch {
                Write-Error -Message "Failed to get Layer 2 networks for tenant '$($t.Name)': $($_.Exception.Message)" -ErrorId 'Layer2NetworkQueryFailed'
            }
        }
    }
}