From 911999de3a5199a0355930ca080fae48ad82be07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:34:58 +0000 Subject: [PATCH 1/6] Initial plan From 6ba8475c48e75e5ea19b8a7a05471954da67bd81 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:38:43 +0000 Subject: [PATCH 2/6] Fix subscription context handling in Get-AzRetirementRecommendation Co-authored-by: cocallaw <11371083+cocallaw@users.noreply.github.com> --- Public/Get-AzRetirementRecommendation.ps1 | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Public/Get-AzRetirementRecommendation.ps1 b/Public/Get-AzRetirementRecommendation.ps1 index 29bddf7..a462205 100644 --- a/Public/Get-AzRetirementRecommendation.ps1 +++ b/Public/Get-AzRetirementRecommendation.ps1 @@ -169,9 +169,25 @@ Gets recommendations using the REST API method $recommendations = if ($SubscriptionId) { # Query specific subscriptions + # Store the current context to restore later + $originalContext = Get-AzContext + foreach ($subId in $SubscriptionId) { Write-Verbose "Querying subscription via Az.Advisor: $subId" - Get-AzAdvisorRecommendation -Filter $filter | Where-Object $subcategoryFilter + + # Set context to the specific subscription + try { + $null = Set-AzContext -SubscriptionId $subId -ErrorAction Stop + Get-AzAdvisorRecommendation -Filter $filter | Where-Object $subcategoryFilter + } + catch { + Write-Warning "Failed to set context or query subscription $($subId): $_" + } + } + + # Restore the original context + if ($originalContext) { + $null = Set-AzContext -Context $originalContext } } else { From dd26f475ebcde9815ed3139acd34f00167a4ffff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:39:48 +0000 Subject: [PATCH 3/6] Add error handling for context restoration Co-authored-by: cocallaw <11371083+cocallaw@users.noreply.github.com> --- Public/Get-AzRetirementRecommendation.ps1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Public/Get-AzRetirementRecommendation.ps1 b/Public/Get-AzRetirementRecommendation.ps1 index a462205..5da452f 100644 --- a/Public/Get-AzRetirementRecommendation.ps1 +++ b/Public/Get-AzRetirementRecommendation.ps1 @@ -187,7 +187,12 @@ Gets recommendations using the REST API method # Restore the original context if ($originalContext) { - $null = Set-AzContext -Context $originalContext + try { + $null = Set-AzContext -Context $originalContext -ErrorAction Stop + } + catch { + Write-Warning "Failed to restore original Azure context: $_" + } } } else { From 9f92614606f3fe61a6f5e52118bcadcfa3be4b79 Mon Sep 17 00:00:00 2001 From: Corey Callaway Date: Tue, 13 Jan 2026 09:49:11 -0500 Subject: [PATCH 4/6] Update Public/Get-AzRetirementRecommendation.ps1 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Public/Get-AzRetirementRecommendation.ps1 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Public/Get-AzRetirementRecommendation.ps1 b/Public/Get-AzRetirementRecommendation.ps1 index 5da452f..c79b473 100644 --- a/Public/Get-AzRetirementRecommendation.ps1 +++ b/Public/Get-AzRetirementRecommendation.ps1 @@ -178,10 +178,18 @@ Gets recommendations using the REST API method # Set context to the specific subscription try { $null = Set-AzContext -SubscriptionId $subId -ErrorAction Stop + } + catch { + Write-Warning "Failed to set Azure context for subscription $($subId): $_" + continue + } + + # Query Advisor recommendations for the current subscription + try { Get-AzAdvisorRecommendation -Filter $filter | Where-Object $subcategoryFilter } catch { - Write-Warning "Failed to set context or query subscription $($subId): $_" + Write-Warning "Failed to query Advisor recommendations for subscription $($subId): $_" } } From 66105b4b6842a3ca79ca7758227dffa4a5bb7002 Mon Sep 17 00:00:00 2001 From: Corey Callaway Date: Tue, 13 Jan 2026 09:49:29 -0500 Subject: [PATCH 5/6] Update Public/Get-AzRetirementRecommendation.ps1 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Public/Get-AzRetirementRecommendation.ps1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Public/Get-AzRetirementRecommendation.ps1 b/Public/Get-AzRetirementRecommendation.ps1 index c79b473..0f4874d 100644 --- a/Public/Get-AzRetirementRecommendation.ps1 +++ b/Public/Get-AzRetirementRecommendation.ps1 @@ -177,7 +177,14 @@ Gets recommendations using the REST API method # Set context to the specific subscription try { - $null = Set-AzContext -SubscriptionId $subId -ErrorAction Stop + $context = Set-AzContext -SubscriptionId $subId -ErrorAction Stop + + # Verify that the context was actually set to the intended subscription + if (-not $context -or -not $context.Subscription -or $context.Subscription.Id -ne $subId) { + Write-Warning "Azure context for subscription $($subId) could not be verified. Skipping recommendation query for this subscription." + continue + } + } catch { Write-Warning "Failed to set Azure context for subscription $($subId): $_" From 39cd588d9f7b8dbb3c1543f657615f5a3a511336 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:56:55 +0000 Subject: [PATCH 6/6] Add test coverage for subscription context switching behavior Co-authored-by: cocallaw <11371083+cocallaw@users.noreply.github.com> --- Tests/AzRetirementMonitor.Tests.ps1 | 56 +++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/Tests/AzRetirementMonitor.Tests.ps1 b/Tests/AzRetirementMonitor.Tests.ps1 index 77efa1a..878415c 100644 --- a/Tests/AzRetirementMonitor.Tests.ps1 +++ b/Tests/AzRetirementMonitor.Tests.ps1 @@ -201,6 +201,62 @@ Describe "Get-AzRetirementRecommendation" { } } +Describe "Get-AzRetirementRecommendation Context Switching Logic" { + It "Should have context management code in the function" { + # Verify that the function source contains the necessary context management logic + $functionDef = (Get-Command Get-AzRetirementRecommendation).Definition + + # Check for Get-AzContext call to save original context + $functionDef | Should -Match 'Get-AzContext' + + # Check for Set-AzContext with SubscriptionId parameter + $functionDef | Should -Match 'Set-AzContext\s+-SubscriptionId' + + # Check for context verification logic + $functionDef | Should -Match 'could not be verified' + + # Check for context restoration with Context parameter + $functionDef | Should -Match 'Set-AzContext\s+-Context' + } + + It "Should have error handling for Set-AzContext failures" { + $functionDef = (Get-Command Get-AzRetirementRecommendation).Definition + + # Check for try-catch around Set-AzContext + $functionDef | Should -Match 'try\s*\{[^}]*Set-AzContext' + $functionDef | Should -Match 'Failed to set Azure context for subscription' + } + + It "Should have error handling for context restoration" { + $functionDef = (Get-Command Get-AzRetirementRecommendation).Definition + + # Check for error handling around context restoration + $functionDef | Should -Match 'Failed to restore original Azure context' + } + + It "Should have error handling for Get-AzAdvisorRecommendation failures" { + $functionDef = (Get-Command Get-AzRetirementRecommendation).Definition + + # Check for error handling around Get-AzAdvisorRecommendation + $functionDef | Should -Match 'Failed to query Advisor recommendations' + } + + It "Should verify subscription context after setting it" { + $functionDef = (Get-Command Get-AzRetirementRecommendation).Definition + + # Check that the function verifies the context was set correctly + $functionDef | Should -Match 'context\.Subscription\.Id' + $functionDef | Should -Match '\$subId' + } + + It "Should use continue statement to skip failed subscriptions" { + $functionDef = (Get-Command Get-AzRetirementRecommendation).Definition + + # Check for continue statements in error handling + $functionDef | Should -Match 'continue' + } +} + Describe "Get-AzRetirementMetadataItem" { It "Should have no parameters" { $cmd = Get-Command Get-AzRetirementMetadataItem