FunctionApp/Modules/SessionHostReplacer/functions/Deploy-SHRSessionHost.ps1 (85 lines of code) (raw):

function Deploy-SHRSessionHost { [CmdletBinding()] param ( [Parameter()] [string[]] $ExistingSessionHostVMNames = @(), [Parameter(Mandatory = $true)] [int] $NewSessionHostsCount, [Parameter(Mandatory = $false)] [string] $HostPoolResourceGroupName = (Get-FunctionConfig _HostPoolResourceGroupName), [Parameter(Mandatory = $true)] [string] $SessionHostResourceGroupName, [Parameter()] [string] $HostPoolName = (Get-FunctionConfig _HostPoolName), [Parameter()] [string] $SessionHostNamePrefix = (Get-FunctionConfig _SessionHostNamePrefix), [Parameter()] [string] $SessionHostNameSeparator = (Get-FunctionConfig _SessionHostNameSeparator), [Parameter()] [int] $SessionHostInstanceNumberPadding = (Get-FunctionConfig _SessionHostInstanceNumberPadding), [Parameter()] [string] $DeploymentPrefix = (Get-FunctionConfig _SHRDeploymentPrefix), [Parameter()] [string] $SessionHostTemplate = (Get-FunctionConfig _SessionHostTemplate), [Parameter()] [string] $SessionHostTemplateParametersPS1Uri = (Get-FunctionConfig _SessionHostTemplateParametersPS1Uri), [Parameter()] [string] $TagIncludeInAutomation = (Get-FunctionConfig _Tag_IncludeInAutomation), [Parameter()] [string] $TagDeployTimestamp = (Get-FunctionConfig _Tag_DeployTimestamp), [Parameter()] [hashtable] $SessionHostParameters = (Get-FunctionConfig _SessionHostParameters | ConvertTo-CaseInsensitiveHashtable), #TODO: Port this into AzureFunctionConfiguration module and make it ciHashtable type. [Parameter()] [string] $VMNamesTemplateParameterName = (Get-FunctionConfig _VMNamesTemplateParameterName) ) Write-PSFMessage -Level Host -Message "Generating new token for the host pool {0} in Resource Group {1}" -StringValues $HostPoolName, $HostPoolResourceGroupName $hostPoolToken = New-AzWvdRegistrationInfo -ResourceGroupName $HostPoolResourceGroupName -HostPoolName $HostPoolName -ExpirationTime (Get-Date).AddHours(2) -ErrorAction Stop # Calculate Session Host Names Write-PSFMessage -Level Host -Message "Existing session host VM names: {0}" -StringValues ($ExistingSessionHostVMNames -join ',') [array] $sessionHostNames = for ($i = 0; $i -lt $NewSessionHostsCount; $i++) { $vmNumber = 1 While (("$SessionHostNamePrefix$SessionHostNameSeparator{0:d$SessionHostInstanceNumberPadding}" -f $vmNumber) -in $ExistingSessionHostVMNames) { $vmNumber++ } $vmName = "$SessionHostNamePrefix$SessionHostNameSeparator{0:d$SessionHostInstanceNumberPadding}" -f $vmNumber $ExistingSessionHostVMNames += $vmName $vmName } Write-PSFMessage -Level Host -Message "Creating session host(s) {0}" -StringValues ($sessionHostNames -join ',') # Update Session Host Parameters $sessionHostParameters[$VMNamesTemplateParameterName] = $sessionHostNames $sessionHostParameters['HostPoolName'] = $HostPoolName $sessionHostParameters['HostPoolToken'] = $hostPoolToken.Token $sessionHostParameters['Tags'][$TagIncludeInAutomation] = $true $sessionHostParameters['Tags'][$TagDeployTimestamp] = (Get-Date -AsUTC -Format 'o') $deploymentTimestamp = Get-Date -AsUTC -Format 'FileDateTime' $deploymentName = "{0}_{1}_Count_{2}_VMs" -f $DeploymentPrefix, $deploymentTimestamp, $sessionHostNames.count Write-PSFMessage -Level Host -Message "Deployment name: {0}" -StringValues $deploymentName $paramNewAzResourceGroupDeployment = @{ Name = $deploymentName ResourceGroupName = $sessionHostResourceGroupName TemplateParameterObject = $sessionHostParameters } # Check if using URI or Template Spec if ($SessionHostTemplate -like "http*") { #Using URIs Write-PSFMessage -Level Host -Message 'Deploying using URI: {0}' -StringValues $sessionHostTemplate $paramNewAzResourceGroupDeployment['TemplateUri'] = $SessionHostTemplate } else { #Using Template Spec Write-PSFMessage -Level Host -Message 'Deploying using Template Spec: {0}' -StringValues $sessionHostTemplate $templateSpecVersionResourceId = Get-SHRTemplateSpecVersionResourceId -ResourceId $SessionHostTemplate $paramNewAzResourceGroupDeployment['TemplateSpecId'] = $templateSpecVersionResourceId } Write-PSFMessage -Level Host -Message 'Deploying {0} session host(s) to resource group {1}' -StringValues $NewSessionHostsCount,$sessionHostResourceGroupName $deploymentJob = New-AzResourceGroupDeployment @paramNewAzResourceGroupDeployment -ErrorAction Stop -AsJob #TODO: Add logic to test if deployment is running (aka template is accepted) then finish running the function and let the deployment run in the background. Write-PSFMessage -Level Host -Message 'Pausing for 30 seconds to allow deployment to start' Start-Sleep -Seconds 30 # Check deployment status, if any has failed we report an error if ($deploymentJob.Error) { Write-PSFMessage -Level Error "DeploymentFailed" -EnableException $true throw $deploymentJob.Error } }