Merge pull request #54 from praveenmathamsetty/master

Horizon: Adding New Advanced Functions Get-HVMachine and Get-HVMachineSummary
This commit is contained in:
Alan Renouf
2016-12-20 10:02:32 -08:00
committed by GitHub
2 changed files with 354 additions and 33 deletions

View File

@@ -29,7 +29,7 @@
<Label>User Assignment</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>8</Width>
<Width>7</Width>
<Label>Enabled</Label>
</TableColumnHeader>
<TableColumnHeader>
@@ -117,27 +117,27 @@
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Width>16</Width>
<Width>15</Width>
<Label>Machine</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
<Width>12</Width>
<Label>DesktopPool</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
<Width>12</Width>
<Label>DNS Name</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
<Width>8</Width>
<Label>User</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
<Width>15</Width>
<Label>Host</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>8</Width>
<Width>5</Width>
<Label>Agent</Label>
</TableColumnHeader>
<TableColumnHeader>
@@ -145,9 +145,8 @@
<Label>Datastore</Label>
</TableColumnHeader>
<TableColumnHeader>
<Width>10</Width>
<Width>15</Width>
<Label>Status</Label>
<Alignment>Right</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
@@ -169,13 +168,13 @@
<ScriptBlock>$_.ManagedMachineNamesData.HostName</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>$_.Data.AgentVersion</ScriptBlock>
<ScriptBlock>$_.Base.AgentVersion</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>$_.ManagedMachineNamesData.DatastorePaths</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>$_.Data.BasicState</ScriptBlock>
<ScriptBlock>$_.Base.BasicState</ScriptBlock>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
@@ -212,12 +211,16 @@
<ScriptBlock>$_.ManagedMachineNamesData.HostName</ScriptBlock>
</ListItem>
<ListItem>
<Label>Enabled</Label>
<Label>Agent</Label>
<ScriptBlock>$_.Base.AgentVersion</ScriptBlock>
</ListItem>
<ListItem>
<Label>Datastore</Label>
<ScriptBlock>$_.ManagedMachineNamesData.DatastorePaths</ScriptBlock>
</ListItem>
<ListItem>
<Label>Sessions</Label>
<ScriptBlock>$_.Data.BasicState</ScriptBlock>
<Label>Status</Label>
<ScriptBlock>$_.Base.BasicState</ScriptBlock>
</ListItem>
</ListItems>
</ListEntry>

View File

@@ -1,7 +1,7 @@
#Script Module : VMware.Hv.Helper
#Version : 1.0
#Copyright © 2016 VMware, Inc. All Rights Reserved.
#Copyright © 2016 VMware, Inc. All Rights Reserved.
#Permission is hereby granted, free of charge, to any person obtaining a copy of
#this software and associated documentation files (the "Software"), to deal in
@@ -242,7 +242,7 @@ The Add-HVDesktop adds virtual machines to already exiting pools by using view A
try {
$desktopPool = Get-HVPoolSummary -poolName $poolName -hvServer $hvServer
} catch {
Write-Error "Make sure Get-HVPool advanced function is loaded, $_"
Write-Error "Make sure Get-HVPoolSummary advanced function is loaded, $_"
break
}
if ($desktopPool) {
@@ -1087,7 +1087,7 @@ function Find-HVFarm {
'farmType' = 'data.type';
}
$parms = $Param
$params = $Param
$query_service_helper = New-Object VMware.Hv.QueryServiceService
$query = New-Object VMware.Hv.QueryDefinition
@@ -1097,10 +1097,10 @@ function Find-HVFarm {
$query.queryEntityType = 'FarmSummaryView'
[VMware.Hv.queryfilter[]]$filterSet = @()
foreach ($setting in $farmSelectors.Keys) {
if ($null -ne $parms[$setting]) {
if ($null -ne $params[$setting]) {
$equalsFilter = New-Object VMware.Hv.QueryFilterEquals
$equalsFilter.memberName = $farmSelectors[$setting]
$equalsFilter.value = $parms[$setting]
$equalsFilter.value = $params[$setting]
$filterSet += $equalsFilter
}
}
@@ -1370,17 +1370,17 @@ function Find-HVPool {
'provisioningEnabled' = 'desktopSummaryData.provisioningEnabled'
}
$parms = $Param
$params = $Param
$query_service_helper = New-Object VMware.Hv.QueryServiceService
$query = New-Object VMware.Hv.QueryDefinition
$wildCard = $false
#Only supports wild card '*'
if ($parms['PoolName'] -and $parms['PoolName'].contains('*')) {
if ($params['PoolName'] -and $params['PoolName'].contains('*')) {
$wildcard = $true
}
if ($parms['PoolDisplayName'] -and $parms['PoolDisplayName'].contains('*')) {
if ($params['PoolDisplayName'] -and $params['PoolDisplayName'].contains('*')) {
$wildcard = $true
}
# build the query values
@@ -1388,10 +1388,10 @@ function Find-HVPool {
if (! $wildcard) {
[VMware.Hv.queryfilter[]]$filterSet = @()
foreach ($setting in $poolSelectors.Keys) {
if ($null -ne $parms[$setting]) {
if ($null -ne $params[$setting]) {
$equalsFilter = New-Object VMware.Hv.QueryFilterEquals
$equalsFilter.memberName = $poolSelectors[$setting]
$equalsFilter.value = $parms[$setting]
$equalsFilter.value = $params[$setting]
$filterSet += $equalsFilter
}
}
@@ -1408,11 +1408,11 @@ function Find-HVPool {
$queryResults = $query_service_helper.QueryService_Query($services,$query)
$strFilterSet = @()
foreach ($setting in $poolSelectors.Keys) {
if ($null -ne $parms[$setting]) {
if ($null -ne $params[$setting]) {
if ($wildcard -and (($setting -eq 'PoolName') -or ($setting -eq 'PoolDisplayName')) ) {
$strFilterSet += '($_.' + $poolSelectors[$setting] + ' -like "' + $parms[$setting] + '")'
$strFilterSet += '($_.' + $poolSelectors[$setting] + ' -like "' + $params[$setting] + '")'
} else {
$strFilterSet += '($_.' + $poolSelectors[$setting] + ' -eq "' + $parms[$setting] + '")'
$strFilterSet += '($_.' + $poolSelectors[$setting] + ' -eq "' + $params[$setting] + '")'
}
}
}
@@ -1844,7 +1844,7 @@ function New-HVFarm {
Reference to Horizon View Server to query the farms from. If the value is not passed or null then first element from global:DefaultHVServers would be considered inplace of hvServer.
.EXAMPLE
New-HVFarm -LinkedClone -FarmName 'LCFarmTest' -ParentVM 'Win_Server_2012_R2' -SnapshotVM 'Snap_RDS' -VmFolder 'PoolVM' -HostOrCluster 'cls' -ResourcePool 'cls' -Datastores 'datastore1 (5)' -FarmDisplayName 'LC Farm Test' -Description  'created LC Farm from PS' -EnableProvisioning $true -StopOnProvisioningError $false -NamingPattern  "LCFarmVM_PS" -MinReady 1 -MaximumCount 1 -SysPrepName "RDSH_Cust2" -NetBiosName "adviewdev"
New-HVFarm -LinkedClone -FarmName 'LCFarmTest' -ParentVM 'Win_Server_2012_R2' -SnapshotVM 'Snap_RDS' -VmFolder 'PoolVM' -HostOrCluster 'cls' -ResourcePool 'cls' -Datastores 'datastore1 (5)' -FarmDisplayName 'LC Farm Test' -Description  'created LC Farm from PS' -EnableProvisioning $true -StopOnProvisioningError $false -NamingPattern  "LCFarmVM_PS" -MinReady 1 -MaximumCount 1 -SysPrepName "RDSH_Cust2" -NetBiosName "adviewdev"
.EXAMPLE
New-HVFarm -Spec C:\VMWare\Specs\LinkedClone.json
@@ -3062,7 +3062,7 @@ function New-HVPool {
try {
$sourcePool = Get-HVPoolSummary -poolName $poolName -hvServer $hvServer
} catch {
Write-Error "Make sure Get-HVPool advanced function is loaded, $_"
Write-Error "Make sure Get-HVPoolSummary advanced function is loaded, $_"
break
}
if ($sourcePool) {
@@ -3888,7 +3888,7 @@ function Remove-HVPool {
try {
$myPools = Get-HVPoolSummary -poolName $poolName -hvServer $hvServer
} catch {
Write-Error "Make sure Get-HVPool advanced function is loaded, $_"
Write-Error "Make sure Get-HVPoolSummary advanced function is loaded, $_"
break
}
if ($myPools) {
@@ -4258,7 +4258,7 @@ function Set-HVPool {
try {
$desktopPools = Get-HVPoolSummary -poolName $poolName -hvServer $hvServer
} catch {
Write-Error "Make sure Get-HVPool advanced function is loaded, $_"
Write-Error "Make sure Get-HVPoolSummary advanced function is loaded, $_"
break
}
if ($desktopPools) {
@@ -4767,7 +4767,7 @@ function Start-HVPool {
try {
$poolObj = Get-HVPoolSummary -poolName $item -hvServer $hvServer
} catch {
Write-Error "Make sure Get-HVPool advanced function is loaded, $_"
Write-Error "Make sure Get-HVPoolSummary advanced function is loaded, $_"
break
}
if ($poolObj) {
@@ -4943,4 +4943,322 @@ function Get-HVTaskSpec {
return $spec
}
Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool
function Find-HVMachine {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
$Param
)
$params = $Param
try {
if ($params['PoolName']) {
$poolObj = Get-HVPoolSummary -poolName $params['PoolName'] -hvServer $params['HvServer']
if ($poolObj.Length -ne 1) {
Write-Host "Failed to retrieve specific pool object with given PoolName : "$params['PoolName']
break;
} else {
$desktopId = $poolObj.Id
}
}
} catch {
Write-Error "Make sure Get-HVPoolSummary advanced function is loaded, $_"
break
}
#
# This translates the function arguments into the View API properties that must be queried
$machineSelectors = @{
'PoolName' = 'base.desktop';
'MachineName' = 'base.name';
'DnsName' = 'base.dnsName';
'State' = 'base.basicState';
}
$query_service_helper = New-Object VMware.Hv.QueryServiceService
$query = New-Object VMware.Hv.QueryDefinition
$wildCard = $false
#Only supports wild card '*'
if ($params['MachineName'] -and $params['MachineName'].contains('*')) {
$wildcard = $true
}
if ($params['DnsName'] -and $params['DnsName'].contains('*')) {
$wildcard = $true
}
# build the query values, MachineNamesView is having more info than
# MachineSummaryView
$query.queryEntityType = 'MachineNamesView'
if (! $wildcard) {
[VMware.Hv.queryfilter[]]$filterSet = @()
foreach ($setting in $machineSelectors.Keys) {
if ($null -ne $params[$setting]) {
$equalsFilter = New-Object VMware.Hv.QueryFilterEquals
$equalsFilter.memberName = $machineSelectors[$setting]
if ($equalsFilter.memberName -eq 'base.desktop') {
$equalsFilter.value = $desktopId
} else {
$equalsFilter.value = $params[$setting]
}
$filterSet += $equalsFilter
}
}
if ($filterSet.Count -gt 0) {
$andFilter = New-Object VMware.Hv.QueryFilterAnd
$andFilter.Filters = $filterset
$query.Filter = $andFilter
}
$queryResults = $query_service_helper.QueryService_Query($services,$query)
$machineList = $queryResults.results
}
if ($wildcard -or [string]::IsNullOrEmpty($machineList)) {
$query.Filter = $null
$queryResults = $query_service_helper.QueryService_Query($services,$query)
$strFilterSet = @()
foreach ($setting in $machineSelectors.Keys) {
if ($null -ne $params[$setting]) {
if ($wildcard -and (($setting -eq 'MachineName') -or ($setting -eq 'DnsName')) ) {
$strFilterSet += '($_.' + $machineSelectors[$setting] + ' -like "' + $params[$setting] + '")'
} else {
$strFilterSet += '($_.' + $machineSelectors[$setting] + ' -eq "' + $params[$setting] + '")'
}
}
}
$whereClause = [string]::Join(' -and ', $strFilterSet)
$scriptBlock = [Scriptblock]::Create($whereClause)
$machineList = $queryResults.results | where $scriptBlock
}
return $machineList
}
function Get-HVMachine {
<#
.Synopsis
Gets virtual Machine(s) information with given search parameters.
.DESCRIPTION
Queries and returns virtual machines information, the machines list would be determined
based on queryable fields poolName, dnsName, machineName, state. When more than one
fields are used for query the virtual machines which satisfy all fields criteria would be returned.
.PARAMETER PoolName
Pool name to query for.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has name same as value will be returned.
.PARAMETER MachineName
The name of the Machine to query for.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has display name same as value will be returned.
.PARAMETER DnsName
DNS name for the Machine to filter with.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has display name same as value will be returned.
.PARAMETER State
The basic state of the Machine to filter with.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has display name same as value will be returned.
.PARAMETER HvServer
Reference to Horizon View Server to query the virtual machines from. If the value is not passed or null then
first element from global:DefaultHVServers would be considered inplace of hvServer
.EXAMPLE
Get-HVDesktop -PoolName 'ManualPool'
.EXAMPLE
Get-HVDesktop -MachineName 'PowerCLIVM'
.EXAMPLE
Get-HVDesktop -State CUSTOMIZING
.EXAMPLE
Get-HVDesktop -DnsName 'powercli-*' -State CUSTOMIZING
.OUTPUTS
Returns list of objects of type MachineInfo
.NOTES
Author : Praveen Mathamsetty.
Author email : pmathamsetty@vmware.com
Version : 1.1
===Tested Against Environment====
Horizon View Server Version : 7.0.2, 7.0.3
PowerCLI Version : PowerCLI 6.5
PowerShell Version : 5.0
#>
[CmdletBinding(
SupportsShouldProcess = $true,
ConfirmImpact = 'High'
)]
param(
[Parameter(Mandatory = $false)]
[string]
$PoolName,
[Parameter(Mandatory = $false)]
[string]
$MachineName,
[Parameter(Mandatory = $false)]
[string]
$DnsName,
[Parameter(Mandatory = $false)]
[ValidateSet('PROVISIONING','PROVISIONING_ERROR','WAIT_FOR_AGENT','CUSTOMIZING',
'DELETING','MAINTENANCE','ERROR','PROVISIONED','AGENT_UNREACHABLE','UNASSIGNED_USER_CONNECTED',
'CONNECTED','UNASSIGNED_USER_DISCONNECTED','DISCONNECTED','AGENT_ERR_STARTUP_IN_PROGRESS',
'AGENT_ERR_DISABLED','AGENT_ERR_INVALID_IP','AGENT_ERR_NEED_REBOOT','AGENT_ERR_PROTOCOL_FAILURE',
'AGENT_ERR_DOMAIN_FAILURE','AGENT_CONFIG_ERROR','ALREADY_USED','AVAILABLE','IN_PROGRESS','DISABLED',
'DISABLE_IN_PROGRESS','VALIDATING','UNKNOWN')]
[string]
$State,
[Parameter(Mandatory = $false)]
[string]
$JsonFilePath,
[Parameter(Mandatory = $false)]
$HvServer = $null
)
$services = Get-ViewAPIService -hvServer $hvServer
if ($null -eq $services) {
Write-Error "Could not retrieve ViewApi services from connection object"
break
}
$machineList = Find-HVMachine -Param $PSBoundParameters
if (!$machineList) {
Write-Host "No Virtual Machine(s) Found with given search parameters"
break
}
$queryResults = @()
$desktop_helper = New-Object VMware.Hv.MachineService
foreach ($id in $machineList.id) {
$info = $desktop_helper.Machine_Get($services,$id)
$queryResults += $info
}
$machineList = $queryResults
return $machineList
}
function Get-HVMachineSummary {
<#
.Synopsis
Gets virtual Machine(s) summary with given search parameters.
.DESCRIPTION
Queries and returns virtual machines information, the machines list would be determined
based on queryable fields poolName, dnsName, machineName, state. When more than one
fields are used for query the virtual machines which satisfy all fields criteria would be returned.
.PARAMETER PoolName
Pool name to query for.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has name same as value will be returned.
.PARAMETER MachineName
The name of the Machine to query for.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has display name same as value will be returned.
.PARAMETER DnsName
DNS name for the Machine to filter with.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has display name same as value will be returned.
.PARAMETER State
The basic state of the Machine to filter with.
If the value is null or not provided then filter will not be applied,
otherwise the virtual machines which has display name same as value will be returned.
.PARAMETER HvServer
Reference to Horizon View Server to query the virtual machines from. If the value is not passed or null then
first element from global:DefaultHVServers would be considered inplace of hvServer
.EXAMPLE
Get-HVDesktopSummary -PoolName 'ManualPool'
.EXAMPLE
Get-HVDesktopSummary -MachineName 'PowerCLIVM'
.EXAMPLE
Get-HVDesktopSummary -State CUSTOMIZING
.EXAMPLE
Get-HVDesktopSummary -DnsName 'powercli-*' -State CUSTOMIZING
.OUTPUTS
Returns list of objects of type MachineNamesView
.NOTES
Author : Praveen Mathamsetty.
Author email : pmathamsetty@vmware.com
Version : 1.1
===Tested Against Environment====
Horizon View Server Version : 7.0.2, 7.0.3
PowerCLI Version : PowerCLI 6.5
PowerShell Version : 5.0
#>
[CmdletBinding(
SupportsShouldProcess = $true,
ConfirmImpact = 'High'
)]
param(
[Parameter(Mandatory = $false)]
[string]
$PoolName,
[Parameter(Mandatory = $false)]
[string]
$MachineName,
[Parameter(Mandatory = $false)]
[string]
$DnsName,
[Parameter(Mandatory = $false)]
[ValidateSet('PROVISIONING','PROVISIONING_ERROR','WAIT_FOR_AGENT','CUSTOMIZING',
'DELETING','MAINTENANCE','ERROR','PROVISIONED','AGENT_UNREACHABLE','UNASSIGNED_USER_CONNECTED',
'CONNECTED','UNASSIGNED_USER_DISCONNECTED','DISCONNECTED','AGENT_ERR_STARTUP_IN_PROGRESS',
'AGENT_ERR_DISABLED','AGENT_ERR_INVALID_IP','AGENT_ERR_NEED_REBOOT','AGENT_ERR_PROTOCOL_FAILURE',
'AGENT_ERR_DOMAIN_FAILURE','AGENT_CONFIG_ERROR','ALREADY_USED','AVAILABLE','IN_PROGRESS','DISABLED',
'DISABLE_IN_PROGRESS','VALIDATING','UNKNOWN')]
[string]
$State,
[Parameter(Mandatory = $false)]
[string]
$JsonFilePath,
[Parameter(Mandatory = $false)]
$HvServer = $null
)
$services = Get-ViewAPIService -hvServer $hvServer
if ($null -eq $services) {
Write-Error "Could not retrieve ViewApi services from connection object"
break
}
$machineList = Find-HVMachine -Param $PSBoundParameters
if (!$machineList) {
Write-Host "No Virtual Machine(s) Found with given search parameters"
break
}
return $machineList
}
Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool