############ # Get-HAClusterSize # by Hugo Peeters # http://www.peetersonline.nl # Please leave this header intact when distributing # NOTE: rename the file to .ps1 ######## ########### # Variables ########### # Situation specific (adjust values to suit your environment) $VCServerName = "vcserver.domain.local" # The FQDN of your Virtual Center server $ClusterName = "my HA cluster" # The name of the cluster # General (do not modify) $DefaultCPURes = 256 # Default Minimum CPU reservation for HA calculations = 256 MHz $DefaultMemoryRes = 256 # Default Minimum Memory reservation for HA calculations = 256 MB ################## # Script execution ################## If ((Get-PSSnapin VMware.VimAutomation.Core) -eq $null) { Add-PSSnapin VMware.VimAutomation.Core } $VC = Get-VIServer $VCServerName -ErrorAction Stop Write-Progress -Activity "Processing cluster" -Status $ClusterName $Cluster = Get-Cluster $ClusterName $ClusterAdv = Get-View $Cluster.Id $CurrentFailoverLevel = $ClusterAdv.summary.CurrentFailoverLevel $vmCPUMinMHz = ($ClusterAdv.configuration.dasconfig.option | Where {$_.Key -eq "das.vmCpuMinMHz"}).Value If ($vmCPUMinMHz){$MinCPUReservation = $vmCPUMinMHz} Else {$MinCPUReservation = $DefaultCPURes} $vmMemoryMinMB = ($ClusterAdv.configuration.dasconfig.option | Where {$_.Key -eq "vmMemoryMinMB"}).Value If ($vmMemoryMinMB){$MinMemoryReservation = $vmMemoryMinMB} Else {$MinMemoryReservation = $DefaultMemoryRes} # Process VMs Write-Progress -Activity "Processing VMs" -Status "Getting all VMs" $VMs = Get-VM -Location $Cluster | Sort-Object Name $myVMcol = @() $i = 1 $j = $VMs.length ForEach ($VM in $VMs) { Write-Progress -Activity "Processing VMs" -Status $VM.Name -PercentComplete (100*$i/$j) $myVMobj = "" | Select-Object Name, CPUSlot, MemSlot $myVMobj.Name = $VM.Name $VMadv = Get-View $VM.Id If ($VMadv.resourceconfig.cpuallocation.reservation -eq 0){$CPURes = $MinCPUReservation} Else {$CPURes = [math]::Round($VMadv.resourceconfig.cpuallocation.reservation/1000000,0)} If ($VMadv.resourceconfig.memoryallocation.reservation -eq 0){$MemRes = $MinMemoryReservation} Else {$MemRes = [math]::Round(($VMadv.resourceconfig.memoryallocation.reservation / 1MB),0)} $myVMobj.CPUSlot = ($VM.NumCPU * $CPURes) $myVMobj.MemSlot = [math]::Round((($VMadv.runtime.memoryoverhead / 1MB ) + $MemRes),0) $myVMcol += $myVMobj Clear-Variable CPURes Clear-Variable MemRes $i++ } $MaxCPUSlot = ($myVMcol | Sort-Object CPUSlot -Descending | Select-Object -First 1).CPUSlot $MaxMemSlot = ($myVMcol | Sort-Object MemSlot -Descending | Select-Object -First 1).MemSlot # Process VMHosts Write-Progress -Activity "Processing VMHosts" -Status "Getting all VMHosts" $VMHosts = Get-VMHost -Location $Cluster | Sort-Object Name $myVMHostCol = @() $k = 1 $l = $VMHosts.length ForEach ($VMHost in $VMHosts) { Write-Progress -Activity "Processing VMHosts" -Status $VMHost.Name -PercentComplete (100*$k/$l) $myVMHostObj = "" | Select-Object Name, CPU, CPUSlots, Memory, MemSlots $myVMHostObj.Name = $VMHost.Name $VMHostAdv = Get-View $VMHost.Id $myVMHostObj.CPU = [math]::Round(($VMHostAdv.hardware.cpuinfo.numcputhreads * $VMHostAdv.hardware.cpuinfo.hz / 1000000),0) $myVMHostObj.CPUSlots = [math]::Floor($myVMHostObj.CPU / $MaxCPUSlot) $myVMhostObj.Memory = [math]::Round(($VMHostAdv.hardware.memorysize / 1MB),0) $myVMHostObj.MemSlots = [math]::Floor($myVMHostObj.Memory / $MaxMemSlot) $myVMHostCol += $myVMHostObj $k++ } # Calculations $TotalCPUSlots = ($myVMHostCol | Sort-Object CPUSlots | Select-Object -First ($myVMHostCol.Length - $Cluster.HAFailoverLevel) | Measure-Object -Property CPUSlots -Sum).Sum $TotalMemSlots = ($myVMHostCol | Sort-Object MemSlots | Select-Object -First ($myVMHostCol.Length - $Cluster.HAFailoverLevel) | Measure-Object -Property MemSlots -Sum).Sum If ($TotalMemSlots -lt $TotalCPUslots){$capacity = $TotalMemSlots} Else {$capacity = $TotalCPUslots} $available = ($capacity - $VMs.Length) # Output Write-Host "=================================" Write-Host "Your heaviest VM in terms of CPU usage is considered to be:" $myVMcol | Sort-Object CPUSlot,MemSlot -Descending | Select-Object -First 1 | Format-Table -AutoSize Write-Host "Your heaviest VM in terms of Memory usage is considered to be:" $myVMcol | Sort-Object MemSlot -Descending | Select-Object -First 1 | Format-Table -AutoSize Write-Host "Your cluster has the following VMHosts:" $myVMHostCol | Format-Table -AutoSize Write-Host "If you should lose your heaviest VMHost, you would have left:" Write-Host "Number of CPU slots: $TotalCPUSlots" Write-Host "Number of memory slots: $TotalMemSlots" Write-Host "" Write-Host "Your current Failover Level is: $CurrentFailoverLevel VMHosts" Write-Host "You should have room for another $available vms, while maintaining a failover level of" $Cluster.HAFailoverLevel Write-Host ""