Skip to content

[Az.RecoveryServices.Backup] Added suspend backup as MUA protected operation #27835

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public AzureWorkloadSQLDatabaseProtectedItem(ProtectedItemResource protectedItem
TimeSpan timeRemaining;
if (TimeSpan.TryParse(protectedItem.DeferredDeleteTimeRemaining, out timeRemaining))
{
DateOfPurge = protectedItem.DeferredDeleteTimeInUtc.Value.Add(timeRemaining);
DateOfPurge = DateTime.UtcNow.Add(timeRemaining);
}
}
DeleteState = EnumUtils.GetEnum<ItemDeleteState>("ToBeDeleted");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()

ItemBase itemBase = (ItemBase)ProviderData[ItemParams.Item];

string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
bool isMUAProtected = true;

// do validations
ValidateAzureFileShareDisableProtectionRequest(itemBase);

Expand All @@ -156,7 +159,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
protectedItemUri,
serviceClientRequest,
vaultName: vaultName,
resourceGroupName: resourceGroupName);
resourceGroupName: resourceGroupName,
auxiliaryAccessToken,
isMUAProtected,
true);
}

public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName];

ItemBase itemBase = (ItemBase)ProviderData[ItemParams.Item];

string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
Copy link
Preview

Copilot AI May 26, 2025

Choose a reason for hiding this comment

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

This initialization is duplicated from other providers. Consider refactoring into a shared helper method to reduce code duplication.

Suggested change
string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
string auxiliaryAccessToken = GetAuxiliaryAccessToken();

Copilot uses AI. Check for mistakes.

bool isMUAProtected = true;

// do validations
ValidateAzureWorkloadDisableProtectionRequest(itemBase);
Expand All @@ -152,7 +155,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
protectedItemUri,
serviceClientRequest,
vaultName: vaultName,
resourceGroupName: resourceGroupName);
resourceGroupName: resourceGroupName,
auxiliaryAccessToken,
isMUAProtected,
true);
}

public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName];

ItemBase itemBase = (ItemBase)ProviderData[ItemParams.Item];


string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
bool isMUAProtected = true;
Comment on lines +291 to +292
Copy link
Preview

Copilot AI May 26, 2025

Choose a reason for hiding this comment

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

This initialization of 'auxiliaryAccessToken' and the 'isMUAProtected' flag is duplicated across multiple providers. Consider refactoring into a shared helper to reduce code duplication.

Suggested change
string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
bool isMUAProtected = true;
(string auxiliaryAccessToken, bool isMUAProtected) = GetAuxiliaryAccessTokenAndMUAProtection();

Copilot uses AI. Check for mistakes.


// do validations
ValidateAzureVMDisableProtectionRequest(itemBase);

Expand All @@ -310,7 +313,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
protectedItemUri,
serviceClientRequest,
vaultName: vaultName,
resourceGroupName: resourceGroupName);
resourceGroupName: resourceGroupName,
auxiliaryAccessToken,
isMUAProtected,
true);
Copy link
Preview

Copilot AI May 26, 2025

Choose a reason for hiding this comment

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

[nitpick] Passing a positional boolean literal 'true' makes the argument’s intent unclear. Consider using a named argument or constant to clarify its purpose.

Suggested change
true);
enableValidation: true);

Copilot uses AI. Check for mistakes.

}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ public void TestAzureManagedVMRestore()
);
}

[Fact(Skip = "To re-record in next release")]
[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
[Trait(TestConstants.Workload, TestConstants.AzureVM)]
public void TestAzureVMMUA()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,10 +340,11 @@ function Test-AzureVMMUA
$location = "centraluseuap"
$resourceGroupName = "hiagarg"
$vaultName = "mua-pstest-vault"
$vmName = "VM;iaasvmcontainerv2;hiagarg;hiaganewvm2"
$vmFriendlyName = "hiaganewvm2"
$vmName = "VM;iaasvmcontainerv2;hiagarg;hiaganevm4"
$vmFriendlyName = "hiaganevm4"
# $resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/iaasvm-pstest-rg/providers/Microsoft.DataProtection/resourceGuards/mua-pstest-rguard"
$resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/hiagarg/providers/Microsoft.DataProtection/ResourceGuards/test1-rGuard" # HiagaPSTest1
# /subscriptions/063bf7bc-e4dc-4cde-8840-8416fbd7921e/resourcegroups/amchandnPERG/providers/Microsoft.DataProtection/resourceGuards/HiagaPSTest1
$resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/hiagarg/providers/Microsoft.DataProtection/ResourceGuards/test1-rGuard"
$lowerRetentionPolicy = "mua-vm-lowerDailyRet"

try
Expand All @@ -353,7 +354,21 @@ function Test-AzureVMMUA

# Enable protection on hiaganewVM2 with default policy
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vault.ID -Name "DefaultPolicy"
Enable-AzRecoveryServicesBackupProtection -Policy $pol -ResourceGroupName $resourceGroupName -Name $vmFriendlyName -VaultId $vault.ID

$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
if ($item -eq $null)
{
$item = Enable-AzRecoveryServicesBackupProtection -Policy $pol -ResourceGroupName $resourceGroupName -Name $vmFriendlyName -VaultId $vault.ID
}
else
{
Undo-AzRecoveryServicesBackupItemDeletion -Item $item -VaultId $vault.ID -Force
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
$enable = Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
Assert-True { $item.ProtectionState -eq "Protected" -or $item.ProtectionState -eq "IRPending"}
}


# create resource guard mapping
$resGuardMapping = Set-AzRecoveryServicesResourceGuardMapping -ResourceGuardId $resGuardId -VaultId $vault.ID
Expand All @@ -373,16 +388,30 @@ function Test-AzureVMMUA

# modify protection
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vault.ID -Name $lowerRetentionPolicy
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }

# modify protection with lower retention policy
Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID

# modify protection with regular policy
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vault.ID -Name "DefaultPolicy"
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM
Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID

# Start Suspend Bakcup scenario with MUA
$updateVault = Update-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vault.Name -ImmutabilityState Unlocked
Assert-True { $updateVault.Properties.ImmutabilitySettings.ImmutabilityState -eq "Unlocked" }

# Immutability needs to be enabled for suspend backup
$disableJob = Disable-AzRecoveryServicesBackupProtection -Item $item -VaultId $vault.ID -Force -RetainRecoveryPointsAsPerPolicy
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
Assert-True { $disableJob.Status -eq "Completed" }
Assert-True { $item.ProtectionState -eq "BackupsSuspended" }

$enable = Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID

$updateVault = Update-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vault.Name -ImmutabilityState Disabled
Assert-True { $updateVault.Properties.ImmutabilitySettings.ImmutabilityState -eq "Disabled" }
}
finally
{
Expand Down
Loading