Skip to content

Commit bccd830

Browse files
committed
refactor deployments into function
1 parent 251c3e9 commit bccd830

File tree

1 file changed

+147
-63
lines changed

1 file changed

+147
-63
lines changed

src/ALZ/Public/Remove-PlatformLandingZone.ps1

Lines changed: 147 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,68 @@ function Remove-PlatformLandingZone {
274274
Write-Host "$prefix[$timestamp] [$Level] $Message" -ForegroundColor $Color -NoNewline:$Overwrite.IsPresent
275275
}
276276

277+
function Test-RequiredTooling {
278+
Write-ToConsoleLog "Checking the software requirements for the Accelerator..."
279+
280+
$checkResults = @()
281+
$hasFailure = $false
282+
283+
# Check if Azure CLI is installed
284+
Write-Verbose "Checking Azure CLI installation"
285+
$azCliPath = Get-Command az -ErrorAction SilentlyContinue
286+
if ($azCliPath) {
287+
$checkResults += @{
288+
message = "Azure CLI is installed."
289+
result = "Success"
290+
}
291+
} else {
292+
$checkResults += @{
293+
message = "Azure CLI is not installed. Follow the instructions here: https://learn.microsoft.com/en-us/cli/azure/install-azure-cli"
294+
result = "Failure"
295+
}
296+
$hasFailure = $true
297+
}
298+
299+
# Check if Azure CLI is logged in
300+
Write-Verbose "Checking Azure CLI login status"
301+
$azCliAccount = $(az account show -o json) | ConvertFrom-Json
302+
if ($azCliAccount) {
303+
$checkResults += @{
304+
message = "Azure CLI is logged in. Tenant ID: $($azCliAccount.tenantId), Subscription: $($azCliAccount.name) ($($azCliAccount.id))"
305+
result = "Success"
306+
}
307+
} else {
308+
$checkResults += @{
309+
message = "Azure CLI is not logged in. Please login to Azure CLI using 'az login -t `"00000000-0000-0000-0000-000000000000}`"', replacing the empty GUID with your tenant ID."
310+
result = "Failure"
311+
}
312+
$hasFailure = $true
313+
}
314+
315+
Write-Verbose "Showing check results"
316+
Write-Verbose $(ConvertTo-Json $checkResults -Depth 100)
317+
$checkResults | ForEach-Object {[PSCustomObject]$_} | Format-Table -Property @{
318+
Label = "Check Result"; Expression = {
319+
switch ($_.result) {
320+
'Success' { $color = "92"; break }
321+
'Failure' { $color = "91"; break }
322+
'Warning' { $color = "93"; break }
323+
default { $color = "0" }
324+
}
325+
$e = [char]27
326+
"$e[${color}m$($_.result)${e}[0m"
327+
}
328+
}, @{ Label = "Check Details"; Expression = {$_.message} } -AutoSize -Wrap
329+
330+
if($hasFailure) {
331+
Write-ToConsoleLog "Software requirements have no been met, please review and install the missing software." -IsError
332+
Write-ToConsoleLog "Cannot continue with Deployment..." -IsError
333+
throw "Software requirements have no been met, please review and install the missing software."
334+
}
335+
336+
Write-ToConsoleLog "All software requirements have been met." -IsSuccess
337+
}
338+
277339
function Get-ManagementGroupChildrenRecursive {
278340
param (
279341
[object[]]$ManagementGroups,
@@ -396,10 +458,79 @@ function Remove-PlatformLandingZone {
396458
}
397459
}
398460

461+
function Remove-DeploymentsForScope {
462+
[CmdletBinding(SupportsShouldProcess = $true)]
463+
param (
464+
[string]$ScopeType,
465+
[string]$ScopeNameForLogs,
466+
[string]$ScopeId,
467+
[int]$ThrottleLimit,
468+
[switch]$PlanMode
469+
)
470+
471+
if(-not $PSCmdlet.ShouldProcess("Delete Deployments", "delete")) {
472+
return
473+
}
474+
475+
$funcWriteToConsoleLog = ${function:Write-ToConsoleLog}.ToString()
476+
$isSubscriptionScope = $ScopeType -eq "subscription"
477+
478+
Write-ToConsoleLog "Checking for deployments to delete in $($ScopeType): $ScopeNameForLogs" -NoNewLine
479+
480+
$deployments = @()
481+
if ($isSubscriptionScope) {
482+
$deployments = (az deployment sub list --subscription $ScopeId --query "[].name" -o json) | ConvertFrom-Json
483+
} else {
484+
$deployments = (az deployment mg list --management-group-id $ScopeId --query "[].name" -o json) | ConvertFrom-Json
485+
}
486+
487+
if ($deployments -and $deployments.Count -gt 0) {
488+
Write-ToConsoleLog "Found $($deployments.Count) deployment(s) in $($ScopeType): $scopeNameForLogs" -NoNewLine
489+
490+
$deployments | ForEach-Object -Parallel {
491+
$deploymentName = $_
492+
$scopeId = $using:ScopeId
493+
$scopeNameForLogs = $using:ScopeNameForLogs
494+
$funcWriteToConsoleLog = $using:funcWriteToConsoleLog
495+
${function:Write-ToConsoleLog} = $funcWriteToConsoleLog
496+
497+
Write-ToConsoleLog "Deleting deployment: $deploymentName from $($scopeType): $scopeNameForLogs" -NoNewLine
498+
$result = $null
499+
if($isSubscriptionScope) {
500+
if($using:PlanMode) {
501+
Write-ToConsoleLog "(Plan Mode) Would run: az deployment sub delete --subscription $scopeId --name $deploymentName" -NoNewLine -Color Gray
502+
} else {
503+
$result = az deployment sub delete --subscription $scopeId --name $deploymentName 2>&1
504+
}
505+
} else {
506+
if($using:PlanMode) {
507+
Write-ToConsoleLog "(Plan Mode) Would run: az deployment mg delete --management-group-id $scopeId --name $deploymentName" -NoNewLine -Color Gray
508+
} else {
509+
$result = az deployment mg delete --management-group-id $scopeId --name $deploymentName 2>&1
510+
}
511+
}
512+
513+
if (!$result) {
514+
Write-ToConsoleLog "Deleted deployment: $deploymentName from $($scopeType): $scopeNameForLogs" -NoNewLine
515+
} else {
516+
Write-ToConsoleLog "Failed to delete deployment: $deploymentName from $($scopeType): $scopeNameForLogs" -IsWarning -NoNewLine
517+
}
518+
} -ThrottleLimit $using:ThrottleLimit
519+
520+
Write-ToConsoleLog "All deployments processed in $($scopeType): $scopeNameForLogs" -NoNewLine
521+
} else {
522+
Write-ToConsoleLog "No deployments found in $($scopeType): $scopeNameForLogs, skipping." -NoNewLine
523+
}
524+
}
525+
526+
# Main execution starts here
399527
if ($PSCmdlet.ShouldProcess("Delete Management Groups and Clean Subscriptions", "delete")) {
400528

529+
Test-RequiredTooling
530+
401531
$funcWriteToConsoleLog = ${function:Write-ToConsoleLog}.ToString()
402532
$funcRemoveOrphanedRoleAssignmentsForScope = ${function:Remove-OrphanedRoleAssignmentsForScope}.ToString()
533+
$funcRemoveDeploymentsForScope = ${function:Remove-DeploymentsForScope}.ToString()
403534

404535
if($BypassConfirmation) {
405536
Write-ToConsoleLog "Bypass confirmation enabled, proceeding without prompts..." -IsWarning
@@ -593,41 +724,17 @@ function Remove-PlatformLandingZone {
593724
$deleteTargetManagementGroups = $using:DeleteTargetManagementGroups
594725
$funcWriteToConsoleLog = $using:funcWriteToConsoleLog
595726
${function:Write-ToConsoleLog} = $funcWriteToConsoleLog
727+
$funcRemoveDeploymentsForScope = $using:funcRemoveDeploymentsForScope
728+
${function:Remove-DeploymentsForScope} = $funcRemoveDeploymentsForScope
596729

597730
# Only delete deployments if this management group is not being deleted
598731
if(-not $deleteTargetManagementGroups) {
599-
Write-ToConsoleLog "Checking for management group level deployments to delete in management group: $managementGroupId ($managementGroupDisplayName)" -NoNewLine
600-
$deployments = (az deployment mg list --management-group-id $managementGroupId --query "[].name" -o json) | ConvertFrom-Json
601-
602-
if ($deployments -and $deployments.Count -gt 0) {
603-
Write-ToConsoleLog "Found $($deployments.Count) deployment(s) in management group: $managementGroupId ($managementGroupDisplayName)" -NoNewLine
604-
605-
$deployments | ForEach-Object -Parallel {
606-
$deploymentName = $_
607-
$managementGroupId = $using:managementGroupId
608-
$managementGroupDisplayName = $using:managementGroupDisplayName
609-
$funcWriteToConsoleLog = $using:funcWriteToConsoleLog
610-
${function:Write-ToConsoleLog} = $funcWriteToConsoleLog
611-
612-
Write-ToConsoleLog "Deleting deployment: $deploymentName from management group: $managementGroupId ($managementGroupDisplayName)" -NoNewLine
613-
$result = $null
614-
if($using:PlanMode) {
615-
Write-ToConsoleLog "(Plan Mode) Would run: az deployment mg delete --management-group-id $managementGroupId --name $deploymentName" -NoNewLine -Color Gray
616-
} else {
617-
$result = az deployment mg delete --management-group-id $managementGroupId --name $deploymentName 2>&1
618-
}
619-
620-
if (!$result) {
621-
Write-ToConsoleLog "Deleted deployment: $deploymentName from management group: $managementGroupId ($managementGroupDisplayName)" -NoNewLine
622-
} else {
623-
Write-ToConsoleLog "Failed to delete deployment: $deploymentName from management group: $managementGroupId ($managementGroupDisplayName)" -IsWarning -NoNewLine
624-
}
625-
} -ThrottleLimit $using:ThrottleLimit
626-
627-
Write-ToConsoleLog "All deployments processed in management group: $managementGroupId ($managementGroupDisplayName)" -NoNewLine
628-
} else {
629-
Write-ToConsoleLog "No deployments found in management group: $managementGroupId ($managementGroupDisplayName), skipping." -NoNewLine
630-
}
732+
Remove-DeploymentsForScope `
733+
-ScopeType "management group" `
734+
-ScopeNameForLogs "$managementGroupId ($managementGroupDisplayName)" `
735+
-ScopeId $managementGroupId `
736+
-ThrottleLimit $using:ThrottleLimit `
737+
-PlanMode:$using:PlanMode
631738
} else {
632739
Write-ToConsoleLog "Skipping deployment deletion for management group: $managementGroupId ($managementGroupDisplayName) as it is being deleted" -NoNewLine
633740
}
@@ -702,6 +809,8 @@ function Remove-PlatformLandingZone {
702809
${function:Write-ToConsoleLog} = $funcWriteToConsoleLog
703810
$funcRemoveOrphanedRoleAssignmentsForScope = $using:funcRemoveOrphanedRoleAssignmentsForScope
704811
${function:Remove-OrphanedRoleAssignmentsForScope} = $funcRemoveOrphanedRoleAssignmentsForScope
812+
$funcRemoveDeploymentsForScope = $using:funcRemoveDeploymentsForScope
813+
${function:Remove-DeploymentsForScope} = $funcRemoveDeploymentsForScope
705814

706815
$subscription = $_
707816
Write-ToConsoleLog "Finding resource groups for subscription: $($subscription.Name) (ID: $($subscription.Id))" -NoNewline
@@ -815,37 +924,12 @@ function Remove-PlatformLandingZone {
815924
}
816925

817926
if(-not $using:SkipDeploymentDeletion) {
818-
Write-ToConsoleLog "Checking for subscription level deployments to delete in subscription: $($subscription.Name) (ID: $($subscription.Id))"
819-
$deployments = (az deployment sub list --subscription $subscription.Id --query "[].name" -o json) | ConvertFrom-Json
820-
821-
if ($deployments -and $deployments.Count -gt 0) {
822-
Write-ToConsoleLog "Found $($deployments.Count) deployment(s) in subscription: $($subscription.Name) (ID: $($subscription.Id))"
823-
824-
$deployments | ForEach-Object -Parallel {
825-
$deploymentName = $_
826-
$subscription = $using:subscription
827-
$funcWriteToConsoleLog = $using:funcWriteToConsoleLog
828-
${function:Write-ToConsoleLog} = $funcWriteToConsoleLog
829-
830-
Write-ToConsoleLog "Deleting deployment: $deploymentName in subscription: $($subscription.Name) (ID: $($subscription.Id))" -NoNewLine
831-
$result = $null
832-
if($using:PlanMode) {
833-
Write-ToConsoleLog "(Plan Mode) Would run: az deployment sub delete --name $deploymentName --subscription $($subscription.Id)" -NoNewLine -Color Gray
834-
} else {
835-
$result = az deployment sub delete --name $deploymentName --subscription $subscription.Id 2>&1
836-
}
837-
838-
if (!$result) {
839-
Write-ToConsoleLog "Deleted deployment: $deploymentName in subscription: $($subscription.Name) (ID: $($subscription.Id))" -NoNewLine
840-
} else {
841-
Write-ToConsoleLog "Failed to delete deployment: $deploymentName in subscription: $($subscription.Name) (ID: $($subscription.Id))" -IsWarning -NoNewLine
842-
}
843-
} -ThrottleLimit $using:ThrottleLimit
844-
845-
Write-ToConsoleLog "All deployments processed in subscription: $($subscription.Name) (ID: $($subscription.Id))" -NoNewLine
846-
} else {
847-
Write-ToConsoleLog "No deployments found in subscription: $($subscription.Name) (ID: $($subscription.Id)), skipping." -NoNewLine
848-
}
927+
Remove-DeploymentsForScope `
928+
-ScopeType "subscription" `
929+
-ScopeNameForLogs "$($subscription.Name) (ID: $($subscription.Id))" `
930+
-ScopeId $subscription.Id `
931+
-ThrottleLimit $using:ThrottleLimit `
932+
-PlanMode:$using:PlanMode
849933
} else {
850934
Write-ToConsoleLog "Skipping subscription level deployment deletion in subscription: $($subscription.Name) (ID: $($subscription.Id))" -NoNewLine
851935
}

0 commit comments

Comments
 (0)