AzureBasicLoadBalancerUpgrade/testEnvs/scripts/deploy.ps1 (159 lines of code) (raw):

Param ( [string]$Location = 'eastus', [parameter(Mandatory = $false)][string[]]$ScenarioNumber, [switch]$includeHighCostScenarios, [switch]$includeManualConfigScenarios, [switch]$Cleanup, # removes all test environments (in parallel) [switch]$RunMigration, # executes the migration module against all test environments (in parallel), [boolean]$skipUpgradeNATPoolsToNATRules = $false, [parameter(Mandatory = $false)][string[]]$resourceGroupSuffix = @('') ) $ErrorActionPreference = 'Stop' # causes resource graph queries to wait for results to be returned, since ARG lags behind ARM which breaks testing immediately after deployment $env:LBMIG_WAIT_FOR_ARG = $true If (!(Test-Path -Path ../scenarios)) { Write-Error "This script should be executed from the ./testEnvs/scripts directory" break } $allTemplates = Get-ChildItem -Path ../scenarios -File -Exclude bicepconfig.json -Recurse -Depth 0 If ($ScenarioNumber) { $templateNumberPattern = ($scenarioNumber | ForEach-Object { $_.ToString().PadLeft(3, '0') }) -join '|' $pattern = '^({0})\-' -f $templateNumberPattern $filteredTemplates = $allTemplates | Where-Object { $_.Name -match $pattern } } ElseIf ($includeHighCostScenarios.IsPresent -and $includeManualConfigScenarios.IsPresent) { $filteredTemplates = $allTemplates } ElseIf ($includeHighCostScenarios.IsPresent) { $filteredTemplates = $allTemplates | Where-Object { $_.Name -notmatch 'MANUALCONFIG' } } ElseIf ($includeManualConfigScenarios.IsPresent) { $filteredTemplates = $allTemplates | Where-Object { $_.Name -notmatch 'HIGHCOST' } } Else { $filteredTemplates = $allTemplates | Where-Object { $_.Name -notmatch 'HIGHCOST|MANUALCONFIG' } } Write-Verbose "Deploying templates: $($filteredTemplates.Name)" Foreach ($resourceGroupSuffixI in $resourceGroupSuffix) { # if '-Cleanup' switch is supplied, remove the resource groups and exit if ($Cleanup -and $null -ne $filteredTemplates) { $jobs = @() $rgNamesToRemove = $filteredTemplates | ForEach-Object { "rg-{0}{1}-{2}" -f $_.BaseName.split('-')[0], $resourceGroupSuffixI, $_.BaseName.split('-', 2)[1] } $rgNamesToRemove | Foreach-Object { "Removing Resource Group '$_'" $jobs += $(Remove-AzResourceGroup -Name $_ -Force -AsJob) } $jobs | Wait-Job | Receive-Job return } } # if -RunMigration switch is supplied, the VMSS Load Balancer migration modules is run against all environments if ($RunMigration.IsPresent -and $null -ne $filteredTemplates) { $ScriptBlock = { param($RGName) Write-Output $RGName $pwd Import-Module ../../module/AzureBasicLoadBalancerUpgrade -Force $path = "$env:HOMEPATH/temp/AzLoadBalancerMigration/$RGName" New-Item -ItemType Directory -Path $path -ErrorAction SilentlyContinue Set-Location $path Start-AzBasicLoadBalancerUpgrade -ResourceGroupName $RGName -BasicLoadBalancerName lb-basic-01 -StandardLoadBalancerName lb-standard-01 -Pre -Force -outputMigrationValiationObj -skipUpgradeNATPoolsToNATRules:$skipUpgradeNATPoolsToNATRules } $scriptBlockMultiLB = { param($RGName) Write-Output $RGName $pwd Import-Module ../../module\AzureBasicLoadBalancerUpgrade -Force $path = "$env:HOMEPATH/temp/AzLoadBalancerMigration/$RGName" New-Item -ItemType Directory -Path $path -ErrorAction SilentlyContinue Set-Location $path $multiLBConfig = @() get-AzLoadBalancer -ResourceGroupName $RGName | ? {$_.sku.name -eq 'basic'} | select -First 2 | %{ $multiLBConfig += @{BasicLoadBalancer=$_;StandardLoadBalancerName=$_.name.replace('basic','standard')}} Start-AzBasicLoadBalancerUpgrade -MultiLBConfig $multiLBConfig -Pre -Force -outputMigrationValiationObj -skipUpgradeNATPoolsToNATRules:$skipUpgradeNATPoolsToNATRules } $rgNamesToMigrate = $filteredTemplates | ForEach-Object { Foreach ($suffix in $resourceGroupSuffix) {"rg-{0}{1}-{2}" -f $_.BaseName.split('-')[0], $suffix, $_.BaseName.split('-', 2)[1] }} $scenarios = Get-AzResourceGroup | Where-Object { $_.ResourceGroupName -iin $rgNamesToMigrate } $jobPool = @() foreach ($rg in $scenarios) { While (($activeJobs = ($jobPool | Where-Object { $_.State -eq 'Running' }).count) -gt 10) { Write-Host "Currently $activeJobs jobs running, waiting for less than 10" Start-Sleep -Seconds 5 } switch -regex ($RG.ResourceGroupName) { 'multi-lb-mix' { $jobScriptBlock = $ScriptBlockMultiLB } default { $jobScriptBlock = $scriptBlock } } $jobPool += Start-Job -Name $rg.ResourceGroupName -ArgumentList $rg.ResourceGroupName -ScriptBlock $jobScriptBlock -InitializationScript ([scriptblock]::Create("set-location '$pwd'")) } Write-Output ("Total Jobs Created: " + $scenarios.Count) Write-Output "-----------------------------" while ((Get-Job -State Running).count -ne 0) { Write-Output ("Threads Running: " + (Get-Job -State Running).count) Start-Sleep -Seconds 5 } Write-Output "-----------------------------" # $jobs = @() # $filteredTemplates | # Foreach-Object { # "Upgrading LoadBalancer configuration in Resouce Group rg-$($_.BaseName)" # $jobs += $( # Start-Job -Name "$rgName deployment job" -InitializationScript { Import-Module ..\..\AzureBasicLoadBalancerUpgrade } ` # -ScriptBlock { Start-AzBasicLoadBalancerUpgrade ` # -ResourceGroupName $input ` # -BasicLoadBalancerName 'lb-basic-01' ` # -StandardLoadBalancerName 'lb-std-01' -FollowLog } ` # -InputObject "rg-$($_.BaseName)" # ) # } # $jobs | Wait-Job | Receive-Job return } # deploy scenarioset- $jobs = @() ForEach ($resourceGroupSuffixI in $resourceGroupSuffix) { foreach ($template in $filteredTemplates) { $rgTemplateName = "rg-{0}{1}-{2}" -f $template.BaseName.split('-')[0], $resourceGroupSuffixI, $template.BaseName.split('-', 2)[1] if ($template.Name -match "(019|044)-") { $params = @{ Name = "vmss-lb-deployment-$((get-date).tofiletime())" TemplateFile = $template.FullName Location = $Location resourceGroupNameFromTemplate = $rgTemplateName } $null = New-AzResourceGroup -Name $rgTemplateName -Location $Location -Force -ErrorAction SilentlyContinue $jobs += New-AzResourceGroupDeployment -ResourceGroupName $rgTemplateName @params -AsJob } elseif ($template.FullName -like "*.bicep") { $params = @{ Name = "vmss-lb-deployment-$((get-date).tofiletime())" TemplateFile = $template.FullName TemplateParameterObject = @{ Location = $Location ResourceGroupName = $rgTemplateName } } $job = New-AzSubscriptionDeployment -Location $location @params -AsJob $job.Name = "rg-$($template.BaseName)" $jobs += $job } elseif ($template.Name -like "*.json") { $params = @{ Name = "vmss-lb-deployment-$((get-date).tofiletime())" TemplateFile = $template.FullName TemplateParameterObject = @{ Location = $Location ResourceGroupName = $rgTemplateName } } $null = New-AzResourceGroup -Name $rgTemplateName -Location $Location -Force -ErrorAction SilentlyContinue $jobs += New-AzResourceGroupDeployment -ResourceGroupName $rgTemplateName @params -AsJob } } } $jobs | Wait-Job | Foreach-Object { $job = $_ If ($job.Error -or $job.State -eq 'Failed') { Write-Host -ForegroundColor Red -Object "" } }