lib/VirtualMachines.ps1


#region Zerto Virtual Machines

# .ExternalHelp ZertoModule.psm1-help.xml
Function Get-ZertoVM {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false, HelpMessage = 'Zerto Session Name')][String]$ZertoSession = "Default",
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto VPG name')] [string] $VPGName,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto VM name')] [string] $VMName,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto VM Status')] [ZertoVPGStatus] $Status,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto VM Substatus')] [ZertoVPGSubstatus] $SubStatus,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto Protected Site Type')] [ZertoProtectedSiteType] $ProtectedSiteType,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto Recovery Site Type')] [ZertoRecoverySiteType] $RecoverySiteType,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto Protected Site Identifier')] [string] $ProtectedSiteIdentifier,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto Recovery Site Identifier')] [string] $RecoverySiteIdentifier,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto VM Organization Name')] [string] $OrganizationName,
        [Parameter(Mandatory = $false, ParameterSetName = "Filter", HelpMessage = 'Zerto VM Priority')] [ZertoVPGPriority] $Priority,
        [Parameter(Mandatory = $true, ParameterSetName = "ID", HelpMessage = 'Zerto VM Identifier')] [string] $ZertoVMIdentifier
   )

    ## Get Session Configuration
    $ZertoSessionConfig = $global:ZertoSessions[$ZertoSession]
    if (-not $ZertoSessionConfig) {
        Write-Host 'TMSession: [' -NoNewline
        Write-Host $ZertoSession -ForegroundColor Cyan
        Write-Host '] was not Found. Please use the New-ZertoSession command.'
        Throw "Zerto Session Not Found. Use New-TMSession command before using features."
    }

    #Honor SSL Settings
    if ($ZertoSessionConfig.AllowInsecureSSL) {
        $ZertoCertSettings = @{SkipCertificateCheck = $true }
    }
    else {
        $ZertoCertSettings = @{SkipCertificateCheck = $false }
    }

    $baseURL = "https://" + $ZertoSessionConfig.ZertoServer + ":" + $ZertoSessionConfig.ZertoPort + "/v1/"
    $TypeJSON = "application/json"



    switch ($PsCmdlet.ParameterSetName) {
        "ID" {
            if ([string]::IsNullOrEmpty($ZertoVMIdentifier)  ) {
                throw "Missing Zerto VM Identifier"
            }

            $FullURL = $baseURL + "vms/" + $ZertoVMIdentifier
        }
        Default {
            $FullURL = $baseURL + "vms"
            if ($VPGName -or $VMName -or $Status -ne $null -or $Substatus -ne $null -or `
                    $ProtectedSiteType -ne $null -or $RecoverySiteType -ne $null -or $ProtectedSiteIdentifier -or $RecoverySiteIdentifier -or $OrganizationName `
                    -or $Priority -ne $null) {
                $qs = [ordered] @{}
                if ($VPGName) { $qs.Add("vpgName", $VPGName) }
                if ($VMName) { $qs.Add("vmName", $VMName) }
                if ($Status -ne $null) { $qs.Add("status", $Status) }
                if ($Substatus -ne $null) { $qs.Add("substatus", $Substatus) }
                if ($ProtectedSiteType -ne $null) { $qs.Add("protectedSiteType", $ProtectedSiteType) }
                if ($RecoverySiteType -ne $null) { $qs.Add("recoverySiteType", $RecoverySiteType) }
                if ($ProtectedSiteIdentifier) { $qs.Add("ProtectedSiteIdentifier", $ProtectedSiteIdentifier) }
                if ($RecoverySiteIdentifier) { $qs.Add("RecoverySiteIdentifier", $RecoverySiteIdentifier) }
                if ($OrganizationName) { $qs.Add("organizationName", $OrganizationName) }
                if ($Priority -ne $null) { $qs.Add("priority", $Priority) }

                $FullURL += Get-QueryStringFromHashTable -QueryStringHash $QS
            }
        }
    }
    Write-Verbose $FullURL

    try {
        $RestMethodSplat = @{
            Uri         = $FullURL
            TimeoutSec  = 100
            ContentType = $TypeJSON
            Method      = 'GET'
            WebSession  = $ZertoSessionConfig.ZertoWebSession
        }
        $Result = Invoke-RestMethod @RestMethodSplat @ZertoCertSettings
    }
    catch {
        throw $_.Exception.Message
    }
    return $Result
}

# .ExternalHelp ZertoModule.psm1-help.xml
Function Get-ZertoVMID {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false, HelpMessage = 'Zerto Session Name')][String]$ZertoSession = "Default",
        [Parameter(Mandatory = $true, HelpMessage = 'Zerto VM Name')] [string] $VmName
    )

    $ID = Get-ZertoVM -ZertoServer $ZertoServer -ZertoPort $ZertoPort -ZertoToken $ZertoToken | `
        Where-Object { $_.VmName -eq $VmName } | `
        Select-Object VmIdentifier -ExpandProperty VmIdentifier

    if ($ID.Count -gt 1) { Throw "'$VMName' returned more than one ID" }
    if ($ID.Count -eq 0) { Throw "'$VMName' was not found" }

    return $ID.ToString()
}
#endregion