Private/Azure/Get-PolicyDefinitionCached.ps1
|
function Get-PolicyDefinitionCached { <# .SYNOPSIS Retrieve Azure Policy definition with caching support. .DESCRIPTION Wrapper around Get-AzPolicyDefinition with in-memory caching to reduce redundant API calls. Includes retry logic for throttling and tracks cache statistics. .PARAMETER PolicyDefinitionId Resource ID of the policy definition to retrieve. .PARAMETER Cache Hashtable for caching policy definitions (shared across calls). .EXAMPLE $cache = @{} $policy = Get-PolicyDefinitionCached -PolicyDefinitionId $id -Cache $cache .OUTPUTS Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyDefinition #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$PolicyDefinitionId, [hashtable]$Cache = @{} ) # Initialize statistics if not already done if (-not $script:ApiCallStats) { Initialize-ApiStatistics } # Check cache first if ($Cache.ContainsKey($PolicyDefinitionId)) { Write-Debug "Cache HIT for policy definition: $PolicyDefinitionId" $script:ApiCallStats.CacheHits++ return $Cache[$PolicyDefinitionId] } # Cache miss Write-Debug "Cache MISS for policy definition: $PolicyDefinitionId" $script:ApiCallStats.CacheMisses++ # Fetch with retry logic try { Write-Debug "Fetching policy definition: $PolicyDefinitionId" $definition = Invoke-AzCommandWithRetry -Command { Get-AzPolicyDefinition -Id $PolicyDefinitionId -ErrorAction Stop } -OperationName "PolicyDefinition" # Track API type $script:ApiCallStats.PolicyDefinitionCalls++ # Cache the result $Cache[$PolicyDefinitionId] = $definition return $definition } catch { Write-Warning "Failed to get policy definition: $PolicyDefinitionId - $($_.Exception.Message)" throw } } |