Created
January 14, 2025 20:16
-
-
Save recklessop/23b4507241a09f6369c5e3d325a3df0f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################ | |
# 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