Public/New-Node.ps1

Function New-Node {
<#
.SYNOPSIS
    Create Node(s)
 
.EXAMPLE
    New-Node -Address 192.168.1.42
#>

    [cmdletBinding()]
    param (
        $F5Session=$Script:F5Session,

        [Parameter(Mandatory=$true,ParameterSetName='Address',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [PoshLTM.F5Address[]]$Address,

        [Parameter(Mandatory=$true,ParameterSetName='FQDN',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [string[]]$FQDN,

        [Parameter(Mandatory=$true,ParameterSetName='FQDN',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [ValidateSet('ipv4','ipv6')]
        $AddressType,

        [Parameter(Mandatory=$true,ParameterSetName='FQDN',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [ValidateSet('enabled','disabled')]
        $AutoPopulate,

        [Parameter(Mandatory=$false,ParameterSetName='FQDN',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [int]$Interval=3600,

        [Parameter(Mandatory=$false,ParameterSetName='FQDN',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [int]$DownInterval=5,

        [Alias('ComputerName')]
        [Alias('NodeName')]
        [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
        [string[]]$Name='',

        [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
        [string]$Partition,

        [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
        [string[]]$Description='',

        [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
        [string[]]$Monitor='',

        [switch]$Passthru
    )
    begin {
        #Test that the F5 session is in a valid format
        Test-F5Session($F5Session)

        $URI = ($F5Session.BaseURL + "node")
    }
    process {
        switch($PSCmdLet.ParameterSetName) {
            Address {
                #Process all nodes with IP addresses
                for ([int]$a=0; $a -lt $Address.Count; $a++) {
                    $itemname = $Name[$a]
                    if ([string]::IsNullOrWhiteSpace($itemname)) {
                        $itemname = $Address[$a].ToString()
                    }
                    $newitem = New-F5Item -Name $itemname -Partition $Partition
                    #Check whether the specified node already exists
                    If (Test-Node -F5session $F5Session -Name $newitem.Name -Partition $newitem.Partition){
                        Write-Error "The $($newitem.FullPath) node already exists."
                    } else {
                        #Start building the JSON for the action
                        $JSONBody = @{address=$Address[$a].ToString();name=$newitem.Name;partition=$newitem.Partition;description=$Description[$a];monitor=$($Monitor -join ' and ')} | ConvertTo-Json

                        Invoke-F5RestMethod -Method POST -Uri "$URI" -F5Session $F5Session -Body $JSONBody -ContentType 'application/json' |
                            Out-Null
                        if ($Passthru) {
                            Get-Node -F5Session $F5Session -Name $newitem.Name -Partition $newitem.Partition
                        }
                    }
                }
            }

            FQDN {
                #Process all nodes with fully qualified domain names
                for ([int]$a=0; $a -lt $Name.Count; $a++) {
                    $itemname = $Name[$a].ToString()
                    if ([string]::IsNullOrWhiteSpace($itemname)) {
                        $itemname = $FQDN[$a].ToString()
                    }
                    $newitem = New-F5Item -Name $itemname -Partition $Partition
                    $itemfqdn = $FQDN[$a]
                    #Check whether the specified node already exists
                    If (Test-Node -F5session $F5Session -Name $newitem.Name -Partition $newitem.Partition){
                        Write-Error "The $($newitem.FullPath) node already exists."
                    } else {
                        #Start building the JSON for the action
                        $JSON_FQDN = @{name=$itemfqdn;'address-family'=$AddressType;autopopulate=$AutoPopulate;interval=$Interval;'down-interval'=$DownInterval} # | ConvertTo-Json
                        $JSONBody = @{name=$itemname;fqdn=$JSON_FQDN;partition=$newitem.Partition;description=$Description[$a];monitor=$($Monitor -join ' and ')} | ConvertTo-Json
                        Invoke-F5RestMethod -Method POST -Uri "$URI" -F5Session $F5Session -Body $JSONBody -ContentType 'application/json' |
                            Out-Null
                        if ($Passthru) {
                            Get-Node -F5Session $F5Session -Name $newitem.Name -Partition $newitem.Partition
                        }
                    }
                }
            }
        }
    }
}