Public/Vrfs.ps1

#
# Copyright 2020, Alexis La Goutte <alexis dot lagoutte at gmail dot com>
#
# SPDX-License-Identifier: Apache-2.0
#


function Add-ArubaCXVrfs {

    <#
        .SYNOPSIS
        Add Aruba CX Vrf

        .DESCRIPTION
        Add Vrf (name, rd, https, ssh, snmp)

        .EXAMPLE
        Add-ArubaCXVrfs -name MyVRF

        Add Vrf named MyVRF

        .EXAMPLE
        Add-ArubaCXVrfs -name MyVRF -rd 65001:1

        Add Vrf named myVRF with RD 65001:1

        .EXAMPLE
        Add-ArubaCXVrfs -name myVRF -ssh_enable -snmp_enable -https_server

        Add Vrf named MyVRF with ssh, snmp and https enable
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "")]
    Param(
        [Parameter (Mandatory = $true, Position = 1)]
        [string]$name,
        [Parameter (Mandatory = $false)]
        [string]$rd,
        [Parameter (Mandatory = $false)]
        [switch]$https_server,
        [Parameter (Mandatory = $false)]
        [switch]$snmp_enable,
        [Parameter (Mandatory = $false)]
        [switch]$ssh_enable,
        [Parameter (Mandatory = $False)]
        [ValidateNotNullOrEmpty()]
        [PSObject]$connection = $DefaultArubaCXConnection
    )

    Begin {
    }

    Process {

        $uri = "system/vrfs"

        $_vrf = new-Object -TypeName PSObject

        $_vrf | add-member -name "name" -membertype NoteProperty -Value $name

        if ( $PsBoundParameters.ContainsKey('rd') ) {
            $_vrf | add-member -name "rd" -membertype NoteProperty -Value $rd
        }

        if ( $PsBoundParameters.ContainsKey('https_server') ) {
            if ($https_server) {
                $_vrf | add-member -name "https_server" -membertype NoteProperty -Value @{"enable" = $True }
            }
            else {
                $_vrf | add-member -name "https_server" -membertype NoteProperty -Value @{ }
            }
        }

        if ( $PsBoundParameters.ContainsKey('snmp_enable') ) {
            if ($snmp_enable) {
                $_vrf | add-member -name "snmp_enable" -membertype NoteProperty -Value $true
            }
            else {
                $_vrf | add-member -name "snmp_enable" -membertype NoteProperty -Value $false
            }
        }

        if ( $PsBoundParameters.ContainsKey('ssh_enable') ) {
            if ($ssh_enable) {
                $_vrf | add-member -name "ssh_enable" -membertype NoteProperty -Value $true
            }
            else {
                $_vrf | add-member -name "ssh_enable" -membertype NoteProperty -Value $false
            }
        }
        $response = Invoke-ArubaCXRestMethod -uri $uri -method 'POST' -body $_vrf -connection $connection
        $response

        Get-ArubaCXVrfs -name $name -connection $connection
    }

    End {
    }
}

function Get-ArubaCXVrfs {

    <#
        .SYNOPSIS
        Get list of all Aruba CX Vrf

        .DESCRIPTION
        Get list of all Aruba CX Vrf (name, rd, https, ssh, snmp)

        .EXAMPLE
        Get-ArubaCXVrfs

        Get list of all Vrf (name, rd, https, ssh, snmp.)

        .EXAMPLE
        Get-ArubaCXVrfs -name MyVrf

        Get Vrf named MyVrf
    #>


    [CmdletBinding(DefaultParametersetname = "Default")]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "")]
    Param(
        [Parameter (Mandatory = $false, ParameterSetName = "name", position = "1")]
        [string]$name,
        [Parameter(Mandatory = $false)]
        [ValidateRange(1, 4)]
        [Int]$depth,
        [Parameter(Mandatory = $false)]
        [ValidateSet("configuration", "status", "statistics", "writable")]
        [String]$selector,
        [Parameter(Mandatory = $false)]
        [String[]]$attributes,
        [Parameter(Mandatory = $false)]
        [switch]$vsx_peer,
        [Parameter (Mandatory = $False)]
        [ValidateNotNullOrEmpty()]
        [PSObject]$connection = $DefaultArubaCXConnection
    )

    Begin {
    }

    Process {


        $invokeParams = @{ }
        if ( $PsBoundParameters.ContainsKey('depth') ) {
            $invokeParams.add( 'depth', $depth )
        }
        if ( $PsBoundParameters.ContainsKey('selector') ) {
            #You need to specify a vrf for use writable selector (it is not possible to use on collections...)
            if ($PSCmdlet.ParameterSetName -eq "Default" -and $selector -eq "writable") {
                Throw "You need to specify a vrf to use writable selector"
            }
            $invokeParams.add( 'selector', $selector )
        }
        if ( $PsBoundParameters.ContainsKey('attributes') ) {
            $invokeParams.add( 'attributes', $attributes )
        }
        if ( $PsBoundParameters.ContainsKey('vsx_peer') ) {
            $invokeParams.add( 'vsx_peer', $true )
        }

        $uri = "system/vrfs"

        # you can directly filter by name
        if ( $PsBoundParameters.ContainsKey('name') ) {
            $uri += "/$name"
        }

        $response = Invoke-ArubaCXRestMethod -uri $uri -method 'GET' -connection $connection @invokeParams

        #Add id parameter when use writable type selector
        if ( $PsBoundParameters.ContainsKey('selector') -and $selector -eq "writable" ) {
            $response | add-member -name "name" -membertype NoteProperty -Value $name
        }

        $response
    }

    End {
    }
}

function Set-ArubaCXVrfs {

    <#
        .SYNOPSIS
        Configure Aruba CX Vrf

        .DESCRIPTION
        Configure Vrf (name, rd, https, ssh, snmp)

        .EXAMPLE
        Get-ArubaCXVrfs -name MyVrf | Set-ArubaCXVrfs -rd 65001:01

        Configure RD on VRF MyVrf

        .EXAMPLE
        Get-ArubaCXVrfs -name MyVrf | Set-ArubaCXVrfs -https_server -ssh_enable:$false -snmp_enable:$false

        Configure https_server (enable) and ssh/snmp (disable) on VRF MyVrf

        .EXAMPLE
        $vrf = Get-ArubaCXVrfs -name MyVRF -selector writable
        PS> $vrf.ssh_enable = $true
        PS> $vrf | Set-ArubaCXVrfs -use_pipeline

        Configure Vrf myVRF name using pipeline (can be only with selector equal writable)
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'medium')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "")]
    Param(
        [Parameter (Mandatory = $true, ParameterSetName = "name")]
        [string]$name,
        [Parameter (Mandatory = $true, ValueFromPipeline = $true, Position = 1, ParameterSetName = "vrf")]
        [ValidateScript( { Confirm-ArubaCXVrfs $_ })]
        [psobject]$vrf,
        [Parameter (Mandatory = $false)]
        [string]$rd,
        [Parameter (Mandatory = $false)]
        [switch]$https_server,
        [Parameter (Mandatory = $false)]
        [switch]$snmp_enable,
        [Parameter (Mandatory = $false)]
        [switch]$ssh_enable,
        [Parameter (Mandatory = $false)]
        [switch]$use_pipeline,
        [Parameter (Mandatory = $False)]
        [ValidateNotNullOrEmpty()]
        [PSObject]$connection = $DefaultArubaCXConnection
    )

    Begin {
    }

    Process {

        #get vrf id from vrf ps object
        if ($vrf) {
            $name = $vrf.name
        }

        $uri = "system/vrfs/${name}"

        if ($use_pipeline) {
            $_vrf = $vrf
        }
        else {
            $_vrf = Get-ArubaCXVrfs -name $name -selector writable -connection $connection
        }

        #Remove name from vrf (can not be modified)
        $_vrf.psobject.Properties.remove("name")

        if ( $PsBoundParameters.ContainsKey('rd') ) {
            $_vrf.rd = $rd
        }

        if ( $PsBoundParameters.ContainsKey('https_server') ) {
            if ($https_server) {
                $_vrf.https_server = @{"enable" = $true }
            }
            else {
                $_vrf.https_server = @{ }
            }
        }

        if ( $PsBoundParameters.ContainsKey('snmp_enable') ) {
            if ($snmp_enable) {
                $_vrf.snmp_enable = $true
            }
            else {
                $_vrf.snmp_enable = $false
            }
        }

        if ( $PsBoundParameters.ContainsKey('ssh_enable') ) {
            if ($ssh_enable) {
                $_vrf.ssh_enable = $true
            }
            else {
                $_vrf.ssh_enable = $false
            }
        }

        if ($PSCmdlet.ShouldProcess($id, 'Configure Vrf Settings')) {
            $response = Invoke-ArubaCXRestMethod -uri $uri -method 'PUT' -body $_vrf -connection $connection
            $response
        }

        Get-ArubaCXVrfs -name $name -connection $connection
    }

    End {
    }
}

function Remove-ArubaCXVrfs {

    <#
        .SYNOPSIS
        Remove a Vrf on Aruba CX Switch

        .DESCRIPTION
        Remove a Vrf on Aruba CX Switch

        .EXAMPLE
        $vrf = Get-ArubaCXVrfs -name MyVrf
        PS C:\>$vrf | Remove-ArubaCXVrfs

        Remove Vrf named MyVrf

        .EXAMPLE
        Remove-ArubaCXVrfs -name MyVrf -confirm:$false

        Remove Vrf named MyVrf with no confirmation
    #>


    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'high')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "")]
    Param(
        [Parameter (Mandatory = $true, ParameterSetName = "name")]
        [string]$name,
        [Parameter (Mandatory = $true, ValueFromPipeline = $true, Position = 1, ParameterSetName = "vrf")]
        [ValidateScript( { Confirm-ArubaCXVrfs $_ })]
        [psobject]$vrf,
        [Parameter (Mandatory = $False)]
        [ValidateNotNullOrEmpty()]
        [PSObject]$connection = $DefaultArubaCXConnection
    )

    Begin {
    }

    Process {

        #get vrf id from vrf ps object
        if ($vrf) {
            $name = $vrf.name
        }

        $uri = "system/vrfs/${name}"

        if ($PSCmdlet.ShouldProcess("Vrf", "Remove Vrf ${name}")) {
            Write-Progress -activity "Remove Vrf"
            Invoke-ArubaCXRestMethod -method "DELETE" -uri $uri -connection $connection
            Write-Progress -activity "Remove Vrf" -completed
        }
    }

    End {
    }
}