# ADJUST RESOURCEPOOL SCRIPT TO USE RESERVATIONS # BASED UPON: Dynamic resource Pool Calculator by Eric Sloof (esloof@ntpro.nl) http://www.ntpro.nl # ADJUSTED BY: Rob Mokkink rob@mokkinksystems.com #ADD VMWARE PSSNAPIN Add-PSSnapin -Name "VMware.VimAutomation.Core" #FORCE TO LOAD VMWARE POWERSHELL PLUGIN [void] [Reflection.Assembly]::LoadWithPartialName("vmware.vim") #ON ERROR CONTINUE $ErrorActionPreference = "Continue" #SCRIPTVARIABLES $MEMRES = 30 # %OF MEMORY USED FOR RESERVATION $CPURES = 20 # %OF CPU USED FOR RESERVATION $HOSTCPUMHZ = 2931 # AMOUNT OF MHZ PER CPU/CORE ON THE ESX HOST $VCSERVER = "localhost" $ARCHDAYS = 7 $LOGFOLDER = "G:\VM-Automation\RESOURCES" $LFILEOBJ = "respool-*" #---------------------------------------- # MAIN SCRIPT LOGIC DO NOT EDIT BELOW #---------------------------------------- #---------------------------------------------------------- #LOGFILE VARIABLES #---------------------------------------------------------- $date = get-date $yr = $date.Year.ToString() $mo = $date.Month.ToString() $dy = $date.Day.ToString() $logfile = $LOGFOLDER + "\" + "respool-" + $yr + "-" + $mo + "-" + $dy + ".log" #---------------------------------------------------------- #FUNCTION WRITE_LOG #---------------------------------------------------------- Function WRITE_LOG { Param([string]$MESSAGE) $logdate = get-date $logyr = $logdate.Year.ToString() $logmo = $logdate.Month.ToString() $logdy = $logdate.Day.ToString() $loghr = $logdate.Hour.ToString() $logmi = $logdate.Minute.ToString() $logsc = $logdate.Second.ToString() $logstamp = $logyr + "-" + $logmo + "-" + $logdy + " " + $loghr + ":" + $logmi + ":" + $logsc + "`t" + $MESSAGE write-output $logstamp | Out-File $logfile -append } #---------------------------------------------------------- #FUNCTION CLEANUP_LOGS #---------------------------------------------------------- Function CLEANUP_LOGS { $Now = Get-Date $LastWrite = $Now.AddDays(-$ARCHDAYS) $LFILES = get-childitem $LOGFOLDER -include $LFILEOBJ -recurse | where {$_.LastWriteTime -le $LastWrite} if ($LFILES -eq 0 -or $LFILES -eq $Null) { WRITE_LOG "NO OLD LOGFILES TO CLEANUP\DELETE" } else { foreach ($FILE in $LFILES) { remove-item $FILE } } } #CONNECT TO THE VIRTUALCENTER SERVER $Server = Connect-VIServer -Server $VCSERVER #GET ALL THE RESOURCE POOLS EXCEPT THE DEFAULT RESOURCE POOLS #PUT THEM IN AN ARRAY $ARRRESPOOLS = Get-ResourcePool | where-Object {$_.Name -ne "Resources"} #LOOP THROUGH THE POOLS foreach ($POOL in $ARRRESPOOLS) { #SET THE MEM AND CPU COUNTER TO NULL $MEM = 0 $CPU = 0 $CHECKCOUNTER = 0 #GET THE VM'S IN THE POOL $ARRVM = Get-VM -Location $POOL #CHECK IF THERE ARE VM'S IN THE RESOURCEPOOL if ($ARRVM -eq 0 -or $ARRVM -eq $Null) { WRITE_LOG "NO VM'S IN RESOURCEPOOL: $POOL" } else { #CHECK IF THERE ARE NO VM DEPLOYMENT, BECAUSE WE THEN CAN'T foreach ($VM in $ARRVM) { $CHECKSTATE = get-vmguest -vm $VM.name if ($CHECKSTATE.State -eq "Unknown") { $CHECKCOUNTER = $CHECKCOUNTER + 1 } } #GET THE COUNTS FROM THE CHECKCOUNTER if ($CHECKCOUNTER -ne 0) { WRITE_LOG "CAN'T UPDATE RESOURCEPOOL:$POOL BECAUSE THERE ARE ALREADY TASKS RUNNING FOR THIS RESOURCEPOOL" } else { #GET ALL THE VM'S IN THE POOL AND GET ALL THE CPU AND MEMORY RESOURCES foreach ($VM in $ARRVM) { $MyVM = get-view $VM.ID #MEMORY $VMMemReservation = $MyVM.Config.MemoryAllocation.Reservation #CHECK IF THE VM HAS MEMORY RESERVATIONS IF NOT CALCULATE THE NEW VALUES if ($VMMemReservation -eq 0) { #CALCULATE MEM RESERVATION FOR THE VM $MEM = $MEM + ($VM.MemoryMB/100*$MEMRES) } else { $MEM = $MEM + $VMMemReservation } #CPU $VMCPUReservation = $MyVM.Config.CpuAllocation.Reservation #CHECK IF THE VM HAS CPU RESERVATIONS IF NOT CALCULATE THE NEW VALUES if ($VMCPUReservation -eq 0) { #CALCULATE CPU RESERVATION FOR THE VM $CPU = $CPU + ($VM.NumCpu*$HOSTCPUMHZ/100*$CPURES) } else { $CPU = $CPU + $VMCPUReservation } } #ROUND UP THE NUMBERS FOR MEMORY AND CPU $MEM = [int] $MEM $CPU = [int] $CPU #CONFIGURE THE RESOURCEPOOL WITH THE SETTINGS AND TURN OFF EXPANDABLE RESERVATIONS $SETNEW = Set-Resourcepool -Resourcepool $POOL -MemReservationMB ($MEM) -CpuReservationMhz ($CPU) -CpuExpandableReservation $False -MemExpandableReservation $False WRITE_LOG "MEMORY AND CPU ADJUSTED FOR RESOURCEPOOL: $POOL MEMORY NEW IS: $MEM MB CPU NEW IS: $CPU MHZ" } } } #DISCONNECT FROM THE VIRTUALCENTER SERVER Disconnect-viserver -Confirm:$false #CLEANUP LOG FILES CLEANUP_LOGS