Skip to content

Commit 418bf26

Browse files
authored
[Az.RecoveryServices.Backup] Added suspend backup as MUA protected operation (#27835)
1 parent 530d1bb commit 418bf26

File tree

9 files changed

+6180
-15552
lines changed

9 files changed

+6180
-15552
lines changed

src/RecoveryServices/RecoveryServices.Backup.Models/AzureVmWorkloadModels/AzureWorkloadSQLDatabaseProtectedItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public AzureWorkloadSQLDatabaseProtectedItem(ProtectedItemResource protectedItem
100100
TimeSpan timeRemaining;
101101
if (TimeSpan.TryParse(protectedItem.DeferredDeleteTimeRemaining, out timeRemaining))
102102
{
103-
DateOfPurge = protectedItem.DeferredDeleteTimeInUtc.Value.Add(timeRemaining);
103+
DateOfPurge = DateTime.UtcNow.Add(timeRemaining);
104104
}
105105
}
106106
DeleteState = EnumUtils.GetEnum<ItemDeleteState>("ToBeDeleted");

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureFilesPsBackupProvider.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
134134

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

137+
string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
138+
bool isMUAProtected = true;
139+
137140
// do validations
138141
ValidateAzureFileShareDisableProtectionRequest(itemBase);
139142

@@ -156,7 +159,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
156159
protectedItemUri,
157160
serviceClientRequest,
158161
vaultName: vaultName,
159-
resourceGroupName: resourceGroupName);
162+
resourceGroupName: resourceGroupName,
163+
auxiliaryAccessToken,
164+
isMUAProtected,
165+
true);
160166
}
161167

162168
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
129129
string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName];
130130

131131
ItemBase itemBase = (ItemBase)ProviderData[ItemParams.Item];
132+
133+
string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
134+
bool isMUAProtected = true;
132135

133136
// do validations
134137
ValidateAzureWorkloadDisableProtectionRequest(itemBase);
@@ -152,7 +155,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
152155
protectedItemUri,
153156
serviceClientRequest,
154157
vaultName: vaultName,
155-
resourceGroupName: resourceGroupName);
158+
resourceGroupName: resourceGroupName,
159+
auxiliaryAccessToken,
160+
isMUAProtected,
161+
true);
156162
}
157163

158164
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/IaasVmPsBackupProvider.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
287287
string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName];
288288

289289
ItemBase itemBase = (ItemBase)ProviderData[ItemParams.Item];
290-
290+
291+
string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
292+
bool isMUAProtected = true;
293+
291294
// do validations
292295
ValidateAzureVMDisableProtectionRequest(itemBase);
293296

@@ -310,7 +313,10 @@ public RestAzureNS.AzureOperationResponse<ProtectedItemResource> SuspendBackup()
310313
protectedItemUri,
311314
serviceClientRequest,
312315
vaultName: vaultName,
313-
resourceGroupName: resourceGroupName);
316+
resourceGroupName: resourceGroupName,
317+
auxiliaryAccessToken,
318+
isMUAProtected,
319+
true);
314320
}
315321

316322
/// <summary>

src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/IaasVm/ItemTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ public void TestAzureManagedVMRestore()
232232
);
233233
}
234234

235-
[Fact(Skip = "To re-record in next release")]
235+
[Fact]
236236
[Trait(Category.AcceptanceType, Category.CheckIn)]
237237
[Trait(TestConstants.Workload, TestConstants.AzureVM)]
238238
public void TestAzureVMMUA()

src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/IaasVm/ItemTests.ps1

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,11 @@ function Test-AzureVMMUA
340340
$location = "centraluseuap"
341341
$resourceGroupName = "hiagarg"
342342
$vaultName = "mua-pstest-vault"
343-
$vmName = "VM;iaasvmcontainerv2;hiagarg;hiaganewvm2"
344-
$vmFriendlyName = "hiaganewvm2"
343+
$vmName = "VM;iaasvmcontainerv2;hiagarg;hiaganevm4"
344+
$vmFriendlyName = "hiaganevm4"
345345
# $resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/iaasvm-pstest-rg/providers/Microsoft.DataProtection/resourceGuards/mua-pstest-rguard"
346-
$resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/hiagarg/providers/Microsoft.DataProtection/ResourceGuards/test1-rGuard" # HiagaPSTest1
346+
# /subscriptions/063bf7bc-e4dc-4cde-8840-8416fbd7921e/resourcegroups/amchandnPERG/providers/Microsoft.DataProtection/resourceGuards/HiagaPSTest1
347+
$resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/hiagarg/providers/Microsoft.DataProtection/ResourceGuards/test1-rGuard"
347348
$lowerRetentionPolicy = "mua-vm-lowerDailyRet"
348349

349350
try
@@ -353,7 +354,21 @@ function Test-AzureVMMUA
353354

354355
# Enable protection on hiaganewVM2 with default policy
355356
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vault.ID -Name "DefaultPolicy"
356-
Enable-AzRecoveryServicesBackupProtection -Policy $pol -ResourceGroupName $resourceGroupName -Name $vmFriendlyName -VaultId $vault.ID
357+
358+
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
359+
if ($item -eq $null)
360+
{
361+
$item = Enable-AzRecoveryServicesBackupProtection -Policy $pol -ResourceGroupName $resourceGroupName -Name $vmFriendlyName -VaultId $vault.ID
362+
}
363+
else
364+
{
365+
Undo-AzRecoveryServicesBackupItemDeletion -Item $item -VaultId $vault.ID -Force
366+
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
367+
$enable = Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID
368+
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
369+
Assert-True { $item.ProtectionState -eq "Protected" -or $item.ProtectionState -eq "IRPending"}
370+
}
371+
357372

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

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

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

381396
# modify protection with regular policy
382397
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vault.ID -Name "DefaultPolicy"
383-
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM
384-
Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID
398+
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
399+
Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID
400+
401+
# Start Suspend Bakcup scenario with MUA
402+
$updateVault = Update-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vault.Name -ImmutabilityState Unlocked
403+
Assert-True { $updateVault.Properties.ImmutabilitySettings.ImmutabilityState -eq "Unlocked" }
404+
405+
# Immutability needs to be enabled for suspend backup
406+
$disableJob = Disable-AzRecoveryServicesBackupProtection -Item $item -VaultId $vault.ID -Force -RetainRecoveryPointsAsPerPolicy
407+
$item = Get-AzRecoveryServicesBackupItem -VaultId $vault.ID -BackupManagementType AzureVM -WorkloadType AzureVM | Where-Object { $_.Name -match $vmFriendlyName }
408+
Assert-True { $disableJob.Status -eq "Completed" }
409+
Assert-True { $item.ProtectionState -eq "BackupsSuspended" }
410+
411+
$enable = Enable-AzRecoveryServicesBackupProtection -Item $item -Policy $pol -VaultId $vault.ID
385412

413+
$updateVault = Update-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vault.Name -ImmutabilityState Disabled
414+
Assert-True { $updateVault.Properties.ImmutabilitySettings.ImmutabilityState -eq "Disabled" }
386415
}
387416
finally
388417
{

0 commit comments

Comments
 (0)