utilities/pipelines/e2eValidation/resourceRemoval/helper/Get-ResourceIdsAsFormattedObjectList.ps1 (105 lines of code) (raw):
<#
.SYNOPSIS
Format the provide resource IDs into objects of resourceID, name & type
.DESCRIPTION
Format the provide resource IDs into objects of resourceID, name & type
.PARAMETER ResourceIds
Optional. The resource IDs to process
.EXAMPLE
Get-ResourceIdsAsFormattedObjectList -ResourceIds @('/subscriptions/<subscriptionID>/resourceGroups/test-analysisServices-rg/providers/Microsoft.Storage/storageAccounts/adpsxxazsaaspar01')
Returns an object @{
resourceId = '/subscriptions/<subscriptionID>/resourceGroups/test-analysisServices-rg/providers/Microsoft.Storage/storageAccounts/adpsxxazsaaspar01'
type = 'Microsoft.Storage/storageAccounts'
name = 'adpsxxazsaaspar01'
}
#>
function Get-ResourceIdsAsFormattedObjectList {
[CmdletBinding()]
param (
[Parameter(Mandatory = $false)]
[string[]] $ResourceIds = @()
)
$formattedResources = [System.Collections.ArrayList]@()
# If any resource is deployed at a resource group level, we store all resources in this resource group in this array. Essentially it's a cache.
$allResourceGroupResources = @()
foreach ($resourceId in $resourceIds) {
$idElements = $resourceId.Split('/')
switch ($idElements.Count) {
{ $PSItem -eq 5 } {
if ($idElements[2] -eq 'Microsoft.Management' -and $idElements[3] -eq 'managementGroups') {
# management-group level management group (e.g. '/providers/Microsoft.Management/managementGroups/testMG')
$formattedResources += @{
resourceId = $resourceId
type = $idElements[2, 3] -join '/'
}
} elseif ($idElements[2] -eq 'Microsoft.Subscription' -and $idElements[3] -eq 'aliases') {
# management-group level subscription alias (e.g., '/providers/Microsoft.Subscription/aliases/testSub')
$formattedResources += @{
resourceId = $resourceId
type = 'Microsoft.Subscription/aliases'
}
} else {
# subscription level resource group (e.g. '/subscriptions/<subId>/resourceGroups/myRG')
$formattedResources += @{
resourceId = $resourceId
type = 'Microsoft.Resources/resourceGroups'
}
}
break
}
{ $PSItem -eq 6 } {
# subscription-level resource group
$formattedResources += @{
resourceId = $resourceId
type = $idElements[4, 5] -join '/'
}
break
}
{ $PSItem -eq 7 } {
if (($resourceId.Split('/'))[3] -ne 'resourceGroups') {
# subscription-level resource
$formattedResources += @{
resourceId = $resourceId
type = $idElements[4, 5] -join '/'
}
} else {
# resource group-level
if ($allResourceGroupResources.Count -eq 0) {
$allResourceGroupResources = Get-AzResource -ResourceGroupName $resourceGroupName -Name '*'
}
$expandedResources = $allResourceGroupResources | Where-Object { $_.ResourceId.startswith($resourceId) }
$expandedResources = $expandedResources | Sort-Object -Culture 'en-US' -Descending -Property { $_.ResourceId.Split('/').Count }
foreach ($resource in $expandedResources) {
$formattedResources += @{
resourceId = $resource.ResourceId
type = $resource.Type
}
}
}
break
}
{ $PSItem -ge 8 } {
# child-resource level
# Find the last resource type reference in the resourceId.
# E.g. Microsoft.Automation/automationAccounts/provider/Microsoft.Authorization/roleAssignments/... returns the index of 'Microsoft.Authorization'
$indexOfResourceType = $idElements.IndexOf(($idElements -like 'Microsoft.**')[-1])
$type = $idElements[$indexOfResourceType, ($indexOfResourceType + 1)] -join '/'
# Concat rest of resource type along the ID
$partCounter = $indexOfResourceType + 1
while (-not ($partCounter + 2 -gt $idElements.Count - 1)) {
$type += ('/{0}' -f $idElements[($partCounter + 2)])
$partCounter = $partCounter + 2
}
$formattedResources += @{
resourceId = $resourceId
type = $type
}
break
}
Default {
throw "Failed to process resource ID [$resourceId]"
}
}
}
return $formattedResources
}