Skip to content

Instantly share code, notes, and snippets.

@recklessop
Created January 14, 2025 20:16
Show Gist options
  • Save recklessop/23b4507241a09f6369c5e3d325a3df0f to your computer and use it in GitHub Desktop.
Save recklessop/23b4507241a09f6369c5e3d325a3df0f to your computer and use it in GitHub Desktop.
################################################
# Configure the variables below
################################################
# End the directory path with a '\' character #
$ExportDataDir = "C:\temp\"
#$ZertoServer = "10.232.151.43" #CSM Prod
$ZertoServer = "10.162.192.168" #NDC Prod
#$ZertoServer = "10.162.192.169" #NDC Dev
$ZertoPort = "443"
########################################################################################################################
# Nothing to configure below this line - Starting the main function of the script
########################################################################################################################
$ErrorActionPreference = "Stop"
#Gather Username and password for ZVR
$ZertoUser = Read-Host -Prompt "ZVR Username"
$response = Read-host "ZVR Password" -AsSecureString
$ZertoPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($response))
################################################
# Setting certificate exception to prevent authentication issues to the ZVM
################################################
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$VERIFY_CERTIFICATE = false
# Nothing below should need modified for the example to run and list VPGs
$KEYCLOAK_API_BASE = "https://$ZertoServer/auth/realms/zerto/protocol/openid-connect/token"
$ZVM_API_BASE = "https://$ZertoServer/v1/"
# Function to get a token from Keycloak
function Get-Token {
$uri = $KEYCLOAK_API_BASE
$headers = @{
'Content-Type' = 'application/x-www-form-urlencoded'
}
$body = @{
'username' = $ZertoUser
'password' = $ZertoPassword
'grant_type' = 'password'
'client_id' = 'zerto-client'
}
try {
$response = Invoke-RestMethod -Uri $uri -Headers $headers -Method Post -Body $body -SkipCertificateCheck:$VERIFY_CERTIFICATE
return $response.access_token
}
catch {
Write-Log "Error obtaining token: $_" "ERROR"
return $null
}
}
# Nothing below should need modified for the example to run and list VPGs
################################################
# Building Zerto API string and invoking API
################################################
$baseURL = "https://" + $ZertoServer + ":"+$ZertoPort+"/v1/"
# Authenticating with Zerto APIs
$TypeJSON = "application/json"
$TypeXML = "application/xml"
# Extracting x-zerto-session from the response, and adding it to the actual API
# Authenticate to the ZVM
$token = Get-Token
if (-not $token) {
Write-Log "Failed to get token." "ERROR"
return
}
$zertoSessionHeader_JSON = @{
'Content-Type' = 'application/json'
'Authorization' = "Bearer $token",
'Accept' = $TypeJSON
}
$zertoSessionHeader_XML = @{
'Content-Type' = 'application/json'
'Authorization' = "Bearer $token",
'Accept' = $TypeXML
}
################################################
# Creating Arrays for populating ZVM info from the API
################################################
$VPGArray = @()
$VMArray = @()
$VMVolumeArray = @()
$VMNICArray = @()
$AllArray = @()
################################################
# Creating VPGArray, VMArray, VMVolumeArray, VMNICArray
################################################
# URL to create VPG settings
$CreateVPGURL = $baseURL+"vpgSettings"
# Build List of VPGs
$vpgListApiUrl = $baseURL+"vpgs"
$vpgList = Invoke-RestMethod -Uri $vpgListApiUrl -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
# Build List of VMs
$vmListApiUrl = $baseURL+"vms"
$vmList = Invoke-RestMethod -Uri $vmListApiUrl -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
# Select IDs from the API array
$zertoprotectiongrouparray = $vpgList.ArrayOfVpgApi.VpgApi | Select-Object OrganizationName,vpgname,vmscount,vpgidentifier
$vmListarray = $vmList.ArrayOfVmApi.VmApi | select-object *
################################################
# Starting for each VPG action of collecting ZVM VPG data
################################################
foreach ($VPGLine in $zertoprotectiongrouparray)
{
$VPGidentifier = $VPGLine.vpgidentifier
$VPGOrganization = $VPGLine.OrganizationName
$VPGVMCount = $VPGLine.VmsCount
$JSON =
"{
""VpgIdentifier"":""$VPGidentifier""
}"
################################################
# Posting the VPG JSON Request to the API
################################################
Try
{
$VPGSettingsIdentifier = Invoke-RestMethod -Method Post -Uri $CreateVPGURL -Body $JSON -ContentType $TypeJSON -Headers $zertoSessionHeader_JSON
$ValidVPGSettingsIdentifier = $true
}
Catch {
$ValidVPGSettingsIdentifier = $false
}
################################################
# Getting VPG settings from API
################################################
# Skipping if unable to obtain valid VPG setting identifier
if ($ValidVPGSettingsIdentifier -eq $true)
{
$VPGSettingsURL = $baseURL+"vpgSettings/"+$VPGSettingsIdentifier
$VPGSettings = Invoke-RestMethod -Uri $VPGSettingsURL -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting recovery site ID (needed anyway for network settings)
$VPGRecoverySiteIdentifier = $VPGSettings.Basic.RecoverySiteIdentifier
# Getting site info
$VISitesURL = $baseURL+"virtualizationsites"
$VISitesCMD = Invoke-RestMethod -Uri $VISitesURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting network info
$VINetworksURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/networks"
$VINetworksCMD = Invoke-RestMethod -Uri $VINetworksURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting datastore info
$VIDatastoresURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/datastores"
$VIDatastoresCMD = Invoke-RestMethod -Uri $VIDatastoresURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting datastore cluster info
$VIDatastoreClustersURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/datastoreclusters"
$VIDatastoreClustersCMD = Invoke-RestMethod -Uri $VIDatastoreClustersURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting folder info
$VIFoldersURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/folders"
$VIFoldersCMD = Invoke-RestMethod -Uri $VIFoldersURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting cluster info
$VIClustersURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/hostclusters"
$VIClustersCMD = Invoke-RestMethod -Uri $VIClustersURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting host info
$VIHostsURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/hosts"
$VIHostsCMD = Invoke-RestMethod -Uri $VIHostsURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting resource pool info
$VIResourcePoolsURL = $baseURL+"virtualizationsites/$VPGRecoverySiteIdentifier/resourcepools"
$VIResourcePoolsCMD = Invoke-RestMethod -Uri $VIResourcePoolsURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting all VPG Settings
$VPGJournalHistoryInHours = $VPGSettings.Basic.JournalHistoryInHours
$VPGName = $VPGSettings.Basic.Name
$VPGPriortiy = $VPGSettings.Basic.Priority
$VPGProtectedSiteIdentifier = $VPGSettings.Basic.ProtectedSiteIdentifier
$VPGRpoInSeconds = $VPGSettings.Basic.RpoInSeconds
$VPGServiceProfileIdentifier = $VPGSettings.Basic.ServiceProfileIdentifier
$VPGTestIntervalInMinutes = $VPGSettings.Basic.TestIntervalInMinutes
$VPGUseWanCompression = $VPGSettings.Basic.UseWanCompression
$VPGZorgIdentifier = $VPGSettings.Basic.ZorgIdentifier
# Getting Boot Group IDs
$VPGBootGroups = $VPGSettings.BootGroups.BootGroups
$VPGBootGroupCount = $VPGSettings.BootGroups.BootGroups.Count
$VPGBootGroupNames = $VPGSettings.BootGroups.BootGroups.Name
$VPGBootGroupDelays = $VPGSettings.BootGroups.BootGroups.BootDelayInSeconds
$VPGBootGroupIdentifiers = $VPGSettings.BootGroups.BootGroups.BootGroupIdentifier
# Getting Journal info
$VPGJournalDatastoreClusterIdentifier = $VPGSettings.Journal.DatastoreClusterIdentifier
$VPGJournalDatastoreIdentifier = $VPGSettings.Journal.DatastoreIdentifier
$VPGJournalHardLimitInMB = $VPGSettings.Journal.Limitation.HardLimitInMB
$VPGJournalHardLimitInPercent = $VPGSettings.Journal.Limitation.HardLimitInPercent
$VPGJournalWarningThresholdInMB = $VPGSettings.Journal.Limitation.WarningThresholdInMB
$VPGJournalWarningThresholdInPercent = $VPGSettings.Journal.Limitation.WarningThresholdInPercent
# Getting Network IDs
$VPGFailoverNetworkID = $VPGSettings.Networks.Failover.Hypervisor.DefaultNetworkIdentifier
$VPGFailoverTestNetworkID = $VPGSettings.Networks.FailoverTest.Hypervisor.DefaultNetworkIdentifier
# Getting recovery info
$VPGDefaultDatastoreIdentifier = $VPGSettings.Recovery.DefaultDatastoreIdentifier
$VPGDefaultFolderIdentifier = $VPGSettings.Recovery.DefaultFolderIdentifier
$VPGDefaultHostClusterIdentifier = $VPGSettings.Recovery.DefaultHostClusterIdentifier
$VPGDefaultHostIdentifier = $VPGSettings.Recovery.DefaultHostIdentifier
$VPGResourcePoolIdentifier = $VPGSettings.Recovery.ResourcePoolIdentifier
# Getting scripting info
$VPGScriptingPreRecovery = $VPGSettings.Scripting.PreRecovery
$VPGScriptingPostRecovery = $VPGSettings.Scripting.PostRecovery
# Getting VM IDs in VPG
$VPGVMIdentifiers = $VPGSettings.VMs.VmIdentifier
################################################
# Translating Zerto IDs from VPG settings to friendly vSphere names
################################################
# Getting site names
$VPGProtectedSiteName = $VISitesCMD | Where-Object {$_.SiteIdentifier -eq $VPGProtectedSiteIdentifier} | select -ExpandProperty VirtualizationSiteName
$VPGRecoverySiteName = $VISitesCMD | Where-Object {$_.SiteIdentifier -eq $VPGRecoverySiteIdentifier} | select -ExpandProperty VirtualizationSiteName
# Getting network names
$VPGFailoverNetworkName = $VINetworksCMD | Where-Object {$_.NetworkIdentifier -eq $VPGFailoverNetworkID} | Select -ExpandProperty VirtualizationNetworkName
$VPGFailoverTestNetworkName = $VINetworksCMD | Where-Object {$_.NetworkIdentifier -eq $VPGFailoverTestNetworkID} | Select -ExpandProperty VirtualizationNetworkName
# Getting datastore cluster name
$VPGJournalDatastoreClusterName = $VIDatastoreClustersCMD | Where-Object {$_.DatastoreClusterIdentifier -eq $VPGJournalDatastoreClusterIdentifier} | select -ExpandProperty DatastoreClusterName
# Getting datastore names
$VPGDefaultDatastoreName = $VIDatastoresCMD | Where-Object {$_.DatastoreIdentifier -eq $VPGDefaultDatastoreIdentifier} | select -ExpandProperty DatastoreName
$VPGJournalDatastoreName = $VIDatastoresCMD | Where-Object {$_.DatastoreIdentifier -eq $VPGJournalDatastoreIdentifier} | select -ExpandProperty DatastoreName
# Getting folder name
$VPGDefaultFolderName = $VIFoldersCMD | Where-Object {$_.FolderIdentifier -eq $VPGDefaultFolderIdentifier} | select -ExpandProperty FolderName
# Getting cluster name
$VPGDefaultHostClusterName = $VIClustersCMD | Where-Object {$_.ClusterIdentifier -eq $VPGDefaultHostClusterIdentifier} | select -ExpandProperty VirtualizationClusterName
# Getting host name
$VPGDefaultHostName = $VIHostsCMD | Where-Object {$_.HostIdentifier -eq $VPGDefaultHostIdentifier} | select -ExpandProperty VirtualizationHostName
# Getting resource pool name
$VPGResourcePoolName = $VIResourcePoolsCMD | Where-Object {$_.ResourcePoolIdentifier -eq $VPGResourcePoolIdentifier} | select -ExpandProperty ResourcepoolName
################################################
# Starting for each VM ID action for collecting ZVM VM data
################################################
foreach ($_ in $VPGVMIdentifiers)
{
$VMIdentifier = $_
# Get VMs settings
$GetVMSettingsURL = $baseURL+"vpgSettings/"+$VPGSettingsIdentifier+"/vms/"+$VMIdentifier
$GetVMSettings = Invoke-RestMethod -Method Get -Uri $GetVMSettingsURL -TimeoutSec 100 -Headers $zertoSessionHeader_JSON -ContentType $TypeJSON
# Getting the VM name and disk usage
$VMNameArray = $vmListarray | where-object {$_.VmIdentifier -eq $VMIdentifier} | Select-Object *
$VMName = $VMNameArray.VmName
$VMProvisionedStorageInMB = $VMNameArray.ProvisionedStorageInMB
$VMUsedStorageInMB = $VMNameArray.UsedStorageInMB
# Setting variables from the API
$VMVolumeCount = $GetVMSettings.Volumes.Count
$VMNICCount = $GetVMSettings.Nics.Count
$VMBootGroupIdentifier = $GetVMSettings.BootGroupIdentifier
$VMJournalDatastoreClusterIdentifier = $GetVMSettings.Journal.DatastoreClusterIdentifier
$VMJournalDatastoreIdentifier = $GetVMSettings.Journal.DatastoreIdentifier
$VMJournalHardLimitInMB = $GetVMSettings.Journal.Limitation.HardLimitInMB
$VMJournalHardLimitInPercent = $GetVMSettings.Journal.Limitation.HardLimitInPercent
$VMJournalWarningThresholdInMB = $GetVMSettings.Journal.Limitation.WarningThresholdInMB
$VMJournalWarningThresholdInPercent = $GetVMSettings.Journal.Limitation.WarningThresholdInPercent
$VMDatastoreClusterIdentifier = $GetVMSettings.Recovery.DatastoreClusterIdentifier
$VMDatastoreIdentifier = $GetVMSettings.Recovery.DatastoreIdentifier
$VMFolderIdentifier = $GetVMSettings.Recovery.FolderIdentifier
$VMHostClusterIdentifier = $GetVMSettings.Recovery.HostClusterIdentifier
$VMHostIdentifier = $GetVMSettings.Recovery.HostIdentifier
$VMResourcePoolIdentifier = $GetVMSettings.Recovery.ResourcePoolIdentifier
################################################
# Translating Zerto IDs from VM settings to friendly vSphere names
################################################
# Getting boot group
$VMBootGroupName = $VPGBootGroups | Where-Object {$_.BootGroupIdentifier -eq $VMBootGroupIdentifier} | select -ExpandProperty Name
$VMBootGroupDelay = $VPGBootGroups | Where-Object {$_.BootGroupIdentifier -eq $VMBootGroupIdentifier} | select -ExpandProperty BootDelayInSeconds
# Getting datastore cluster name
$VMJournalDatastoreClusterName = $VIDatastoreClustersCMD | Where-Object {$_.DatastoreClusterIdentifier -eq $VMJournalDatastoreClusterIdentifier} | select -ExpandProperty DatastoreClusterName
$VMDatastoreClusterName = $VIDatastoreClustersCMD | Where-Object {$_.DatastoreClusterIdentifier -eq $VMDatastoreClusterIdentifier} | select -ExpandProperty DatastoreClusterName
# Getting datastore name
$VMJournalDatastoreName = $VIDatastoresCMD | Where-Object {$_.DatastoreIdentifier -eq $VMJournalDatastoreIdentifier} | select -ExpandProperty DatastoreName
$VMDatastoreName = $VIDatastoresCMD | Where-Object {$_.DatastoreIdentifier -eq $VMDatastoreIdentifier} | select -ExpandProperty DatastoreName
# Getting folder name
$VMFolderName = $VIFoldersCMD | Where-Object {$_.FolderIdentifier -eq $VMFolderIdentifier} | select -ExpandProperty FolderName
# Getting cluster name
$VMHostClusterName = $VIClustersCMD | Where-Object {$_.ClusterIdentifier -eq $VMHostClusterIdentifier} | select -ExpandProperty VirtualizationClusterName
# Getting host name
$VMHostName = $VIHostsCMD | Where-Object {$_.HostIdentifier -eq $VMHostIdentifier} | select -ExpandProperty VirtualizationHostName
# Getting resource pool name
$VMResourcePoolName = $VIResourcePoolsCMD | Where-Object {$_.ResourcePoolIdentifier -eq $VMResourcePoolIdentifier} | select -ExpandProperty ResourcepoolName
################################################
# Adding all VM setting info to $VMArray
################################################
$AllArrayLine = new-object PSObject
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGName" -Value $VPGName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGidentifier" -Value $VPGidentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGOrganization" -Value $VPGOrganization
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGVMCount" -Value $VPGVMCount
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGPriortiy" -Value $VPGPriortiy
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGProtectedSiteName" -Value $VPGProtectedSiteName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGProtectedSiteIdentifier" -Value $VPGProtectedSiteIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGRecoverySiteName" -Value $VPGRecoverySiteName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGRecoverySiteIdentifier" -Value $VPGRecoverySiteIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGRpoInSeconds" -Value $VPGRpoInSeconds
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGServiceProfileIdentifier" -Value $VPGServiceProfileIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGTestIntervalInMinutes" -Value $VPGTestIntervalInMinutes
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGUseWanCompression" -Value $VPGUseWanCompression
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGZorgIdentifier" -Value $VPGZorgIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGBootGroupCount" -Value $VPGBootGroupCount
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGBootGroupNames" -Value $VPGBootGroupNames
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGBootGroupDelays" -Value $VPGBootGroupDelays
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGBootGroupIdentifiers" -Value $VPGBootGroupIdentifiers
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalHistoryInHours" -Value $VPGJournalHistoryInHours
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalDatastoreClusterName" -Value $VPGJournalDatastoreClusterName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalDatastoreClusterIdentifier" -Value $VPGJournalDatastoreClusterIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalDatastoreName" -Value $VPGJournalDatastoreName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalDatastoreIdentifier" -Value $VPGJournalDatastoreIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalHardLimitInMB" -Value $VPGJournalHardLimitInMB
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalHardLimitInPercent" -Value $VPGJournalHardLimitInPercent
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalWarningThresholdInMB" -Value $VPGJournalWarningThresholdInMB
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGJournalWarningThresholdInPercent" -Value $VPGJournalWarningThresholdInPercent
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGFailoverNetworkName" -Value $VPGFailoverNetworkName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGFailoverNetworkID" -Value $VPGFailoverNetworkID
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGFailoverTestNetworkName" -Value $VPGFailoverTestNetworkName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGFailoverTestNetworkID" -Value $VPGFailoverTestNetworkID
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultDatastoreName" -Value $VPGDefaultDatastoreName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultDatastoreIdentifier" -Value $VPGDefaultDatastoreIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultFolderName" -Value $VPGDefaultFolderName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultFolderIdentifier" -Value $VPGDefaultFolderIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultHostClusterName" -Value $VPGDefaultHostClusterName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultHostClusterIdentifier" -Value $VPGDefaultHostClusterIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultHostName" -Value $VPGDefaultHostName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGDefaultHostIdentifier" -Value $VPGDefaultHostIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGResourcePoolName" -Value $VPGResourcePoolName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGResourcePoolIdentifier" -Value $VPGResourcePoolIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGScriptingPreRecovery" -Value $VPGScriptingPreRecovery
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VPGScriptingPostRecovery" -Value $VPGScriptingPostRecovery
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMName" -Value $VMName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMIdentifier" -Value $VMIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICCount" -Value $VMNICCount
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeCount" -Value $VMVolumeCount
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMProvisionedStorageInMB" -Value $VMProvisionedStorageInMB
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMUsedStorageInMB" -Value $VMUsedStorageInMB
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMBootGroupName" -Value $VMBootGroupName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMBootGroupDelay" -Value $VMBootGroupDelay
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMBootGroupIdentifier" -Value $VMBootGroupIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMJournalDatastoreClusterName" -Value $VMJournalDatastoreClusterName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMJournalDatastoreClusterIdentifier" -Value $VMJournalDatastoreClusterIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMJournalDatastoreName" -Value $VMJournalDatastoreName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMJournalDatastoreIdentifier" -Value $VMJournalDatastoreIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMJournalHardLimitInMB" -Value $VMJournalHardLimitInMB
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMJournalHardLimitInPercent" -Value $VMJournalHardLimitInPercent
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMDatastoreClusterName" -Value $VMDatastoreClusterName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMDatastoreClusterIdentifier" -Value $VMDatastoreClusterIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMDatastoreName" -Value $VMDatastoreName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMDatastoreIdentifier" -Value $VMDatastoreIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMFolderName" -Value $VMFolderName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMFolderIdentifier" -Value $VMFolderIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMHostClusterName" -Value $VMHostClusterName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMHostClusterIdentifier" -Value $VMHostClusterIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMHostName" -Value $VMHostName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMHostIdentifier" -Value $VMHostIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMResourcePoolName" -Value $VMResourcePoolName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMResourcePoolIdentifier" -Value $VMResourcePoolIdentifier
################################################
# Get VM Volume settings for the current VPG
################################################
$GetVMSettingVolumesURL = $baseURL+"vpgSettings/"+$VPGSettingsIdentifier+"/vms/"+$VMIdentifier+"/volumes"
$GetVMSettingVolumes = Invoke-RestMethod -Method Get -Uri $GetVMSettingVolumesURL -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
$GetVMSettingVolumeIDs = $GetVMSettingVolumes.ArrayOfVpgSettingsVmVolumeApi.VpgSettingsVmVolumeApi | select-object VolumeIdentifier -ExpandProperty VolumeIdentifier
################################################
# Starting for each VM Volume ID action for collecting ZVM VM Volume data
################################################
$I = 1
foreach ($_ in $GetVMSettingVolumeIDs)
{
$VMVolumeID = $_
# Getting API data for volume
$GetVMSettingVolumeURL = $baseURL+"vpgSettings/"+$VPGSettingsIdentifier+"/vms/"+$VMIdentifier+"/volumes/"+$VMVolumeID
$GetVMSettingVolume = Invoke-RestMethod -Method Get -Uri $GetVMSettingVolumeURL -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
# Setting values
$VMVolumeDatastoreClusterIdentifier = $GetVMSettingVolume.VpgSettingsVmVolumeApi.Datastore.DatastoreClusterIdentifier
$VMVolumeDatastoreIdentifier = $GetVMSettingVolume.VpgSettingsVmVolumeApi.Datastore.DatastoreIdentifier
$VMVolumeIsSWAP = $GetVMSettingVolume.VpgSettingsVmVolumeApi.IsSwap
$VMVolumeIsThin = $GetVMSettingVolume.VpgSettingsVmVolumeApi.Datastore.IsThin
# Getting datastore cluster name
$VMVolumeDatastoreClusterName = $VIDatastoreClustersCMD | Where-Object {$_.DatastoreClusterIdentifier -eq $VMVolumeDatastoreClusterIdentifier} | select -ExpandProperty DatastoreClusterName
# Getting datastore name
$VMVolumeDatastoreName = $VIDatastoresCMD | Where-Object {$_.DatastoreIdentifier -eq $VMVolumeDatastoreIdentifier} | select -ExpandProperty DatastoreName
################################################
# Adding all VM Volume setting info to $VMVolumeArray
################################################
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeID_$I" -Value $VMVolumeID
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeIsSWAP_$I" -Value $VMVolumeIsSWAP
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeIsThin_$I" -Value $VMVolumeIsThin
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeDatastoreClusterName_$I" -Value $VMVolumeDatastoreClusterName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeDatastoreClusterIdentifier_$I" -Value $VMVolumeDatastoreClusterIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeDatastoreName_$I" -Value $VMVolumeDatastoreName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMVolumeDatastoreIdentifier_$I" -Value $VMVolumeDatastoreIdentifier
$I++
}
################################################
# Get VM Nic settings for the current VPG
################################################
$GetVMSettingNICsURL = $baseURL+"vpgSettings/"+$VPGSettingsIdentifier+"/vms/"+$VMIdentifier
$GetVMSettingNICs = Invoke-RestMethod -Method Get -Uri $GetVMSettingNICsURL -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
$VMNICIDs = $GetVMSettingNICs.VpgSettingsVmApi.Nics.VpgSettingsVmNicApi| select-object NicIdentifier -ExpandProperty NicIdentifier
################################################
# Starting for each VM NIC ID action for collecting ZVM VM NIC data
################################################
$I = 1
foreach ($_ in $VMNICIDs)
{
$VMNICIdentifier = $_
$GetVMSettingNICURL = $baseURL+"vpgSettings/"+$VPGSettingsIdentifier+"/vms/"+$VMIdentifier+"/nics/"+$VMNICIdentifier
$GetVMSettingNIC = Invoke-RestMethod -Method Get -Uri $GetVMSettingNICURL -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
# Building arrays
$VMSettingNICIDArray1 = $GetVMSettingNIC.VpgSettingsVmNicApi.Failover.Hypervisor
$VMSettingNICIDArray2 = $GetVMSettingNIC.VpgSettingsVmNicApi.Failover.Hypervisor.IpConfig
$VMSettingNICIDArray3 = $GetVMSettingNIC.VpgSettingsVmNicApi.FailoverTest.Hypervisor
$VMSettingNICIDArray4 = $GetVMSettingNIC.VpgSettingsVmNicApi.FailoverTest.Hypervisor.IpConfig
# Setting failover values
$VMNICFailoverDNSSuffix = $VMSettingNICIDArray1.DnsSuffix
$VMNICFailoverNetworkIdentifier = $VMSettingNICIDArray1.NetworkIdentifier
$VMNICFailoverShouldReplaceMacAddress = $VMSettingNICIDArray1.ShouldReplaceMacAddress
$VMNICFailoverGateway = $VMSettingNICIDArray2.Gateway
$VMNIsFailoverDHCP = $VMSettingNICIDArray2.IsDhcp
$VMNICFailoverPrimaryDns = $VMSettingNICIDArray2.PrimaryDns
$VMNICFailoverSecondaryDns = $VMSettingNICIDArray2.SecondaryDns
$VMNICFailoverStaticIp = $VMSettingNICIDArray2.StaticIp
$VMNICFailoverSubnetMask = $VMSettingNICIDArray2.SubnetMask
# Nulling blank content
if ($VMNICFailoverDNSSuffix.nil -eq $true){$VMNICFailoverDNSSuffix = $null}
if ($VMNICFailoverGateway.nil -eq $true){$VMNICFailoverGateway = $null}
if ($VMNICFailoverPrimaryDns.nil -eq $true){$VMNICFailoverPrimaryDns = $null}
if ($VMNICFailoverSecondaryDns.nil -eq $true){$VMNICFailoverSecondaryDns = $null}
if ($VMNICFailoverStaticIp.nil -eq $true){$VMNICFailoverStaticIp = $null}
if ($VMNICFailoverSubnetMask.nil -eq $true){$VMNICFailoverSubnetMask = $null}
# Setting failover test values
$VMNICFailoverTestDNSSuffix = $VMSettingNICIDArray3.DnsSuffix
$VMNICFailoverTestNetworkIdentifier = $VMSettingNICIDArray3.NetworkIdentifier
$VMNICFailoverTestShouldReplaceMacAddress = $VMSettingNICIDArray3.ShouldReplaceMacAddress
$VMNICFailoverTestGateway = $VMSettingNICIDArray4.Gateway
$VMNIsFailoverTestDHCP = $VMSettingNICIDArray4.IsDhcp
$VMNICFailoverTestPrimaryDns = $VMSettingNICIDArray4.PrimaryDns
$VMNICFailoverTestSecondaryDns = $VMSettingNICIDArray4.SecondaryDns
$VMNICFailoverTestStaticIp = $VMSettingNICIDArray4.StaticIp
$VMNICFailoverTestSubnetMask = $VMSettingNICIDArray4.SubnetMask
# Nulling blank content
if ($VMNICFailoverTestDNSSuffix.nil -eq $true){$VMNICFailoverTestDNSSuffix = $null}
if ($VMNICFailoverTestGateway.nil -eq $true){$VMNICFailoverTestGateway = $null}
if ($VMNICFailoverTestPrimaryDns.nil -eq $true){$VMNICFailoverTestPrimaryDns = $null}
if ($VMNICFailoverTestSecondaryDns.nil -eq $true){$VMNICFailoverTestSecondaryDns = $null}
if ($VMNICFailoverTestStaticIp.nil -eq $true){$VMNICFailoverTestStaticIp = $null}
if ($VMNICFailoverTestSubnetMask.nil -eq $true){$VMNICFailoverTestSubnetMask = $null}
# Mapping Network IDs to Names
$VMNICFailoverNetworkName = $VINetworksCMD | Where-Object {$_.NetworkIdentifier -eq $VMNICFailoverNetworkIdentifier} | Select VirtualizationNetworkName -ExpandProperty VirtualizationNetworkName
$VMNICFailoverTestNetworkName = $VINetworksCMD | Where-Object {$_.NetworkIdentifier -eq $VMNICFailoverTestNetworkIdentifier} | Select VirtualizationNetworkName -ExpandProperty VirtualizationNetworkName
################################################
# Adding all VM NIC setting info to $VMNICArray
################################################
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICIdentifier_$I" -Value $VMNICIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverNetworkName_$I" -Value $VMNICFailoverNetworkName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverNetworkIdentifier_$I" -Value $VMNICFailoverNetworkIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverDNSSuffix_$I" -Value $VMNICFailoverDNSSuffix
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverShouldReplaceMacAddress_$I" -Value $VMNICFailoverShouldReplaceMacAddress
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverGateway_$I" -Value $VMNICFailoverGateway
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverDHCP_$I" -Value $VMNIsFailoverDHCP
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverPrimaryDns_$I" -Value $VMNICFailoverPrimaryDns
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverSecondaryDns_$I" -Value $VMNICFailoverSecondaryDns
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverStaticIp_$I" -Value $VMNICFailoverStaticIp
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverSubnetMask_$I" -Value $VMNICFailoverSubnetMask
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestNetworkName_$I" -Value $VMNICFailoverTestNetworkName
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestNetworkIdentifier_$I" -Value $VMNICFailoverTestNetworkIdentifier
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestDNSSuffix_$I" -Value $VMNICFailoverTestDNSSuffix
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestShouldReplaceMacAddress_$I" -Value $VMNICFailoverTestShouldReplaceMacAddress
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestGateway_$I" -Value $VMNICFailoverTestGateway
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestDHCP_$I" -Value $VMNIsFailoverTestDHCP
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestPrimaryDns_$I" -Value $VMNICFailoverTestPrimaryDns
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestSecondaryDns_$I" -Value $VMNICFailoverTestSecondaryDns
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestStaticIp_$I" -Value $VMNICFailoverTestStaticIp
$AllArrayLine | Add-Member -MemberType NoteProperty -Name "VMNICFailoverTestSubnetMask_$I" -Value $VMNICFailoverTestSubnetMask
$I++
# End of per VM NIC actions below
}
# End of per VM NIC actions above
#
# End of per VM actions below
$AllArray += $AllArrayLine
}
# End of per VM actions above
################################################
# Deleting VPG edit settings ID (same as closing the edit screen on a VPG in the ZVM without making any changes)
################################################
Try
{
Invoke-RestMethod -Method Delete -Uri $VPGSettingsURL -TimeoutSec 100 -Headers $zertoSessionHeader_XML -ContentType $TypeXML
}
Catch [system.exception]
{
}
#
# End of check for valid VPG settings ID below
}
# End of check for valid VPG settings ID above
#
# End of per VPG actions below
}
# End of per VPG actions above
#
################################################
# Showing Results - edit here for export commands etc
################################################
$AllArray = $AllArray | sort-object -property "VMNICCount" -Descending
write-host "All Array:"
$AllArray | fl
# Exporting array to CSV
$AllArray | export-csv $ExportDataDir"11New_ALL-Array_$ZertoServer.csv" -NoTypeInformation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment