Public/Get-RubrikHvmFormatReport.ps1

#requires -Version 3
function Get-RubrikHvmFormatReport
{
  <#
      .SYNOPSIS
      Retrieves backup format report on one or more Hyper-V Virtual Machines known to a Rubrik cluster

      .DESCRIPTION
      The Get-RubrikHvmFormatReport cmdlet is used to pull the backup format report from a Rubrik cluster on any number of Hyper-V Virtual Machines.

      .NOTES
      Written by Abhinav Prakash for community usage
      github: ab-prakash

      .LINK
      https://rubrik.gitbook.io/rubrik-sdk-for-powershell/command-documentation/reference/get-rubrikhvmformatreport

      .EXAMPLE
      Get-RubrikHvmFormatReport -Hostname 'Server1'
      This will return backup format report on all Hyper-V Virtual Machines from host "Server1".

      .EXAMPLE
      Get-RubrikHvmFormatReport -Hostname 'Server1' -SLA Gold
      This will return backup format report on all Hyper-V Virtual Machines of "Server1" that are protected by the Gold SLA Domain.

      .EXAMPLE
      Get-RubrikHvmFormatReport -Relic
      This will return backup format report on all removed Hyper-V Virtual Machines that were formerly protected by Rubrik.

      .EXAMPLE
      LatestSnapshotFormat <smb> OR <fastvhdx>
      Get-RubrikHvmFormatReport -LatestSnapshotFormat fastvhdx
      This will return backup format report on all removed Hyper-V Virtual Machines that were formerly protected by Rubrik.

      .EXAMPLE
      Get-RubrikHvmFormatReport -Id HypervVirtualMachine:::205b0b65-b90c-48c5-9cab-66b95ed18c0f
      This will return backup format report for the specified HypervVirtualMachine ID
  #>


  [CmdletBinding()]
  Param(
    # Name of the Hyper-V Virtual Machine
    [Parameter(Position = 0,ValueFromPipelineByPropertyName = $true)]
    [Alias('HypervVirtualMachine')]
    [String]$name,
    # Prefix of Hyper-V Virtual Machine names
    [String]$NamePrefix,
    # Filter results by hostname
    [String]$hostname,
    # Prefix of host names
    [String]$HostnamePrefix,
    # Filter results to include only relic (removed) Hyper-V Virtual Machines
    [Alias('is_relic')]
    [Switch]$Relic,
    # SLA Domain policy assigned to the Hyper-V Virtual Machine
    [String]$SLA,
    # Filter the report information based on the primarycluster_id of the primary Rubrik cluster. Use local as the primary_cluster_id of the Rubrik cluster that is hosting the current REST API session.
    [Alias('primary_cluster_id')]
    [String]$PrimaryClusterID,
    # Hyper-V Virtual Machine id
    [Parameter(ValueFromPipelineByPropertyName = $true)]
    [String]$id,
    # SLA id value
    [Alias('effective_sla_domain_id')]
    [String]$SLAID,
    # Filter the report based on whether the Hyper-V Virtual Machine used fast VHDX format for its latest snapshot.
    [String]$LatestSnapshotFormat,
    # Filter the report based on whether a Hyper-V Virtual Machine is set to take a full snapshot on the next backup.
    [Alias('ForceFull')]
    [Switch]$SetToUpgrade,
    # Rubrik server IP or FQDN
    [String]$Server = $global:RubrikConnection.server,
    # API version
    [String]$api = $global:RubrikConnection.api
  )

  Begin {

    # The Begin section is used to perform one-time loads of data necessary to carry out the function's purpose
    # If a command needs to be run with each iteration or pipeline input, place it in the Process section

    # Check to ensure that a session to the Rubrik cluster exists and load the needed header data for authentication
    Test-RubrikConnection

    # API data references the name of the function
    # For convenience, that name is saved here to $function
    $function = "Get-RubrikHyperVVM"
    $hostFunction = "Get-RubrikHyperVHost"

    # Retrieve all of the URI, method, body, query, result, filter, and success details for the API endpoint
    Write-Verbose -Message "Gather API Data for $function"
    $resources = Get-RubrikAPIData -endpoint $function
    Write-Verbose -Message "Load API data for $($resources.Function)"
    Write-Verbose -Message "Description: $($resources.Description)"

    Write-Verbose -Message "Gather API Data for $hostFunction"
    $hostResources = Get-RubrikAPIData -endpoint $hostFunction
    Write-Verbose -Message "Load API data for $($hostResources.Function)"
    Write-Verbose -Message "Description: $($hostResources.Description)"
  }

  Process {

    #region One-off
    # If SLA paramter defined, resolve SLAID
    If ($SLA) {
      $SLAID = Test-RubrikSLA -SLA $SLA -Inherit $Inherit -DoNotProtect $DoNotProtect
    }
    #endregion

    $uri = New-URIString -server $Server -endpoint ($resources.URI) -id $id
    $uri = Test-QueryParam -querykeys ($resources.Query.Keys) -parameters ((Get-Command $function).Parameters.Values) -uri $uri
    $body = New-BodyString -bodykeys ($resources.Body.Keys) -parameters ((Get-Command $function).Parameters.Values)
    $result = Submit-Request -uri $uri -header $Header -method $($resources.Method) -body $body
    $result = Test-ReturnFormat -api $api -result $result -location $resources.Result
    $result = Test-FilterObject -filter ($resources.Filter) -result $result

    #get HyperV Hosts
    $hostUri = New-URIString -server $Server -endpoint ($hostResources.URI)
    $hostResult = Submit-Request -uri $hostUri -header $Header -method $($hostResources.Method)

    $hvmformatreport = @()

    foreach ($vm in $result) {
      $vmsnapshot = Get-RubrikSnapshot -Latest -id $vm.ID
      if (!$vmsnapshot) {
        continue
      }
      $vmsnapshot | Add-Member NoteProperty VmId $vm.ID
      $hvmformat = $vmsnapshot | Select UsedFastVhdx, FileSizeInBytes
      $hvmformat = $vmsnapshot | Select-Object @{N='ID'; E={$_.VmId}}, @{N='Migrated'; E={$_.usedFastVhdx}}

      $hvmformat | Add-Member NoteProperty VmName $vm.name
      $hvmformat | Add-Member NoteProperty SLADomain $vm.configuredSlaDomainName
      $hvmformat | Add-Member NoteProperty SetToUpgrade $vm.forceFull

      foreach ($host in $hostResult) {
        $vmHostId = -join ("HypervServer:::", $vm.HostId)
        if($host.data.id -eq $vmHostId) {
          $hvmformat | Add-Member NoteProperty HostName $host.data.name
          $hvmformat | Add-Member NoteProperty HostId $host.data.Id
          break
        }
      }
      $hvmformatreport += @($hvmformat)
    }
    if ($NamePrefix) {
      Write-Verbose "Filtering by Hyper-V Virtual Machine name prefix: $NamePrefix"
      $hvmformatreport = $hvmformatreport | Where {$_.VmName -Like "$NamePrefix*"}
    }

    if ($HostnamePrefix) {
      Write-Verbose "Filtering by host name prefix: $HostnamePrefix"
      $hvmformatreport = $hvmformatreport | Where {$_.HostName -Like "$HostnamePrefix*"}
    }

    if ($LatestSnapshotFormat) {
      Write-Verbose "Filtering by latest snapshot format: $LatestSnapshotFormat"
      if ($LatestSnapshotFormat -eq "fastvhdx") {
        $hvmformatreport = $hvmformatreport | Where {$_.Migrated}
      } elseif ($LatestSnapshotFormat -eq "smb") {
        $hvmformatreport = $hvmformatreport | Where {!$_.Migrated}
      } else {
        Write-Output "LatestSnapshotFormat must be <smb> or <fastvhdx>"
        $hvmformatreport = @()
      }

    }

    if ($SetToUpgrade) {
      Write-Verbose "Filtering by whether a Hyper-v Virtual Machine is set to take a full snapshot on the next backup"
      $hvmformatreport = $hvmformatreport | Where-Object {$_.SetToUpgrade}
    }

    return $hvmformatreport
  } # End of process
} # End of function