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
$Pooloverview=@()
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: