-
Notifications
You must be signed in to change notification settings - Fork 489
/
VSANVMThickSwap.ps1
61 lines (56 loc) · 2.35 KB
/
VSANVMThickSwap.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Function Get-VSANVMThickSwap {
<#
.NOTES
===========================================================================
Created by: William Lam
Organization: VMware
Blog: www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.DESCRIPTION
This function demonstrates the use of vSAN Management API to retrieve
all VMs that have "thick" provisioned VM Swap
.PARAMETER Cluster
The name of a vSAN Cluster
.EXAMPLE
Get-VSANVMThickSwap -Cluster VCSA-Cluster
#>
param(
[Parameter(Mandatory=$true)][String]$Cluster
)
# Scope query within vSAN/vSphere Cluster
$clusterView = Get-Cluster -Name $Cluster -ErrorAction SilentlyContinue
if($clusterView) {
$clusterMoref = $clusterView.ExtensionData.MoRef
} else {
Write-Host -ForegroundColor Red "Unable to find vSAN Cluster $cluster ..."
break
}
# Retrieve random ESXi host within vSAN/vSphere Cluster to access vSAN Internal System Object
$randomVMhost = $clusterView | Get-VMHost | Get-Random
$vsanIntSys = Get-View ($randomVMhost.ExtensionData.ConfigManager.VsanInternalSystem)
# Create mapping of VMs within vSAN/vSphere Cluster to their associated MoRef
$vmMoRefIdMapping = @{}
$vms = Get-Cluster -Name $Cluster | Get-VM
foreach ($vm in $vms) {
$vmMoRefIdMapping[$vm.ExtensionData.MoRef] = $vm.name
}
# Retrieve all vSAN vmswap objects
$vos = Get-VSANView -Id "VsanObjectSystem-vsan-cluster-object-system"
$results = $vos.VsanQueryObjectIdentities($clusterMoref,$null,'vmswap',$false,$true,$false)
# Process results and look for vmswaps that are "thick" and return array of VM names
$vmsWithThickSwap = @()
foreach ($result in $results.Identities) {
$vsanuuid = $result.uuid
$vmMoref = $result.vm
$vmName = $vmMoRefIdMapping[$vmMoref]
$json = $vsanIntSys.GetVsanObjExtAttrs(@($vsanuuid)) | ConvertFrom-Json
foreach ($line in $json | Get-Member) {
$allocationType = $json.$($line.Name).'Allocation type'
if($allocationType -eq "Zeroed thick") {
$vmsWithThickSwap +=$vmName
}
}
}
$vmsWithThickSwap
}