src/scripts/Invoke-ActionRunEslzArmDeployment.ps1 (114 lines of code) (raw):
#!/usr/bin/pwsh
#
# PowerShell Script
# - Test, run and destroy eslzArm deployments for test pipelines
#
[CmdletBinding(SupportsShouldProcess)]
param (
[Parameter()][String]$AlzToolsPath = "$PWD/src/Alz.Tools",
[Parameter()][String]$DeploymentConfigPath = "$($env:TEMP_DEPLOYMENT_OBJECT_PATH)",
[Parameter()][String]$SubscriptionConfigPath = "$($env:TEMP_SUBSCRIPTIONS_JSON_PATH)",
[Parameter()][String]$RootId,
[Parameter()][Switch]$Test,
[Parameter()][Switch]$Destroy
)
$ErrorActionPreference = "Stop"
# Save the current $InformationPreference value and set to continue
$InitialInformationPreference = $InformationPreference
$InformationPreference = 'Continue'
# Set the deployment mode
if ($Test) {
$mode = "TEST"
}
elseif ($Destroy) {
$mode = "DESTROY"
}
else {
$mode = "RUN"
}
# Load the deployment configuration from file if path specified
if (-not [String]::IsNullOrEmpty($DeploymentConfigPath)) {
Write-Information "==> Loading deployment configuration from : $DeploymentConfigPath"
$deploymentObject = Get-Content -Path $DeploymentConfigPath | ConvertFrom-Json -AsHashTable
# Set the RootId from the deployment configuration if not specified
if ([String]::IsNullOrEmpty($RootId)) {
$RootId = $deploymentObject.Name
Write-Information "==> Set rootId [$RootId] from deployment configuration"
}
$maxParameterKeyLength = (
$deploymentObject.TemplateParameterObject.Keys |
ForEach-Object { $_.Length } |
Measure-Object -Maximum
).Maximum
$deploymentObject.TemplateParameterObject.Keys | Sort-Object | ForEach-Object {
Write-Information "[Parameter] $($_.PadRight($maxParameterKeyLength, ' ')) : $($deploymentObject.TemplateParameterObject[$_])"
}
}
# Load the Subscription configuration from file
if ($Destroy) {
Write-Information "==> Loading subscription aliases from : $SubscriptionConfigPath"
$subscriptions = Get-Content -Path $SubscriptionConfigPath | ConvertFrom-Json
$subscriptionIds = $subscriptions.properties.subscriptionId
}
# Configure the environment for WhatIfPreference
$WhatIfPrefix = ""
if ($WhatIfPreference) {
$WhatIfPrefix = "What if: "
$deploymentObject.Add('WhatIf', $WhatIfPreference)
$deploymentObject.Add('WhatIfResultFormat', 'ResourceIdOnly')
}
# Run the deployment
Write-Information "$($WhatIfPrefix)[$mode] deployment : [$($deploymentObject.Name)]..."
Write-Information "$($WhatIfPrefix)Template URI : $($deploymentObject.TemplateUri)"
if ($Test) {
$deployment = Test-AzTenantDeployment @deploymentObject
}
elseif ($Destroy) {
# This part of the script relies on a custom set of classes and functions
# defined within the Alz.Tools PowerShell module.
Write-Information "==> Import Alz.Tools PowerShell module..."
Import-Module $AlzToolsPath
$jobs = @()
$maxKeyLength = ($subscriptions.name.foreach({ $_.Length }) | Measure-Object -Maximum).Maximum
$subscriptions | Sort-Object -Property name | ForEach-Object {
Write-Information "$($WhatIfPrefix)Processing Subscription : $($_.name.PadRight($maxKeyLength, ' ')) [$($_.properties.subscriptionId)]"
}
$jobs += Invoke-RemoveRsgByPattern -SubscriptionId $subscriptionIds -Like "$RootId-*" -WhatIf:$WhatIfPreference
$jobs += Invoke-RemoveRsgByPattern -SubscriptionId $subscriptionIds -Like "NetworkWatcherRG" -WhatIf:$WhatIfPreference
$jobs += Invoke-RemoveDeploymentByPattern -SubscriptionId $subscriptionIds -Like "$RootId" -IncludeTenantScope -WhatIf:$WhatIfPreference
$jobs += Invoke-RemoveDeploymentByPattern -SubscriptionId $subscriptionIds -Like "alz-*" -IncludeTenantScope -WhatIf:$WhatIfPreference
Write-Information "$($WhatIfPrefix)Removing Management Group : $RootId..."
Invoke-RemoveMgHierarchy -ManagementGroupId $RootId -WhatIf:$WhatIfPreference | ForEach-Object { Write-Information "Successfully removed : $_" }
Write-Information "$($WhatIfPrefix)Removing Orphaned Role Assignments..."
if (-not $WhatIfPreference) {
# Sleep for 60 seconds to allow Management Group changes to create orphaned Role Assignments
Start-Sleep -Seconds 60
}
Invoke-RemoveOrphanedRoleAssignment -SubscriptionId $subscriptionIds -WhatIf:$WhatIfPreference
Write-Information "$($WhatIfPrefix)Waiting for resource deletion jobs to complete..."
$jobs | Wait-Job -Timeout 3600
}
else {
$deployment = New-AzTenantDeployment @deploymentObject
}
# Return deployment output
if (
(-not $Test) -and
(-not $Destroy)
) {
$deployment
}
# Validate provisioning state for completed deployment
if (
(-not $Test) -and
(-not $Destroy) -and
(-not $WhatIfPreference) -and
($deployment.ProvisioningState -ne "Succeeded")
) {
throw "Provisioning failed... check activity and deployment logs in Azure for more information."
}
else {
Write-Information "$($WhatIfPrefix)[$mode] Deployment Complete..."
}
# Revert InformationPreference to original value
$InformationPreference = $InitialInformationPreference