diff --git a/1-Collect/Get-AzureServices.ps1 b/1-Collect/Get-AzureServices.ps1 index 1e65484..6336b1f 100644 --- a/1-Collect/Get-AzureServices.ps1 +++ b/1-Collect/Get-AzureServices.ps1 @@ -377,15 +377,24 @@ foreach ($group in $groupedResources) { if ($uniqueLocations -isnot [System.Array]) { $uniqueLocations = @($uniqueLocations) } - If ($group.Group.ResourceSku -ne 'N/A') { - - $uniqueSkus = $group.Group.ResourceSku | Select-Object * -Unique - if ( $uniqueSkus -isnot [System.Array]) { - $uniqueSkus = @($uniqueSkus) + if ($group.Group.ResourceSku -ne 'N/A') { + $skuCounts = $group.Group | + Where-Object { $_.ResourceSku -is [object] } | + Group-Object -Property { + $_.ResourceSku | ConvertTo-Json -Compress + } + $implementedSkus = foreach ($skuGroup in $skuCounts) { + $skuObj = $skuGroup.Group[0].ResourceSku + $newSku = [ordered]@{} + foreach ($prop in $skuObj.PSObject.Properties) { + $newSku[$prop.Name] = $prop.Value + } + $newSku["count"] = $skuGroup.Count + [PSCustomObject]$newSku } - $summary += [PSCustomObject]@{ResourceCount = $group.Count; ResourceType = $resourceType; ImplementedSkus = $uniqueSkus; ImplementedRegions = $uniqueLocations; meterIds = $uniqueMeterIds } + $summary += [PSCustomObject]@{ResourceCount = $group.Count; ResourceType = $resourceType; ImplementedSkus = $implementedSkus; ImplementedRegions = $uniqueLocations; meterIds = $uniqueMeterIds } } - Else { + else { $summary += [PSCustomObject]@{ResourceCount = $group.Count; ResourceType = $resourceType; ImplementedSkus = @("N/A"); ImplementedRegions = $uniqueLocations; meterIds = $uniqueMeterIds } } } diff --git a/2-AvailabilityCheck/Get-AvailabilityInformation.ps1 b/2-AvailabilityCheck/Get-AvailabilityInformation.ps1 index 2ec8264..1f4f3c7 100644 --- a/2-AvailabilityCheck/Get-AvailabilityInformation.ps1 +++ b/2-AvailabilityCheck/Get-AvailabilityInformation.ps1 @@ -24,6 +24,9 @@ .NOTES - Requires Azure PowerShell module to be installed and authenticated. #> +param( + [Parameter(Mandatory = $false)][string]$SummaryFilePath = "$(Get-Location)\..\1-Collect\summary.json" +) function Out-JSONFile { param ( @@ -155,22 +158,21 @@ Function Get-ResourceTypeParameters { function Compare-ObjectsStrict { param( [psobject]$Object1, - [psobject]$Object2 + [psobject]$Object2, + [string[]]$ExcludeProperty = @("count") ) - write-verbose "Entering Compare-ObjectsStrict" - $norm1 = ($Object1.PSObject.Properties | + Write-Verbose "Entering Compare-ObjectsStrict" + # Filter out excluded properties + $props1 = $Object1.PSObject.Properties | Where-Object { $ExcludeProperty -notcontains $_.Name } + $props2 = $Object2.PSObject.Properties | Where-Object { $ExcludeProperty -notcontains $_.Name } + $norm1 = ($props1 | Sort-Object Name | ForEach-Object { "$($_.Name)=$($_.Value)" }) -join ';' + $norm2 = ($props2 | Sort-Object Name | ForEach-Object { "$($_.Name)=$($_.Value)" }) -join ';' - - $norm2 = ($Object2.PSObject.Properties | - Sort-Object Name | - ForEach-Object { "$($_.Name)=$($_.Value)" }) -join ';' - Write-Verbose "Comparing objects:" - Write-Verbose " Object1: $norm1" - Write-Verbose " Object2: $norm2" + Write-Verbose " Object1 (norm): $norm1" + Write-Verbose " Object2 (norm): $norm2" Write-Verbose " Match: $($norm1 -eq $norm2)" - return $norm1 -eq $norm2 } @@ -296,14 +298,13 @@ Function Get-ResourceType { } function Import-CurrentEnvironment { - $SummaryFilePath = "$(Get-Location)\..\1-Collect\summary.json" # Check if the summary file exists and load it if (Test-Path $SummaryFilePath) { - Write-Output " Loading summary file: ../1-Collect/summary.json" | Out-Host + Write-Output " Loading summary file: $SummaryFilePath" | Out-Host $CurrentEnvironment = Get-Content -Path $SummaryFilePath -raw | ConvertFrom-Json -depth 10 } else { - Write-Output "File 'summary.json' not found in '../1-Collect/summary.json'." + Write-Output "File '$SummaryFilePath' not found." exit 1 } # Check for empty SKUs and remove 'ResourceSkus' property if its value is 'N/A' in the current implementation data diff --git a/7-Report/Get-Report.ps1 b/7-Report/Get-Report.ps1 index ffb5e06..edacf63 100644 --- a/7-Report/Get-Report.ps1 +++ b/7-Report/Get-Report.ps1 @@ -98,6 +98,7 @@ Function Set-SvcAvailReportObj { [string]$resourceType, [int]$resourceCount, [array]$implementedRegions, + [string]$skuCount, [string]$sku, [string]$skuAvailability, [string]$serviceAvailability @@ -116,6 +117,7 @@ Function Set-SvcAvailReportObj { ResourceType = $resourceType ResourceCount = $resourceCount ImplementedRegions = ($implementedRegions -join ", ") + SKUCount = $skuCount sku = $sku "SKU available" = $skuAvailability "Service available" = $serviceAvailability @@ -145,21 +147,23 @@ If ($availabilityInfoPath) { if ($item.ImplementedSkus -and $item.ImplementedSkus[0] -ne "N/A") { if ( $regionAvailability -eq "Available") { ForEach ($sku in $item.SelectedRegion.SKUs) { - $skuName = ($sku.PSObject.Properties | Where-Object { $_.Name -ne 'available' } | ForEach-Object { $_.Value }) -join "_" - $reportItem = Set-SvcAvailReportObj -resourceType $resourceType -resourceCount $itemCount -implementedRegions $item.ImplementedRegions -sku $skuName -skuAvailability $sku.available -serviceAvailability $regionAvailability + $skuName = ($sku.PSObject.Properties | Where-Object { $_.Name -ne 'available' -and $_.Name -ne 'count' } | ForEach-Object { $_.Value }) -join "_" + $skuCount = $sku.count + $reportItem = Set-SvcAvailReportObj -resourceType $resourceType -resourceCount $itemCount -implementedRegions $item.ImplementedRegions -skuCount $skuCount -sku $skuName -skuAvailability $sku.available -serviceAvailability $regionAvailability $reportData += $reportItem } } else { ForEach ($sku in $item.ImplementedSkus) { - $skuName = ($sku.PSObject.Properties | Where-Object { $_.Name -ne 'available' } | ForEach-Object { $_.Value }) -join "_" - $reportItem = Set-SvcAvailReportObj -resourceType $resourceType -resourceCount $itemCount -implementedRegions $item.ImplementedRegions -sku $skuName -skuAvailability "false" -serviceAvailability $regionAvailability + $skuName = ($sku.PSObject.Properties | Where-Object { $_.Name -ne 'available' -and $_.Name -ne 'count' } | ForEach-Object { $_.Value }) -join "_" + $skuCount = $sku.count + $reportItem = Set-SvcAvailReportObj -resourceType $resourceType -resourceCount $itemCount -implementedRegions $item.ImplementedRegions -skuCount $skuCount -sku $skuName -skuAvailability "false" -serviceAvailability $regionAvailability $reportData += $reportItem } } } else { - $reportItem = Set-SvcAvailReportObj -resourceType $resourceType -resourceCount $itemCount -implementedRegions $item.ImplementedRegions -sku "N/A" -skuAvailability "N/A" -serviceAvailability $regionAvailability + $reportItem = Set-SvcAvailReportObj -resourceType $resourceType -resourceCount $itemCount -implementedRegions $item.ImplementedRegions -skuCount "N/A" -sku "N/A" -skuAvailability "N/A" -serviceAvailability $regionAvailability $reportData += $reportItem } }