output/20260723_011003/govviz/repo/pwsh/dev/functions/processALZPolicyAssignmentsChecker.ps1
|
function processALZPolicyAssignmentsChecker { Write-Host "Processing 'Azure Landing Zones (ALZ) Policy Assignment Checker' base data" $ALZLibraryRepositoryURI = 'https://github.com/Azure/Azure-Landing-Zones-Library.git' $workingPath = Get-Location Write-Host " Working directory is '$($workingPath)'" $AlZLibraryFolderName = "ALZ_Library_$(Get-Date -Format $FileTimeStampFormat)" $ALZLibraryPath = "$($OutputPath)/$($AlZLibraryFolderName)" if (-not (Test-Path -LiteralPath "$($ALZLibraryPath)")) { Write-Host " Creating temporary directory '$($ALZLibraryPath)'" $null = mkdir $ALZLibraryPath } else { Write-Host " Unexpected: The path '$($ALZLibraryPath)' already exists" throw } Write-Host " Switching to temporary directory '$($ALZLibraryPath)'" Set-Location $ALZLibraryPath $ALZCloneSuccess = $false try { Write-Host " Try cloning '$($ALZLibraryRepositoryURI)'" git clone $ALZLibraryRepositoryURI if (-not (Test-Path -LiteralPath "$($ALZLibraryPath)/Azure-Landing-Zones-Library" -PathType Container)) { $ALZCloneSuccess = $false Write-Host " Cloning '$($ALZLibraryRepositoryURI)' failed" Write-Host " Setting switch parameter '-ALZPolicyAssignmentsChecker' to false" $script:ALZPolicyAssignmentsChecker = $false $script:azAPICallConf['htParameters'].ALZPolicyAssignmentsChecker = $false Write-Host " Switching back to working directory '$($workingPath)'" Set-Location $workingPath } else { Write-Host " Cloning '$($ALZLibraryRepositoryURI)' succeeded" $ALZCloneSuccess = $true } } catch { $_ Write-Host " Cloning '$($ALZLibraryRepositoryURI)' failed" Write-Host " Setting switch parameter '-ALZPolicyAssignmentsChecker' to false" $script:ALZPolicyAssignmentsChecker = $false $script:azAPICallConf['htParameters'].ALZPolicyAssignmentsChecker = $false Write-Host " Switching back to working directory '$($workingPath)'" Set-Location $workingPath } if ($ALZCloneSuccess) { Write-Host " Switching to directory '$($ALZLibraryPath)/Azure-Landing-Zones-Library'" Set-Location "$($ALZLibraryPath)/Azure-Landing-Zones-Library" Write-Host ' Fetching the latest Azure Landing Zones Library releases' git fetch --tags Write-Host ' Getting the latest Azure Landing Zones Library release' $latestALZLibraryRelease = git tag --sort=-creatordate | Where-Object { $_ -match 'platform/alz' } | Select-Object -First 1 $latestALZLibraryReleaseURL = "https://github.com/Azure/Azure-Landing-Zones-Library/releases/tag/$latestALZLibraryRelease" $latestALZLibraryCommit = git rev-parse $latestALZLibraryRelease Write-Host ' Checking if the latest Azure Landing Zones Library release matches to an ESLZ release' git config --global advice.detachedHead false try { $latestALZLibraryReleaseRequest = Invoke-WebRequest -Uri "https://api.github.com/repos/azure/azure-landing-zones-library/releases/tags/$latestALZLibraryRelease" $latestALZLibraryReleaseBody = ($latestALZLibraryReleaseRequest | ConvertFrom-Json).body if ($latestALZLibraryReleaseRequest.StatusCode -eq 200) { $ESLZReleasePattern = 'https://github\.com/Azure/Enterprise-Scale/releases/tag/[^\s\)]*' $ESLZReleaseURL = [regex]::Match($latestALZLibraryReleaseBody, $ESLZReleasePattern).Value if ($ESLZReleaseURL) { $ESLZRelease = ([regex]::Match($latestALZLibraryReleaseBody, $ESLZReleasePattern).Value).split('/')[-1] } else { $ESLZRelease = $null $ESLZReleaseURL = $null } git checkout $latestALZLibraryCommit } } catch { Write-Host 'Release not found or error accessing the URL' $ESLZRelease = $null $ESLZReleaseURL = $null $script:ALZPolicyAssignmentsChecker = $false $script:azAPICallConf['htParameters'].ALZPolicyAssignmentsChecker = $false } $script:referenceALZPolicyAssignments = @{} $script:ALZpolicyDefinitionsTable = @{} $script:ALZPolicyAssignmentsPayloadFiles = @{} $script:ESLZRelease = $ESLZRelease $script:ESLZReleaseURL = $ESLZReleaseURL $script:latestALZLibraryReleaseURL = $latestALZLibraryReleaseURL $script:latestALZLibraryRelease = $latestALZLibraryRelease $script:latestALZLibraryCommit = $latestALZLibraryCommit $archetypesPath = '.\platform\alz\archetype_definitions' $policyAssignmentsPath = '.\platform\alz\policy_assignments' $archetypesDefinition = Get-ChildItem -Path $archetypesPath -Filter '*.json' function Test-ALZManagementGroupIds { param ( [string]$managementGroupIdTobeChecked ) $ALZMangementGroupFound = ($arrayEntitiesFromAPI.where( { $_.Type -eq 'Microsoft.Management/managementGroups' -and $_.id.split('/')[-1] -eq $managementGroupIdTobeChecked -and ($_.properties.parentNameChain -match $ManagementGroupId -or $managementGroupIdTobeChecked -eq $ManagementGroupId) })).id if ($null -eq $ALZMangementGroupFound) { return $false } else { return $true } return $ALZMangementGroupFound } try { # Define the variables and their default values $variableMap = @{ 'connectivity' = @{ Variable = $ALZManagementGroupsIds['connectivity']; Default = 'connectivity' } 'corp' = @{ Variable = $ALZManagementGroupsIds['corp']; Default = 'corp' } 'root' = @{ Variable = $ALZManagementGroupsIds['root']; Default = 'alz' } 'platform' = @{ Variable = $ALZManagementGroupsIds['platform']; Default = 'platform' } 'online' = @{ Variable = $ALZManagementGroupsIds['online']; Default = 'online' } 'sandbox' = @{ Variable = $ALZManagementGroupsIds['sandbox']; Default = 'sandbox' } 'decommissioned' = @{ Variable = $ALZManagementGroupsIds['decommissioned']; Default = 'decommissioned' } 'management' = @{ Variable = $ALZManagementGroupsIds['management']; Default = 'management' } 'identity' = @{ Variable = $ALZManagementGroupsIds['identity']; Default = 'identity' } 'landing_zones' = @{ Variable = $ALZManagementGroupsIds['landing_zones']; Default = 'landing_zones' } } $ALZManagementGroupsIds = $script:ALZManagementGroupsIds foreach ($archetype in $archetypesDefinition) { $key = ($archetype.BaseName -split '\.')[0] switch ($key) { 'connectivity' { if ($ALZManagementGroupsIds.containsKey('connectivity') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['connectivity'])) { $key = $ALZManagementGroupsIds['connectivity'] } else { if (Test-ALZManagementGroupIds $variableMap.connectivity.Default) { $key = $variableMap.connectivity.Default } else { $key = 'connectivity-notProvided' } } } 'corp' { if ($ALZManagementGroupsIds.containsKey('corp') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['corp'])) { $key = $ALZManagementGroupsIds['corp'] } else { if (Test-ALZManagementGroupIds $variableMap.corp.Default) { $key = $variableMap.corp.Default } else { $key = 'corp-notProvided' } } } 'root' { if ($ALZManagementGroupsIds.containsKey('root') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['root'])) { $key = $ALZManagementGroupsIds['root'] } else { if (Test-ALZManagementGroupIds $variableMap.root.Default) { $key = $variableMap.root.Default } else { $key = 'root-notProvided' } } } 'platform' { if ($ALZManagementGroupsIds.containsKey('platform') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['platform'])) { $key = $ALZManagementGroupsIds['platform'] } else { if (Test-ALZManagementGroupIds $variableMap.platform.Default) { $key = $variableMap.platform.Default } else { $key = 'platform-notProvided' } } } 'online' { if ($ALZManagementGroupsIds.containsKey('online') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['online'])) { $key = $ALZManagementGroupsIds['online'] } else { if (Test-ALZManagementGroupIds $variableMap.online.Default) { $key = $variableMap.online.Default } else { $key = 'online-notProvided' } } } 'sandbox' { if ($ALZManagementGroupsIds.containsKey('sandbox') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['sandbox'])) { $key = $ALZManagementGroupsIds['sandbox'] } else { if (Test-ALZManagementGroupIds $variableMap.sandbox.Default) { $key = $variableMap.sandbox.Default } else { $key = 'sandbox-notProvided' } } } 'decommissioned' { if ($ALZManagementGroupsIds.containsKey('decommissioned') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['decommissioned'])) { $key = $ALZManagementGroupsIds['decommissioned'] } else { if (Test-ALZManagementGroupIds $variableMap.decommissioned.Default) { $key = $variableMap.decommissioned.Default } else { $key = 'decommissioned-notProvided' } } } 'management' { if ($ALZManagementGroupsIds.containsKey('management') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['management'])) { $key = $ALZManagementGroupsIds['management'] } else { if (Test-ALZManagementGroupIds $variableMap.management.Default) { $key = $variableMap.management.Default } else { $key = 'management-notProvided' } } } 'identity' { if ($ALZManagementGroupsIds.containsKey('identity') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['identity'])) { $key = $ALZManagementGroupsIds['identity'] } else { if (Test-ALZManagementGroupIds $variableMap.identity.Default) { $key = $variableMap.identity.Default } else { $key = 'identity-notProvided' } } } 'landing_zones' { if ($ALZManagementGroupsIds.containsKey('landing_zones') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['landing_zones'])) { $key = $ALZManagementGroupsIds['landing_zones'] } else { if (Test-ALZManagementGroupIds $variableMap.landing_zones.Default) { $key = $variableMap.landing_zones.Default } else { $key = 'landing_zones-notProvided' } } } Default {} } $content = Get-Content $archetype.FullName | ConvertFrom-Json if ($content.policy_assignments) { $script:referenceALZPolicyAssignments[$key] = $content.policy_assignments $content.policy_assignments | ForEach-Object { $assignmentName = $_ $filename = "$assignmentName.alz_policy_assignment.json" $script:ALZPolicyAssignmentsPayloadFiles[$_] = $filename $PolicyContent = Get-Content -Path "$policyAssignmentsPath\$filename" | ConvertFrom-Json $script:ALZpolicyDefinitionsTable[$_] = $PolicyContent.properties.policyDefinitionId } } } # Output the result $script:referenceALZPolicyAssignments | ConvertTo-Json -Depth 10 | Out-File "$($OutputPath)/ALZPolicyAssignmentsChecker.json" Write-Host " Switching back to working directory '$($workingPath)'" Set-Location $workingPath Write-Host " Removing temporary directory '$($ALZLibraryPath)'" Remove-Item -Recurse -Force $ALZLibraryPath $currentALZPolicyAssignments = @{} $variableMapCalculated = @{} foreach ($item in $variableMap.GetEnumerator()) { switch ($item.Key) { 'connectivity' { if ($ALZManagementGroupsIds.containsKey('connectivity') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['connectivity'])) { $key = $ALZManagementGroupsIds['connectivity'] } else { if (Test-ALZManagementGroupIds $variableMap.connectivity.Default) { $key = $variableMap.connectivity.Default } else { $key = 'connectivity-notProvided' } } } 'corp' { if ($ALZManagementGroupsIds.containsKey('corp') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['corp'])) { $key = $ALZManagementGroupsIds['corp'] } else { if (Test-ALZManagementGroupIds $variableMap.corp.Default) { $key = $variableMap.corp.Default } else { $key = 'corp-notProvided' } } } 'root' { if ($ALZManagementGroupsIds.containsKey('root') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['root'])) { $key = $ALZManagementGroupsIds['root'] } else { if (Test-ALZManagementGroupIds $variableMap.root.Default) { $key = $variableMap.root.Default } else { $key = 'root-notProvided' } } } 'platform' { if ($ALZManagementGroupsIds.containsKey('platform') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['platform'])) { $key = $ALZManagementGroupsIds['platform'] } else { if (Test-ALZManagementGroupIds $variableMap.platform.Default) { $key = $variableMap.platform.Default } else { $key = 'platform-notProvided' } } } 'online' { if ($ALZManagementGroupsIds.containsKey('online') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['online'])) { $key = $ALZManagementGroupsIds['online'] } else { if (Test-ALZManagementGroupIds $variableMap.online.Default) { $key = $variableMap.online.Default } else { $key = 'online-notProvided' } } } 'sandbox' { if ($ALZManagementGroupsIds.containsKey('sandbox') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['sandbox'])) { $key = $ALZManagementGroupsIds['sandbox'] } else { if (Test-ALZManagementGroupIds $variableMap.sandbox.Default) { $key = $variableMap.sandbox.Default } else { $key = 'sandbox-notProvided' } } } 'decommissioned' { if ($ALZManagementGroupsIds.containsKey('decommissioned') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['decommissioned'])) { $key = $ALZManagementGroupsIds['decommissioned'] } else { if (Test-ALZManagementGroupIds $variableMap.decommissioned.Default) { $key = $variableMap.decommissioned.Default } else { $key = 'decommissioned-notProvided' } } } 'management' { if ($ALZManagementGroupsIds.containsKey('management') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['management'])) { $key = $ALZManagementGroupsIds['management'] } else { if (Test-ALZManagementGroupIds $variableMap.management.Default) { $key = $variableMap.management.Default } else { $key = 'management-notProvided' } } } 'identity' { if ($ALZManagementGroupsIds.containsKey('identity') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['identity'])) { $key = $ALZManagementGroupsIds['identity'] } else { if (Test-ALZManagementGroupIds $variableMap.identity.Default) { $key = $variableMap.identity.Default } else { $key = 'identity-notProvided' } } } 'landing_zones' { if ($ALZManagementGroupsIds.containsKey('landing_zones') -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds['landing_zones'])) { $key = $ALZManagementGroupsIds['landing_zones'] } else { if (Test-ALZManagementGroupIds $variableMap.landing_zones.Default) { $key = $variableMap.landing_zones.Default } else { $key = 'landing_zones-notProvided' } } } Default { } } $variableMapCalculated[$item.Key] = $key } $script:ALZArchetypeMgIdReference = $variableMapCalculated # Populate the hashtable foreach ($item in $variableMap.GetEnumerator()) { if ($null -ne $item.Value.Variable -and (Test-ALZManagementGroupIds $ALZManagementGroupsIds[$item.Value.Variable])) { $key = $item.Value.Variable } elseif (Test-ALZManagementGroupIds $ALZManagementGroupsIds[$item.Value.Default]) { $key = $item.Value.Default } else { $mg = $item.Value.Default $key = "$mg-notProvided" } $currentALZPolicyAssignments[$key] = @() } $htCacheAssignmentsPolicy.GetEnumerator() | ForEach-Object { if ($_.value.AssignmentScopeMgSubRg -eq 'Mg') { $assignmentName = ($_.key).split('/')[-1] $managementGroup = ($_.key).split('/')[4] if ($currentALZPolicyAssignments.ContainsKey($managementGroup)) { $currentALZPolicyAssignments[$managementGroup] += $assignmentName } else { $currentALZPolicyAssignments[$managementGroup] = @($assignmentName) } } } # Output the result $referenceALZPolicyAssignments = $script:referenceALZPolicyAssignments # Function to compare hashtables function Compare-ALZPolicyHashTables($array1, $array2) { $comparison = Compare-Object -ReferenceObject $array1 -DifferenceObject $array2 -PassThru | Where-Object { $_.SideIndicator -eq '=>' } return $comparison } # Compare the hashtables and find items in reference that are not in the current environment $differences = @{} foreach ($key in $referenceALZPolicyAssignments.Keys) { if ($currentALZPolicyAssignments.ContainsKey($key)) { $diff = Compare-ALZPolicyHashTables $currentALZPolicyAssignments[$key] $referenceALZPolicyAssignments[$key] if ($diff) { $differences[$key] = $diff } } else { # If the key doesn't exist in current environment, all items in reference are different $differences[$key] = $referenceALZPolicyAssignments[$key] #$differences[$key] = 'N/A' } } $script:ALZPolicyAssignmentsDifferences = $differences Remove-Item "$($OutputPath)/ALZPolicyAssignmentsChecker.json" -Force } catch { $script:ALZPolicyAssignmentsChecker = $false $script:azAPICallConf['htParameters'].ALZPolicyAssignmentsChecker = $false } } } |