Public/transport-nodes.ps1

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

function Get-NSXTTransportNodes {

    <#
        .SYNOPSIS
        Get information about Transport Nodes

        .DESCRIPTION
        Returns information about Transport Nodes

        .EXAMPLE
        Get-NSXTTransportNodes

        Display all Transport Nodes

        .EXAMPLE
        Get-NSXTTransportZones -node_id ede3e69a-6562-49a6-98c4-d23408bd832c

        Display Transport Nodes with node(_id) ede3e69a-6562-49a6-98c4-d23408bd832c

        .EXAMPLE
        Get-NSXTTransportNodes -display_name MyTransportNodes

        Display Transport Nodes with (display) name MyTransportNodes

        .EXAMPLE
        Get-NSXTTransportNodes -transport_zone_id ede3e69a-6562-49a6-98c4-d23408bd832c

        Display Transport Nodes with transport_zone_id ede3e69a-6562-49a6-98c4-d23408bd832c

        .EXAMPLE
        Get-NSXTTransportZones -node_ip 192.0.2.1

        Display Transport Nodes with node IP 192.0.2.1

        .EXAMPLE
        Get-NSXTTransportNodes -in_maintenance_mode

        Display Transport Nodes with maintenance mode

    #>


    [CmdletBinding(DefaultParametersetname = "Default")]
    Param(
        [Parameter(Mandatory = $false, ParameterSetName = "Default")]
        [string]$node_id,
        [Parameter(Mandatory = $false, ParameterSetName = "Default")]
        [string]$node_ip,
        [Parameter(Mandatory = $false, ParameterSetName = "display_name")]
        [string]$display_name,
        [Parameter(Mandatory = $false, ParameterSetName = "Default")]
        [string]$transport_zone_id,
        [Parameter(Mandatory = $false, ParameterSetName = "Default")]
        [switch]$in_maintenance_mode,
        [Parameter(Mandatory = $false)]
        [psobject]$connection = $DefaultNSXTConnection
    )

    Begin {
    }

    Process {

        $uri = 'api/v1/transport-nodes?'

        if ( $PsBoundParameters.ContainsKey('node_id') ) {
            $uri += "&node_id=$node_id"
        }

        if ( $PsBoundParameters.ContainsKey('node_ip') ) {
            $uri += "&node_ip=$node_ip"
        }

        if ( $PsBoundParameters.ContainsKey('transport_zone_id') ) {
            $uri += "&transport_zone_id=$transport_zone_id"
        }

        if ( $PsBoundParameters.ContainsKey('in_maintenance_mode') ) {
            $uri += "&in_maintenance_mode=true"
        }

        $response = Invoke-NSXTRestMethod -uri $uri -method 'GET' -connection $connection

        switch ( $PSCmdlet.ParameterSetName ) {
            "display_name" {
                #When there is a display_name, search on response
                $response.results | Where-Object { $_.display_name -eq $display_name }
            }
            default {
                $response.results
            }
        }

    }

    End {
    }
}

function Move-NSXTTransportNodes {

    <#
        .SYNOPSIS
        Move a VM to a new Logical Port

        .DESCRIPTION
        Move a VM to a new Logical Port
        You need to known the host where it is the VM
        it can use for set init_state to UNBLOCKED_VLAN for VM when use fully Collapsed vSphere Cluster NSX-T (See https://kb.vmware.com/s/article/77284)

        .EXAMPLE
        $lp = Get-NSXTLogicalSwitches -display_name MyLogicalSwitch | Add-NSXTLogicalPorts -display_name MyLogicalPort -init_state UNBLOCKED_VLAN

        PS >$vm = Get-NSXTFabricVirtualMachines -display_name myVM

        PS >Get-NSXTTransportNodes -node_id $vm.host_id | Move-NSXTTransportNodes -vm $vm -lp $lp

        Move myVM to new Logical Port MyLogicalPort (with init_state to unblocked vlan)

    #>


    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'high')]
    Param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateScript( { Confirm-NSXTTransportNodes $_ })]
        [psobject]$tn,
        [Parameter(Mandatory = $true)]
        [ValidateScript( { Confirm-NSXTFabricVirtualMachines $_ })]
        [psobject]$vm,
        [Parameter(Mandatory = $true)]
        [ValidateScript( { Confirm-NSXTLogicalPorts $_ })]
        [psobject]$lp,
        [Parameter(Mandatory = $false)]
        [int]$vnic_number = '0',
        [Parameter(Mandatory = $false)]
        [psobject]$connection = $DefaultNSXTConnection
    )

    Begin {
    }

    Process {

        $tn_id = $tn.id
        $target = "Logical Port " + $lp.display_name + " (host " + $tn.display_name + ")"

        $uri = "api/v1/transport-nodes/" + $tn_id + "?"
        $vnic = $vm.external_id + ":400" + $vnic_number

        $uri += "&vnic=" + $vnic

        $vnic_migration_dest = $lp.attachment.id
        $uri += "&vnic_migration_dest=" + $vnic_migration_dest

        if ($PSCmdlet.ShouldProcess($target, 'Move VM ' + $vm.display_name)) {
            $response = Invoke-NSXTRestMethod -uri $uri -method 'PUT' -body $tn -connection $connection
            $response.results
        }

    }

    End {
    }
}