From c61d786a422de8c5e4d8596396db6af3ec162860 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Jul 2026 14:11:25 +0000 Subject: [PATCH 1/2] Initial plan From 28c569e9ffc7c7b08315fa23d08283adf22dbabb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Jul 2026 14:16:04 +0000 Subject: [PATCH 2/2] Fix policy assignment list scope parsing IndexError --- .../cli/command_modules/resource/policy.py | 6 +-- .../tests/latest/test_resource_validators.py | 40 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/resource/policy.py b/src/azure-cli/azure/cli/command_modules/resource/policy.py index 0ec51ec7ee6..436c7585174 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/policy.py +++ b/src/azure-cli/azure/cli/command_modules/resource/policy.py @@ -161,13 +161,13 @@ def ResolveScopeForList(self): ctx = self.ctx if has_value(ctx.args.scope): scope_parts = ctx.args.scope._data.split('/') - if scope_parts[1] == 'providers' and len(scope_parts) > 4: + if len(scope_parts) > 4 and scope_parts[1] == 'providers': ctx.args.management_group = scope_parts[4] ctx.args.resource_group = None - elif scope_parts[1] == 'subscriptions': + elif len(scope_parts) > 2 and scope_parts[1] == 'subscriptions': # store subscription from scope for later use self.subscription_from_scope = scope_parts[2] - if len(scope_parts) > 3: + if len(scope_parts) > 4 and scope_parts[3].lower() == 'resourcegroups': ctx.args.resource_group = scope_parts[4] else: ctx.args.resource_group = None diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_validators.py b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_validators.py index 2536cb57466..bfa2fc761c4 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_validators.py +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_validators.py @@ -13,6 +13,8 @@ _validate_deployment_name, validate_lock_parameters, ) +from azure.cli.command_modules.resource.policy import Common +from azure.cli.core.azclierror import InvalidArgumentValueError class NamespaceObject: @@ -142,5 +144,43 @@ def test_generate_deployment_name_from_file(self): self.assertEqual('deployment1', namespace.deployment_name) +class TestPolicyCommon(unittest.TestCase): + + @staticmethod + def _create_policy_command(scope): + cmd = mock.MagicMock() + cmd.ctx = mock.MagicMock() + cmd.ctx.args = mock.MagicMock() + cmd.ctx.args.scope = mock.MagicMock() + cmd.ctx.args.scope._data = scope + cmd.ctx.args.management_group = None + cmd.ctx.args.resource_group = None + cmd.subscription_from_scope = None + return cmd + + def test_resolve_scope_for_list_raises_for_short_scope(self): + cmd = self._create_policy_command('resource-group-name') + + with self.assertRaises(InvalidArgumentValueError): + Common.ResolveScopeForList(cmd) + + def test_resolve_scope_for_list_sets_resource_group_for_subscription_scope(self): + cmd = self._create_policy_command('/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg') + + Common.ResolveScopeForList(cmd) + + self.assertEqual('00000000-0000-0000-0000-000000000000', cmd.subscription_from_scope) + self.assertEqual('test-rg', cmd.ctx.args.resource_group) + self.assertIsNone(cmd.ctx.args.management_group) + + def test_resolve_scope_for_list_sets_management_group_for_mg_scope(self): + cmd = self._create_policy_command('/providers/Microsoft.Management/managementGroups/test-mg') + + Common.ResolveScopeForList(cmd) + + self.assertEqual('test-mg', cmd.ctx.args.management_group) + self.assertIsNone(cmd.ctx.args.resource_group) + + if __name__ == '__main__': unittest.main()