Skip to content

{backup} az backup Fix live testing using storage accounts and improve RG teardown#33749

Open
zubairabid wants to merge 2 commits into
Azure:devfrom
zubairabid:zubair/maintenance
Open

{backup} az backup Fix live testing using storage accounts and improve RG teardown#33749
zubairabid wants to merge 2 commits into
Azure:devfrom
zubairabid:zubair/maintenance

Conversation

@zubairabid

@zubairabid zubairabid commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Related command

Description

Testing Guide

History Notes

[Component Name 1] BREAKING CHANGE: az command a: Make some customer-facing breaking change
[Component Name 2] az command b: Add some customer-facing feature


This checklist is used to make sure that common guidelines for a pull request are followed.

🤖 PR Validation — ❌ Action needed

Breaking Changes Tests
❌ 2 ❌ 128/130
❌AzureCLI-BreakingChangeTest
❌appservice
rule cmd_name rule_message suggest_message
1012 - SubgroupRemove webapp troubleshoot sub group webapp troubleshoot removed please confirm sub group webapp troubleshoot removed
❌cognitiveservices
rule cmd_name rule_message suggest_message
1012 - SubgroupRemove cognitiveservices account compute sub group cognitiveservices account compute removed please confirm sub group cognitiveservices account compute removed

Please submit your Breaking Change Pre-announcement ASAP if you haven't already. Please note:

  • Breaking changes can only be merged during the designated breaking change window
  • A pre-announcement must be released at least one month in advance

For more details on how to introduce breaking changes, refer to the documentation: azure-cli/doc/how_to_introduce_breaking_changes.md

❌AzureCLI-FullTest
️✔️acr
️✔️latest
️✔️3.12
️✔️3.14
️✔️acs
️✔️latest
️✔️3.12
️✔️3.14
️✔️advisor
️✔️latest
️✔️3.12
️✔️3.14
️✔️ams
️✔️latest
️✔️3.12
️✔️3.14
️✔️apim
️✔️latest
️✔️3.12
️✔️3.14
️✔️appconfig
️✔️latest
️✔️3.12
️✔️3.14
️✔️appservice
️✔️latest
️✔️3.12
️✔️3.14
️✔️aro
️✔️latest
️✔️3.12
️✔️3.14
❌backup
❌latest
❌3.12
Type Test Case Error Message Line
Failed test_backup_rg_mapping self = <azure.cli.command_modules.backup.tests.latest.test_backup_commands.BackupTests testMethod=test_backup_rg_mapping>
resource_group = 'AzureBackupRG_clitest_000001'
vault_name = 'clitest-vault000002', vm1 = 'clitest-vm000003'
policy1 = 'clitest-item000005', policy2 = 'clitest-item000006'

    @ResourceGroupPreparer(name_prefix="AzureBackupRG_clitest_", location="centraluseuap")
    @VaultPreparer()
    @VMPreparer(parameter_name='vm1')
    @ItemPreparer(vm_parameter_name='vm1')
    @PolicyPreparer(parameter_name='policy1', instant_rp_days='4')
    @PolicyPreparer(parameter_name='policy2', instant_rp_days='2')
    def test_backup_rg_mapping(self, resource_group, vault_name, vm1, policy1, policy2):
        self.kwargs.update({
            'rg': resource_group,
            'vault': vault_name,
            'vm1': vm1,
            'policy1': policy1,
            'policy2': policy2,
            'default': 'DefaultPolicy',
            'resource_graph': '/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard'
        })
        # associate vault with an already present resource guard
>       self.cmd('backup vault resource-guard-mapping update -g {rg} -n {vault} --resource-guard-id {resource_graph}', checks=[
            self.check('name', 'VaultProxy'),
            self.check('length(properties.resourceGuardOperationDetails)', 14)
        ])

src/azure-cli/azure/cli/command_modules/backup/tests/latest/test_backup_commands.py:1697: 
                                        
src/azure-cli-testsdk/azure/cli/testsdk/base.py:177: in cmd
    return execute(self.cli_ctx, command, expect_failure=expect_failure).assert_with_checks(checks)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/azure-cli-testsdk/azure/cli/testsdk/base.py:278: in assert_with_checks
    c(self)
                                        

self = <azure.cli.testsdk.checkers.JMESPathCheck object at 0x7f322f9bed20>
execution_result = <azure.cli.testsdk.base.ExecutionResult object at 0x7f322f9bf230>

    def call(self, execution_result):
        json_value = execution_result.get_output_in_json()
        actual_result = None
        try:
            actual_result = jmespath.search(self._query, json_value,
                                            jmespath.Options(collections.OrderedDict))
        except jmespath.exceptions.JMESPathTypeError:
            raise JMESPathCheckAssertionError(self._query, self._expected_result, actual_result,
                                              execution_result.output)
        if self._case_sensitive:
            equals = actual_result == self._expected_result or str(actual_result) == str(self._expected_result)
        else:
            equals = actual_result == self._expected_result <br>                or str(actual_result).lower() == str(self._expected_result).lower()
        if not equals:
            if actual_result:
>               raise JMESPathCheckAssertionError(self._query, self._expected_result, actual_result,
                                                  execution_result.output)
E               azure.cli.testsdk.exceptions.JMESPathCheckAssertionError: Query 'length(properties.resourceGuardOperationDetails)' doesn't yield expected value '14', instead the actual value is '9'. Data: 
E               {
E                 "eTag": null,
E                 "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.RecoveryServices/vaults/clitest-vault000002/backupResourceGuardProxies/VaultProxy",
E                 "location": null,
E                 "name": "VaultProxy",
E                 "properties": {
E                   "description": "resource guard for CLI automated test",
E                   "lastUpdatedTime": "2025-10-27T12:43:09.7627603Z",
E                   "resourceGuardOperationDetails": [
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/deleteProtectedItemRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems/delete"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/updateProtectedItemRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems/write"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/updateProtectionPolicyRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupPolicies/write"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/deleteResourceGuardProxyRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupResourceGuardProxies/delete"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/getBackupSecurityPINRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupSecurityPIN/action"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/disableSoftDeleteRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupconfig/write"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/stopProtectionWithRetainDataRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems/write#stopProtectionWithRetainData"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/reduceImmutabilityStateRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/write#reduceImmutabilityState"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/deleteMABIdentityRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/registeredIdentities/delete"
E                     }
E                   ],
E                   "resourceGuardResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard"
E                 },
E                 "resourceGroup": "AzureBackupRG_clitest_000001",
E                 "tags": null,
E                 "type": "Microsoft.RecoveryServices/vaults/backupResourceGuardProxies"
E               }

src/azure-cli-testsdk/azure/cli/testsdk/checkers.py:34: JMESPathCheckAssertionError
azure/cli/command_modules/backup/tests/latest/test_backup_commands.py:1679
❌3.14
Type Test Case Error Message Line
Failed test_backup_rg_mapping self = <azure.cli.command_modules.backup.tests.latest.test_backup_commands.BackupTests testMethod=test_backup_rg_mapping>
resource_group = 'AzureBackupRG_clitest_000001'
vault_name = 'clitest-vault000002', vm1 = 'clitest-vm000003'
policy1 = 'clitest-item000005', policy2 = 'clitest-item000006'

    @ResourceGroupPreparer(name_prefix="AzureBackupRG_clitest_", location="centraluseuap")
    @VaultPreparer()
    @VMPreparer(parameter_name='vm1')
    @ItemPreparer(vm_parameter_name='vm1')
    @PolicyPreparer(parameter_name='policy1', instant_rp_days='4')
    @PolicyPreparer(parameter_name='policy2', instant_rp_days='2')
    def test_backup_rg_mapping(self, resource_group, vault_name, vm1, policy1, policy2):
        self.kwargs.update({
            'rg': resource_group,
            'vault': vault_name,
            'vm1': vm1,
            'policy1': policy1,
            'policy2': policy2,
            'default': 'DefaultPolicy',
            'resource_graph': '/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard'
        })
        # associate vault with an already present resource guard
>       self.cmd('backup vault resource-guard-mapping update -g {rg} -n {vault} --resource-guard-id {resource_graph}', checks=[
            self.check('name', 'VaultProxy'),
            self.check('length(properties.resourceGuardOperationDetails)', 14)
        ])

src/azure-cli/azure/cli/command_modules/backup/tests/latest/test_backup_commands.py:1697: 
                                        
src/azure-cli-testsdk/azure/cli/testsdk/base.py:177: in cmd
    return execute(self.cli_ctx, command, expect_failure=expect_failure).assert_with_checks(checks)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/azure-cli-testsdk/azure/cli/testsdk/base.py:278: in assert_with_checks
    c(self)
                                        

self = <azure.cli.testsdk.checkers.JMESPathCheck object at 0x7f952ab82490>
execution_result = <azure.cli.testsdk.base.ExecutionResult object at 0x7f952abc79b0>

    def call(self, execution_result):
        json_value = execution_result.get_output_in_json()
        actual_result = None
        try:
            actual_result = jmespath.search(self._query, json_value,
                                            jmespath.Options(collections.OrderedDict))
        except jmespath.exceptions.JMESPathTypeError:
            raise JMESPathCheckAssertionError(self._query, self._expected_result, actual_result,
                                              execution_result.output)
        if self._case_sensitive:
            equals = actual_result == self._expected_result or str(actual_result) == str(self._expected_result)
        else:
            equals = actual_result == self._expected_result <br>                or str(actual_result).lower() == str(self._expected_result).lower()
        if not equals:
            if actual_result:
>               raise JMESPathCheckAssertionError(self._query, self._expected_result, actual_result,
                                                  execution_result.output)
E               azure.cli.testsdk.exceptions.JMESPathCheckAssertionError: Query 'length(properties.resourceGuardOperationDetails)' doesn't yield expected value '14', instead the actual value is '9'. Data: 
E               {
E                 "eTag": null,
E                 "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.RecoveryServices/vaults/clitest-vault000002/backupResourceGuardProxies/VaultProxy",
E                 "location": null,
E                 "name": "VaultProxy",
E                 "properties": {
E                   "description": "resource guard for CLI automated test",
E                   "lastUpdatedTime": "2025-10-27T12:43:09.7627603Z",
E                   "resourceGuardOperationDetails": [
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/deleteProtectedItemRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems/delete"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/updateProtectedItemRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems/write"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/updateProtectionPolicyRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupPolicies/write"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/deleteResourceGuardProxyRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupResourceGuardProxies/delete"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/getBackupSecurityPINRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupSecurityPIN/action"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/disableSoftDeleteRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupconfig/write"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/stopProtectionWithRetainDataRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems/write#stopProtectionWithRetainData"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/reduceImmutabilityStateRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/write#reduceImmutabilityState"
E                     },
E                     {
E                       "defaultResourceRequest": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard/deleteMABIdentityRequests/default",
E                       "vaultCriticalOperation": "Microsoft.RecoveryServices/vaults/registeredIdentities/delete"
E                     }
E                   ],
E                   "resourceGuardResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest-rg/providers/Microsoft.DataProtection/resourceGuards/clitest-resource-guard"
E                 },
E                 "resourceGroup": "AzureBackupRG_clitest_000001",
E                 "tags": null,
E                 "type": "Microsoft.RecoveryServices/vaults/backupResourceGuardProxies"
E               }

src/azure-cli-testsdk/azure/cli/testsdk/checkers.py:34: JMESPathCheckAssertionError
azure/cli/command_modules/backup/tests/latest/test_backup_commands.py:1679
️✔️batch
️✔️latest
️✔️3.12
️✔️3.14
️✔️batchai
️✔️latest
️✔️3.12
️✔️3.14
️✔️billing
️✔️latest
️✔️3.12
️✔️3.14
️✔️botservice
️✔️latest
️✔️3.12
️✔️3.14
️✔️cloud
️✔️latest
️✔️3.12
️✔️3.14
️✔️cognitiveservices
️✔️latest
️✔️3.12
️✔️3.14
️✔️compute_recommender
️✔️latest
️✔️3.12
️✔️3.14
️✔️computefleet
️✔️latest
️✔️3.12
️✔️3.14
️✔️config
️✔️latest
️✔️3.12
️✔️3.14
️✔️configure
️✔️latest
️✔️3.12
️✔️3.14
️✔️consumption
️✔️latest
️✔️3.12
️✔️3.14
️✔️container
️✔️latest
️✔️3.12
️✔️3.14
️✔️containerapp
️✔️latest
️✔️3.12
️✔️3.14
️✔️core
️✔️latest
️✔️3.12
️✔️3.14
️✔️cosmosdb
️✔️latest
️✔️3.12
️✔️3.14
️✔️databoxedge
️✔️latest
️✔️3.12
️✔️3.14
️✔️dls
️✔️latest
️✔️3.12
️✔️3.14
️✔️dms
️✔️latest
️✔️3.12
️✔️3.14
️✔️eventgrid
️✔️latest
️✔️3.12
️✔️3.14
️✔️eventhubs
️✔️latest
️✔️3.12
️✔️3.14
️✔️feedback
️✔️latest
️✔️3.12
️✔️3.14
️✔️find
️✔️latest
️✔️3.12
️✔️3.14
️✔️hdinsight
️✔️latest
️✔️3.12
️✔️3.14
️✔️identity
️✔️latest
️✔️3.12
️✔️3.14
️✔️iot
️✔️latest
️✔️3.12
️✔️3.14
️✔️keyvault
️✔️latest
️✔️3.12
️✔️3.14
️✔️lab
️✔️latest
️✔️3.12
️✔️3.14
️✔️managedservices
️✔️latest
️✔️3.12
️✔️3.14
️✔️maps
️✔️latest
️✔️3.12
️✔️3.14
️✔️marketplaceordering
️✔️latest
️✔️3.12
️✔️3.14
️✔️monitor
️✔️latest
️✔️3.12
️✔️3.14
️✔️mysql
️✔️latest
️✔️3.12
️✔️3.14
️✔️netappfiles
️✔️latest
️✔️3.12
️✔️3.14
️✔️network
️✔️latest
️✔️3.12
️✔️3.14
️✔️policyinsights
️✔️latest
️✔️3.12
️✔️3.14
️✔️postgresql
️✔️latest
️✔️3.12
️✔️3.14
️✔️privatedns
️✔️latest
️✔️3.12
️✔️3.14
️✔️profile
️✔️latest
️✔️3.12
️✔️3.14
️✔️rdbms
️✔️latest
️✔️3.12
️✔️3.14
️✔️redis
️✔️latest
️✔️3.12
️✔️3.14
️✔️relay
️✔️latest
️✔️3.12
️✔️3.14
️✔️resource
️✔️latest
️✔️3.12
️✔️3.14
️✔️role
️✔️latest
️✔️3.12
️✔️3.14
️✔️search
️✔️latest
️✔️3.12
️✔️3.14
️✔️security
️✔️latest
️✔️3.12
️✔️3.14
️✔️servicebus
️✔️latest
️✔️3.12
️✔️3.14
️✔️serviceconnector
️✔️latest
️✔️3.12
️✔️3.14
️✔️servicefabric
️✔️latest
️✔️3.12
️✔️3.14
️✔️signalr
️✔️latest
️✔️3.12
️✔️3.14
️✔️sql
️✔️latest
️✔️3.12
️✔️3.14
️✔️sqlvm
️✔️latest
️✔️3.12
️✔️3.14
️✔️storage
️✔️latest
️✔️3.12
️✔️3.14
️✔️synapse
️✔️latest
️✔️3.12
️✔️3.14
️✔️telemetry
️✔️latest
️✔️3.12
️✔️3.14
️✔️util
️✔️latest
️✔️3.12
️✔️3.14
️✔️vm
️✔️latest
️✔️3.12
️✔️3.14

… RG teardown

The BCDR_StorageAccount_RequiredTags deny policy (management-group scope) blocks
the untagged storage account created by the test preparer, and the GPv1 'Storage'
kind is no longer allowed for new accounts. Add a self-contained
StorageAccountPreparer that creates the account with the required tags
(DisableLocalAuth=false, Reason, ETA, Owner) and kind StorageV2.

Consolidate to a single custom ResourceGroupPreparer (subclass of the testsdk
preparer) whose teardown clears any resource locks and retries on ScopeLocked,
since Azure Backup releases the AFS storage-account CanNotDelete lock
asynchronously. Remove the unused RGPreparer stopgap.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@zubairabid
zubairabid requested a review from a team as a code owner July 20, 2026 05:53
Copilot AI review requested due to automatic review settings July 20, 2026 05:53
@azure-client-tools-bot-prd

Copy link
Copy Markdown
Validation for Azure CLI Full Test Starting...

Thanks for your contribution!

@azure-client-tools-bot-prd

Copy link
Copy Markdown

Hi @zubairabid,
Since the current milestone time is less than 7 days, this pr will be reviewed in the next milestone.

@azure-client-tools-bot-prd

Copy link
Copy Markdown
Validation for Breaking Change Starting...

Thanks for your contribution!

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@microsoft-github-policy-service microsoft-github-policy-service Bot added the customer-reported Issues that are reported by GitHub users external to the Azure organization. label Jul 20, 2026
@microsoft-github-policy-service

Copy link
Copy Markdown
Contributor

Thank you for your contribution @zubairabid! We will review the pull request and get back to you soon.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the az backup command module’s scenario-test infrastructure to make live testing more reliable when tests need to create storage accounts (e.g., under management-group tag policies) and to make resource group teardown more resilient to Azure Backup’s asynchronous lock behavior.

Changes:

  • Introduces backup-specific test preparers for storage accounts (policy-required tags, StorageV2) and resource groups (lock cleanup + retry on ScopeLocked).
  • Updates AFS backup tests to use the local custom preparers rather than the generic testsdk ones.
  • Refactors imports in backup test suites to align with the new preparer implementations.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
src/azure-cli/azure/cli/command_modules/backup/tests/latest/test_backup_commands.py Adjusts preparer imports; currently still uses testsdk StorageAccountPreparer (needs alignment with new custom preparer).
src/azure-cli/azure/cli/command_modules/backup/tests/latest/test_afs_commands.py Switches to using custom ResourceGroupPreparer/StorageAccountPreparer from .preparers for live testing.
src/azure-cli/azure/cli/command_modules/backup/tests/latest/preparers.py Adds custom preparers: storage account creation with required tags and improved RG teardown handling lock races.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@yonzhan

yonzhan commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

backup

…uard op count

Use the backup-local StorageAccountPreparer (StorageV2 + BCDR-required tags) in
test_backup_commands.py so the VM/CRR/restore tests' storage accounts satisfy the
BCDR_StorageAccount_RequiredTags deny policy (clears the RequestDisallowedByPolicy
failures). Bump test_backup_rg_mapping's expected resourceGuardOperationDetails
from 9 to 14 to match the current service critical-operations set (adds
backupCrossTenantVaultMappings/* and immutability duration/state operations).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@a0x1ab

a0x1ab commented Jul 22, 2026

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Command 'run

@VeryEarly

Copy link
Copy Markdown

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).

@VeryEarly

Copy link
Copy Markdown

hi @zubairabid

please check failed test

@VeryEarly VeryEarly self-assigned this Jul 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

act-codegen-extensibility-squad act-observability-squad Auto-Assign Auto assign by bot Backup customer-reported Issues that are reported by GitHub users external to the Azure organization. Storage az storage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants