@@ -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