Public/Stop-ArmorCompleteVM.ps1

function Stop-ArmorCompleteVM {
    <#
        .SYNOPSIS
        Stops Armor Complete virtual machines.

        .DESCRIPTION
        The specified virtual machine in the Armor Complete account in context will be
        powered down.

        .INPUTS
        System.UInt16

        .INPUTS
        System.Management.Automation.PSObject

        .NOTES
        - Troy Lindsay
        - Twitter: @troylindsay42
        - GitHub: tlindsay42

        .EXAMPLE
        Stop-ArmorCompleteVM -ID 1 -Type Shutdown
        If confirmed, gracefully shutdown the specified Armor Complete VM.

        .EXAMPLE
        2 | Stop-ArmorCompleteVM -Type Poweroff -Confirm:$false
        Power off the Armor Complete VM with ID=2 via pipeline value without prompting
        for confirmation.

        .EXAMPLE
        Get-ArmorVM -ID 3 | Stop-ArmorCompleteVM -Type ForceOff -Confirm:$false
        Break the state of the Armor Complete VM with ID=3 via parameter name in the
        pipeline without prompting for confirmation, so that the VM appears to be
        powered off in the Armor Management Portal (AMP), but is still powered on in
        the Armor Complete cloud.

        .LINK
        https://tlindsay42.github.io/ArmorPowerShell/public/Stop-ArmorCompleteVM/

        .LINK
        https://github.com/tlindsay42/ArmorPowerShell/blob/master/Armor/Public/Stop-ArmorCompleteVM.ps1

        .LINK
        https://docs.armor.com/display/KBSS/Perform+VM+Power+Actions

        .LINK
        https://developer.armor.com/#!/Infrastructure/Vm_PowerActionVm

        .COMPONENT
        Armor Complete

        .FUNCTIONALITY
        Armor Complete infrastructure management
    #>


    [CmdletBinding( SupportsShouldProcess = $true, ConfirmImpact = 'High' )]
    [OutputType( [ArmorVM[]] )]
    [OutputType( [ArmorVM] )]
    param (
        # Specifies the ID of the Armor Complete virtual machine that you want to stop.
        [Parameter(
            Mandatory = $true,
            HelpMessage = 'Please enter the ID of the Armor Complete virtual machine that you want to stop',
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateRange( 1, 65535 )]
        [UInt16]
        $ID,

        <#
        Specifies how you want to stop the Armor Complete virtual machine.

        - Shutdown
          - Initiates a graceful shutdown of the operating system.
          - VMware Tools or open-vm-tools must be installed, running, and in a good
            state for this request to succeed.
          - This is the recommend way to stop your VMs.
        - Poweroff
          - Initiates a hard shutdown of the VM- effectively disconnecting the virtual
            power cord from the VM.
          - This shutdown method has the potential to cause data corruption.
          - This should only be used when necessary.
        - ForceOff
          - Breaks the state of the environment by marking the VM as powered off in
            the Armor Management Portal (AMP), but leaves the VM running in the Armor
            Complete cloud.
          - This should not be used unless recommended by a Senior Armor Support team
            member.
        #>

        [Parameter( Position = 1 )]
        [ValidateSet( 'Shutdown', 'Poweroff', 'ForceOff' )]
        [String]
        $Type = 'Shutdown',

        # Specifies the API version for this request.
        [Parameter( Position = 2 )]
        [ValidateSet( 'v1.0', 'internal' )]
        [String]
        $ApiVersion = $Global:ArmorSession.ApiVersion
    )

    begin {
        $function = $MyInvocation.MyCommand.Name

        Write-Verbose -Message "Beginning: '${function}' with ParameterSetName '$( $PSCmdlet.ParameterSetName )' and Parameters: $( $PSBoundParameters | Out-String )"

        Test-ArmorSession
    }

    process {
        [ArmorVM[]] $return = $null
        $description = ''
        $stopType = $Type

        $resources = Get-ArmorApiData -FunctionName $function -ApiVersion $ApiVersion

        switch ( $Type ) {
            'Shutdown' {
                $description = $resources.Description -f 'Gracefully shutdown'
            }

            'Poweroff' {
                $description = $resources.Description -f 'Power off'
                $stopType = 'Off'
            }

            'ForceOff' {
                $description = ( $resources.Description -f 'Break the state of' ) +
                ' so that the Armor Management Portal (AMP) will indicate that the VM is powered off, but the VM ' +
                'will still be running in the Armor Complete cloud.'
            }
        }

        if ( $PSCmdlet.ShouldProcess( $ID, $description ) ) {
            $uri = New-ArmorApiUri -Endpoints $resources.Endpoints.Where( { $_ -match "/${stopType}$" } ) -IDs $ID

            $keys = ( $resources.Body | Get-Member -MemberType 'NoteProperty' ).Name
            $parameters = ( Get-Command -Name $function ).Parameters.Values
            $body = Format-ArmorApiRequestBody -Keys $keys -Parameters $parameters

            $splat = @{
                Uri         = $uri
                Method      = $resources.Method
                Body        = $body
                SuccessCode = $resources.SuccessCode
            }
            $results = Invoke-ArmorRestMethod @splat

            $return = $results
        }

        $return
    }

    end {
        Write-Verbose -Message "Ending: '${function}'."
    }
}