Skip to content

Commit 21b6283

Browse files
authored
Merge pull request Azure#10007 from MabOneSdk/users/sarath/softdelete
[RecoveryServices.Backup] Added SoftDelete Feature for IaaSVM
2 parents e8e41b5 + 48efe95 commit 21b6283

30 files changed

+852924
-12
lines changed

src/RecoveryServices/RecoveryServices.Backup.Helpers/RecoveryServices.Backup.Helpers.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.1-preview" />
15+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.2-preview" />
1616
<PackageReference Include="TimeZoneConverter" Version="3.0.0" />
1717
</ItemGroup>
1818

src/RecoveryServices/RecoveryServices.Backup.Models/AzureModels/AzureItem.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ public class AzureItem : ItemBase
5252
/// </summary>
5353
public AzureItemExtendedInfo ExtendedInfo { get; set; }
5454

55+
/// <summary>
56+
/// Date of purge for the item
57+
/// </summary>
58+
public DateTime? DateOfPurge { get; set; }
59+
60+
/// <summary>
61+
/// Indicates if the delete state of the item
62+
/// </summary>
63+
public ItemDeleteState DeleteState { get; set; }
64+
5565
public AzureItem(ProtectedItemResource protectedItemResource,
5666
string containerName, ContainerType containerType, string policyName)
5767
: base(protectedItemResource, containerName, containerType)

src/RecoveryServices/RecoveryServices.Backup.Models/AzureVmModels/AzureVmItem.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ public AzureVmItem(ProtectedItemResource protectedItemResource,
4646
ProtectionStatus = EnumUtils.GetEnum<ItemProtectionStatus>(protectedItem.ProtectionStatus);
4747
VirtualMachineId = protectedItem.VirtualMachineId;
4848
HealthStatus = protectedItem.HealthStatus;
49+
DateOfPurge = null;
50+
DeleteState = EnumUtils.GetEnum<ItemDeleteState>("NotDeleted");
51+
if (protectedItem.IsScheduledForDeferredDelete.HasValue)
52+
{
53+
DateOfPurge = protectedItem.DeferredDeleteTimeInUTC.Value.AddDays(14);
54+
DeleteState = EnumUtils.GetEnum<ItemDeleteState>("ToBeDeleted");
55+
}
4956
}
5057
}
5158

src/RecoveryServices/RecoveryServices.Backup.Models/CmdletParamEnums.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ public enum ItemParams
115115
ExpiryDateTimeUTC,
116116
StorageAccountName,
117117
BackupType,
118-
EnableCompression
118+
EnableCompression,
119+
DeleteState
119120
}
120121

121122
public enum ProtectionCheckParams

src/RecoveryServices/RecoveryServices.Backup.Models/CommonModels/Enums.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,22 @@ public enum ItemProtectionStatus
196196
Unhealthy,
197197
}
198198

199+
/// <summary>
200+
/// represents the delete state of the item
201+
/// </summary>
202+
public enum ItemDeleteState
203+
{
204+
/// <summary>
205+
/// in a softdeleted state
206+
/// </summary>
207+
ToBeDeleted = 1,
208+
209+
/// <summary>
210+
/// not deleted
211+
/// </summary>
212+
NotDeleted,
213+
}
214+
199215
/// <summary>
200216
/// State of the protection of the item by the recovery services vault.
201217
/// </summary>

src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.Designer.cs

Lines changed: 12 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,4 +574,7 @@ Please contact Microsoft for further assistance.</value>
574574
<data name="ProtectedItemsCountExceededException" xml:space="preserve">
575575
<value>Cannot configure backup for more than 100 VMs per policy</value>
576576
</data>
577+
<data name="SoftdeleteNotImplementedException" xml:space="preserve">
578+
<value>Undo-deletion is only supported for AzureVMs. This method is not supported for other workloads.</value>
579+
</data>
577580
</root>

src/RecoveryServices/RecoveryServices.Backup.Models/RecoveryServices.Backup.Models.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.1-preview" />
15+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.2-preview" />
1616
</ItemGroup>
1717

1818
</Project>

src/RecoveryServices/RecoveryServices.Backup.Providers/IPsBackupProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public interface IPsBackupProvider
3535

3636
RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData();
3737

38+
RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection();
39+
3840
RestAzureNS.AzureOperationResponse TriggerBackup();
3941

4042
RestAzureNS.AzureOperationResponse TriggerRestore();

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ public RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData()
117117
resourceGroupName: vaultResourceGroupName);
118118
}
119119

120+
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
121+
{
122+
throw new Exception(Resources.SoftdeleteNotImplementedException);
123+
}
124+
120125
public List<ContainerBase> ListProtectionContainers()
121126
{
122127
CmdletModel.BackupManagementType? backupManagementTypeNullable =

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureSqlPsBackupProvider.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ public RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData()
106106
resourceGroupName: resourceGroupName);
107107
}
108108

109+
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
110+
{
111+
throw new Exception(Resources.SoftdeleteNotImplementedException);
112+
}
113+
109114
public RestAzureNS.AzureOperationResponse TriggerBackup()
110115
{
111116
throw new NotImplementedException();

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ public RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData()
102102
resourceGroupName: vaultResourceGroupName);
103103
}
104104

105+
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
106+
{
107+
throw new Exception(Resources.SoftdeleteNotImplementedException);
108+
}
109+
105110
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> EnableProtection()
106111
{
107112
return EnableOrModifyProtection();

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/DpmPsBackupProvider.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS;
1717
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
1818
using Microsoft.Azure.Management.RecoveryServices.Backup.Models;
19+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
1920
using Microsoft.Rest.Azure.OData;
2021
using System;
2122
using System.Collections.Generic;
@@ -60,6 +61,11 @@ public RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData()
6061
throw new NotImplementedException();
6162
}
6263

64+
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
65+
{
66+
throw new Exception(Resources.SoftdeleteNotImplementedException);
67+
}
68+
6369
public RestAzureNS.AzureOperationResponse TriggerBackup()
6470
{
6571
throw new NotImplementedException();

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,47 @@ public RestAzureNS.AzureOperationResponse TriggerBackup()
268268
resourceGroupName: resourceGroupName);
269269
}
270270

271+
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
272+
{
273+
string vaultName = (string)ProviderData[VaultParams.VaultName];
274+
string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName];
275+
AzureVmItem item = (AzureVmItem)ProviderData[ItemParams.Item];
276+
277+
Dictionary<UriEnums, string> keyValueDict = HelperUtils.ParseUri(item.Id);
278+
string containerUri = HelperUtils.GetContainerUri(keyValueDict, item.Id);
279+
string protectedItemUri = HelperUtils.GetProtectedItemUri(keyValueDict, item.Id);
280+
281+
bool isComputeAzureVM = false;
282+
isComputeAzureVM = IsComputeAzureVM(item.VirtualMachineId);
283+
284+
AzureIaaSVMProtectedItem properties;
285+
if (isComputeAzureVM == false)
286+
{
287+
properties = new AzureIaaSClassicComputeVMProtectedItem();
288+
}
289+
else
290+
{
291+
properties = new AzureIaaSComputeVMProtectedItem();
292+
}
293+
294+
properties.PolicyId = null;
295+
properties.ProtectionState = ProtectionState.ProtectionStopped;
296+
properties.SourceResourceId = item.SourceResourceId;
297+
properties.IsRehydrate = true;
298+
299+
ProtectedItemResource serviceClientRequest = new ProtectedItemResource()
300+
{
301+
Properties = properties,
302+
};
303+
304+
return ServiceClientAdapter.CreateOrUpdateProtectedItem(
305+
containerUri,
306+
protectedItemUri,
307+
serviceClientRequest,
308+
vaultName: vaultName,
309+
resourceGroupName: resourceGroupName);
310+
}
311+
271312
/// <summary>
272313
/// Triggers the recovery operation for the given recovery point
273314
/// </summary>
@@ -692,6 +733,9 @@ public List<ItemBase> ListProtectedItems()
692733
(ItemProtectionState)ProviderData[ItemParams.ProtectionState];
693734
CmdletModel.WorkloadType workloadType =
694735
(CmdletModel.WorkloadType)ProviderData[ItemParams.WorkloadType];
736+
ItemDeleteState deleteState =
737+
(ItemDeleteState)ProviderData[ItemParams.DeleteState];
738+
695739
PolicyBase policy = (PolicyBase)ProviderData[PolicyParams.ProtectionPolicy];
696740

697741
// 1. Filter by container
@@ -751,6 +795,15 @@ public List<ItemBase> ListProtectedItems()
751795
}).ToList();
752796
}
753797

798+
// 6. Filter by Delete State
799+
if (deleteState != 0)
800+
{
801+
itemModels = itemModels.Where(itemModel =>
802+
{
803+
return ((AzureVmItem)itemModel).DeleteState == deleteState;
804+
}).ToList();
805+
}
806+
754807
return itemModels;
755808
}
756809

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/MabPsBackupProvider.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS;
1717
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
1818
using Microsoft.Azure.Management.RecoveryServices.Backup.Models;
19+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
1920
using Microsoft.Rest.Azure.OData;
2021
using System;
2122
using System.Collections.Generic;
@@ -61,6 +62,11 @@ public RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData()
6162
throw new NotImplementedException();
6263
}
6364

65+
public RestAzureNS.AzureOperationResponse<ProtectedItemResource> UndeleteProtection()
66+
{
67+
throw new Exception(Resources.SoftdeleteNotImplementedException);
68+
}
69+
6470
public RestAzureNS.AzureOperationResponse TriggerBackup()
6571
{
6672
throw new NotImplementedException();

src/RecoveryServices/RecoveryServices.Backup.Providers/RecoveryServices.Backup.Providers.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.1-preview" />
15+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.2-preview" />
1616
</ItemGroup>
1717

1818
<ItemGroup>

src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/RecoveryServices.Backup.ServiceClientAdapter.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<ItemGroup>
1515
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices" Version="4.2.1-preview" />
16-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.1-preview" />
16+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.2-preview" />
1717
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.4.1" />
1818
</ItemGroup>
1919

src/RecoveryServices/RecoveryServices.Backup.Test/RecoveryServices.Backup.Test.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<PackageReference Include="Microsoft.Azure.Management.Compute" Version="29.1.0" />
1515
<PackageReference Include="Microsoft.Azure.Management.Network" Version="19.15.0-preview" />
1616
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices" Version="4.2.1-preview" />
17-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.1-preview" />
17+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="3.1.2-preview" />
1818
</ItemGroup>
1919

2020
<ItemGroup>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ public void TestAzureUnmanagedVMFullRestore()
8181
_logger, PsBackupProviderTypes.IaasVm, "Test-AzureUnmanagedVMFullRestore");
8282
}
8383

84+
[Fact]
85+
[Trait(Category.AcceptanceType, Category.CheckIn)]
86+
[Trait(TestConstants.Workload, TestConstants.AzureVM)]
87+
public void TestAzureVMSoftDelete()
88+
{
89+
TestController.NewInstance.RunPsTest(
90+
_logger, PsBackupProviderTypes.IaasVm, "Test-AzureVMSoftDelete");
91+
}
92+
8493
[Fact]
8594
[Trait(Category.AcceptanceType, Category.CheckIn)]
8695
[Trait(TestConstants.Workload, TestConstants.AzureVM)]

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,4 +438,60 @@ function Test-AzureVMSetVaultContext
438438
# Cleanup
439439
Cleanup-ResourceGroup $resourceGroupName
440440
}
441+
}
442+
443+
function Test-AzureVMSoftDelete
444+
{
445+
$location = "southeastasia"
446+
$resourceGroupName = Create-ResourceGroup $location
447+
448+
try
449+
{
450+
#Setup
451+
$vm = Create-VM $resourceGroupName $location
452+
$vault = Create-RecoveryServicesVault $resourceGroupName $location
453+
Set-AzRecoveryServicesVaultContext -Vault $vault
454+
455+
$item = Enable-Protection $vault $vm
456+
$backupJob = Backup-Item $vault $item
457+
458+
#SoftDelete
459+
460+
Disable-AzRecoveryServicesBackupProtection `
461+
-VaultId $vault.ID `
462+
-Item $item `
463+
-RemoveRecoveryPoints `
464+
-Force;
465+
466+
#Check if the item is in a softdeleted state
467+
468+
$container = Get-AzRecoveryServicesBackupContainer `
469+
-VaultId $vault.ID `
470+
-ContainerType "AzureVM" `
471+
-FriendlyName $vm.Name;
472+
473+
$item = Get-AzRecoveryServicesBackupItem `
474+
-VaultId $vault.ID `
475+
-Container $container `
476+
-WorkloadType "AzureVM";
477+
478+
#rehydrate the softdeleted item
479+
480+
Undo-AzRecoveryServicesBackupItemDeletion `
481+
-VaultId $vault.ID `
482+
-Item $item;
483+
484+
$item = Get-AzRecoveryServicesBackupItem `
485+
-VaultId $vault.ID `
486+
-Container $container `
487+
-WorkloadType "AzureVM";
488+
489+
#check if item is in a rehydrated state
490+
Assert-True { $item.ProtectionState -eq "ProtectionStopped" }
491+
492+
}
493+
finally
494+
{
495+
#write cleanup for softdeleted state
496+
}
441497
}

0 commit comments

Comments
 (0)