So one of the things still missing in the Horizon View vCheck was a plugin that simply gives an overview of all Pools with their status. In short what I am talking about is a translation from this view:

Although this sounds easy there where a lot of challenges for this one. First of all there are three separate pool types: Automated,Manual and RDS and all of them have subtypes like VIEW_COMPOSER,VIRTUAL_CENTER,FULL_CLONES,INSTANT_CLONE_ENGINE,UNMANAGED or RDS and not all of these subtypes are available for all pool types. This gives a lot of options that need to be separated for the pool types. Also the VIRTUAL_CENTER subtype is used for both manually added desktops that reside on a vSphere environment and for an automatic pool creating full clones. The FULL_CLONES subtype I haven’t been able to create in my lab yet.

Further outputs like true, false or any of the subtypes above weren’t clear enough for me to use as output. For this I learned a new trick in my book called switch.

switch ($source) { VIRTUAL_CENTER {$sourceoutput="vCenter Managed Desktop"} FULL_CLONES {$sourceoutput="Full Clones"} VIEW_COMPOSER {$sourceoutput="Linked Clones"} INSTANT_CLONE_ENGINE {$sourceoutput="Instant Clones"} UNMANAGED {$sourceoutput="Non-vCenter Desktops"} RDS {$sourceoutput="RDS Desktops"} {$_ -eq "VIRTUAL_CENTER" -AND $pool.type -eq "Automated"} {$sourceoutput="Full Clones"} {$_ -eq "VIRTUAL_CENTER" -AND $pool.type -eq "MANUAL"} {$sourceoutput="Manually Added vCenter Managed Desktops"} default {$sourceoutput="No Source data available"} }

Some documentation for the switch command can be found here but what it in short does is match the variable u use as input and sets or gives some output based on that. Also it can do a comparison as in above example so I was able to distinguish between Full Clones and Manually Added vCenter Managed Desktops. One thing to be aware of is that it will go trough the complete list. At first I had the two lines with the comparison in it at the top but that got overwritten since below it VIRTUAL_CENTER was recognized and the $sourceoutput would be based on that.

The Automated and Manual pools use a very similar set of code, the biggest difference is that one gets the data from the AutomatedDesktopData propertywhile the other gets it from the manualdesktopdata property.

if ($pool.type -eq "Automated"){ $Automaticassignment=$pool.AutomatedDesktopData.UserAssignment.AutomaticAssignment switch ($Automaticassignment) { $TRUE {$Automaticassignmentoutput="Automatic"} $FALSE {$Automaticassignmentoutput="Manual"} default {$Automaticassignmentoutput="No Assignment Status Available"} } $Pooloverview+=New-Object PSObject -Property @{"Name" = $pool.base.name; "Displayname" = $pool.base.DisplayName; "Description" = $pool.base.Description; "Status" = $poolstatusoutput; "Provisioning" = $ProvisioningStatusoutput; "Type" = $pool.type; "Source" = $sourceoutput; "User_Assignment" = $pool.AutomatedDesktopData.UserAssignment.userassignment; "Assignment_Type" = $Automaticassignmentoutput; } }

elseif ($pool.type -eq "MANUAL"){ $Automaticassignment= $pool.manualdesktopdata.UserAssignment.AutomaticAssignment switch ($Automaticassignment) { $TRUE {$Automaticassignmentoutput="Automatic"} $FALSE {$Automaticassignmentoutput="Manual"} default {$Automaticassignmentoutput="No Assignment Status Available"} } $Pooloverview+=New-Object PSObject -Property @{"Name" = $pool.base.name; "Displayname" = $pool.base.DisplayName; "Description" = $pool.base.Description; "Status" = $poolstatusoutput; "Provisioning" = $ProvisioningStatusoutput; "Type" = $pool.type; "Source" = $sourceoutput; "User_Assignment" = $pool.manualdesktopdata.UserAssignment.UserAssignment; "Assignment_Type" = $Automaticassignmentoutput; } }

The RDS block gives a totally different view though. The information had to be pulled from the farms that are the backend for the desktops.

elseif ($pool.type -eq "RDS"){ $source=($services1.farm.farm_get($pool.rdsdesktopdata.farm)).source $ProvisioningStatus=($services1.farm.farm_get($pool.rdsdesktopdata.farm)).automatedfarmdata.VirtualCenterProvisioningSettings.enableprovisioning switch ($source) { VIEW_COMPOSER {$sourceoutput="Linked Clones RDS Hosts"} INSTANT_CLONE_ENGINE {$sourceoutput="Instant Clones RDS Hosts"} default {$sourceoutput="Manually Added RDS Hosts"} } switch ($ProvisioningStatus) { $True {$ProvisioningStatusoutput="Enabled"} $False {$ProvisioningStatusoutput="Disabled"} default {$ProvisioningStatusoutput="N/A"} } $Pooloverview+=New-Object PSObject -Property @{"Name" = $pool.base.name; "Displayname" = $pool.base.DisplayName; "Description" = $pool.base.Description; "Status" = $poolstatusoutput; "Provisioning" = $ProvisioningStatusoutput; "Type" = ($services1.farm.farm_get($pool.rdsdesktopdata.farm)).type; "Source" = $sourceoutput; "User_Assignment" = "N/A"; "Assignment_Type" = "N/A"; } }

And when done I ended up with the following script. As usual it might get some improvements or I need to squash some bug so better check the latest version on Github.

# Start of Settings # End of Settings $Poolo[email protected]() foreach ($pool in $pools){ $poolstatus=$pool.DesktopSettings.Enabled $ProvisioningStatus=$pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.enableprovisioning $source=$pool.source switch ($poolstatus) { $True {$poolstatusoutput="Enabled"} $False {$poolstatusoutput="Disabled"} default {$poolstatusoutput="No Pool Status available"} } switch ($ProvisioningStatus) { $True {$ProvisioningStatusoutput="Enabled"} $False {$ProvisioningStatusoutput="Disabled"} default {$ProvisioningStatusoutput="No Pool Provisioning Status available"} } switch ($source) { VIRTUAL_CENTER {$sourceoutput="vCenter Managed Desktop"} FULL_CLONES {$sourceoutput="Full Clones"} VIEW_COMPOSER {$sourceoutput="Linked Clones"} INSTANT_CLONE_ENGINE {$sourceoutput="Instant Clones"} UNMANAGED {$sourceoutput="Non-vCenter Desktops"} RDS {$sourceoutput="RDS Desktops"} {$_ -eq "VIRTUAL_CENTER" -AND $pool.type -eq "Automated"} {$sourceoutput="Full Clones"} {$_ -eq "VIRTUAL_CENTER" -AND $pool.type -eq "MANUAL"} {$sourceoutput="Manually Added vCenter Managed Desktops"} default {$sourceoutput="No Source data available"} } if ($pool.type -eq "Automated"){ $Automaticassignment=$pool.AutomatedDesktopData.UserAssignment.AutomaticAssignment switch ($Automaticassignment) { $TRUE {$Automaticassignmentoutput="Automatic"} $FALSE {$Automaticassignmentoutput="Manual"} default {$Automaticassignmentoutput="No Assignment Status Available"} } $Pooloverview+=New-Object PSObject -Property @{"Name" = $pool.base.name; "Displayname" = $pool.base.DisplayName; "Description" = $pool.base.Description; "Status" = $poolstatusoutput; "Provisioning" = $ProvisioningStatusoutput; "Type" = $pool.type; "Source" = $sourceoutput; "User_Assignment" = $pool.AutomatedDesktopData.UserAssignment.userassignment; "Assignment_Type" = $Automaticassignmentoutput; } } elseif ($pool.type -eq "MANUAL"){ $Automaticassignment= $pool.manualdesktopdata.UserAssignment.AutomaticAssignment switch ($Automaticassignment) { $TRUE {$Automaticassignmentoutput="Automatic"} $FALSE {$Automaticassignmentoutput="Manual"} default {$Automaticassignmentoutput="No Assignment Status Available"} } $Pooloverview+=New-Object PSObject -Property @{"Name" = $pool.base.name; "Displayname" = $pool.base.DisplayName; "Description" = $pool.base.Description; "Status" = $poolstatusoutput; "Provisioning" = $ProvisioningStatusoutput; "Type" = $pool.type; "Source" = $sourceoutput; "User_Assignment" = $pool.manualdesktopdata.UserAssignment.UserAssignment; "Assignment_Type" = $Automaticassignmentoutput; } } elseif ($pool.type -eq "RDS"){ $source=($services1.farm.farm_get($pool.rdsdesktopdata.farm)).source $ProvisioningStatus=($services1.farm.farm_get($pool.rdsdesktopdata.farm)).automatedfarmdata.VirtualCenterProvisioningSettings.enableprovisioning switch ($source) { VIEW_COMPOSER {$sourceoutput="Linked Clones RDS Hosts"} INSTANT_CLONE_ENGINE {$sourceoutput="Instant Clones RDS Hosts"} default {$sourceoutput="Manually Added RDS Hosts"} } switch ($ProvisioningStatus) { $True {$ProvisioningStatusoutput="Enabled"} $False {$ProvisioningStatusoutput="Disabled"} default {$ProvisioningStatusoutput="N/A"} } $Pooloverview+=New-Object PSObject -Property @{"Name" = $pool.base.name; "Displayname" = $pool.base.DisplayName; "Description" = $pool.base.Description; "Status" = $poolstatusoutput; "Provisioning" = $ProvisioningStatusoutput; "Type" = ($services1.farm.farm_get($pool.rdsdesktopdata.farm)).type; "Source" = $sourceoutput; "User_Assignment" = "N/A"; "Assignment_Type" = "N/A"; } } } $Pooloverview | select Name,Displayname,Description,Status,Provisioning,Type,Source,User_Assignment,Assignment_Type $Title = "Overview of all Pools" $Header = "Overview of all Pools" $Comments = "Gives an overview of the general status of all pools" $Display = "Table" $Author = "Wouter Kursten" $PluginVersion = 0.1 $PluginCategory = "View"

And a screenshot of the result: