Skip to content

Commit cc5813a

Browse files
authored
[RecoveryServices.Backup]Added support for restoring unmanaged disks as managed disk (#14799)
* Added support for restroing unmanaged disks as managed disk * Changed parameter name
1 parent 0339bf2 commit cc5813a

File tree

8 files changed

+3322
-2948
lines changed

8 files changed

+3322
-2948
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public enum RestoreVMBackupItemParams
6363
RestoreDiskList,
6464
RestoreOnlyOSDisk,
6565
RestoreAsUnmanagedDisks,
66-
DiskEncryptionSetId
66+
DiskEncryptionSetId,
67+
RestoreAsManagedDisk
6768
}
6869

6970
public enum RestoreFSBackupItemParams

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
394394
String secondaryRegion = useSecondaryRegion ? (string)ProviderData[CRRParams.SecondaryRegion]: null;
395395
IList<string> targetZones = ProviderData.ContainsKey(RecoveryPointParams.TargetZone) ?
396396
new List<string>(new string[]{(ProviderData[RecoveryPointParams.TargetZone].ToString())}) : null;
397+
bool restoreWithManagedDisks = (bool)ProviderData[RestoreVMBackupItemParams.RestoreAsManagedDisk];
397398

398399
Dictionary<UriEnums, string> uriDict = HelperUtils.ParseUri(rp.Id);
399400
string containerUri = HelperUtils.GetContainerUri(uriDict, rp.Id);
@@ -419,7 +420,7 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
419420
}
420421

421422
// if the vm is unmanaged, target rg should not be provided
422-
if(rp.IsManagedVirtualMachine == false && targetResourceGroupName != null)
423+
if(rp.IsManagedVirtualMachine == false && targetResourceGroupName != null && !restoreWithManagedDisks)
423424
{
424425
Logger.Instance.WriteWarning(Resources.TargetResourcegroupNotSupported);
425426
}
@@ -451,7 +452,8 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
451452
null,
452453
OriginalStorageAccountOption = useOsa,
453454
RestoreDiskLunList = restoreDiskLUNS,
454-
DiskEncryptionSetId = DiskEncryptionSetId
455+
DiskEncryptionSetId = DiskEncryptionSetId,
456+
RestoreWithManagedDisks = restoreWithManagedDisks
455457
};
456458

457459
if(targetZones != null)

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,11 @@ function Test-AzureUnmanagedVMFullRestore
398398
$saName = Create-SA $resourceGroupName $location
399399
$vm = Create-UnmanagedVM $resourceGroupName $location $saName
400400
$vault = Create-RecoveryServicesVault $resourceGroupName $location
401+
402+
Set-AzRecoveryServicesVaultProperty -VaultId $vault.ID -SoftDeleteFeatureState "Disable"
403+
$VaultProperty = Get-AzRecoveryServicesVaultProperty -VaultId $vault.ID
404+
Assert-True { $VaultProperty.SoftDeleteFeatureState -eq "Disabled" }
405+
401406
$item = Enable-Protection $vault $vm $resourceGroupName
402407
$backupJob = Backup-Item $vault $item
403408
$rp = Get-RecoveryPoint $vault $item $backupJob
@@ -411,6 +416,14 @@ function Test-AzureUnmanagedVMFullRestore
411416
-UseOriginalStorageAccount | Wait-AzRecoveryServicesBackupJob -VaultId $vault.ID
412417

413418
Assert-True { $restoreJob.Status -eq "Completed" }
419+
420+
$restoreJob2 = Restore-AzRecoveryServicesBackupItem `
421+
-VaultId $vault.ID `
422+
-VaultLocation $vault.Location `
423+
-RecoveryPoint $rp `
424+
-StorageAccountName $saName `
425+
-StorageAccountResourceGroupName $resourceGroupName `
426+
-RestoreAsManagedDisk -TargetResourceGroupName $resourceGroupName
414427
}
415428
finally
416429
{

src/RecoveryServices/RecoveryServices.Backup.Test/SessionRecords/Microsoft.Azure.Commands.RecoveryServices.Backup.Test.ScenarioTests.ItemTests/TestAzureUnmanagedVMFullRestore.json

Lines changed: 3184 additions & 2887 deletions
Large diffs are not rendered by default.

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
3838
internal const string AzureVMParameterSet = "AzureVMParameterSet";
3939
internal const string AzureVMManagedDiskParameterSet = "AzureVMManagedDiskParameterSet";
4040
internal const string AzureVMRestoreManagedAsUnmanaged = "AzureVMRestoreManagedAsUnmanaged";
41+
internal const string AzureVMRestoreUnmanagedAsManaged = "AzureVMRestoreUnmanagedAsManaged";
4142
internal const string AzureVMUnManagedDiskParameterSet = "AzureVMUnManagedDiskParameterSet";
4243
internal const string AzureFileShareParameterSet = "AzureFileShareParameterSet";
4344
internal const string AzureWorkloadParameterSet = "AzureWorkloadParameterSet";
@@ -64,6 +65,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
6465
ParameterSetName = AzureVMManagedDiskParameterSet, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
6566
[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0,
6667
ParameterSetName = AzureVMUnManagedDiskParameterSet, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
68+
[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0,
69+
ParameterSetName = AzureVMRestoreUnmanagedAsManaged, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
6770
[ValidateNotNullOrEmpty]
6871
public RecoveryPointBase RecoveryPoint { get; set; }
6972

@@ -86,6 +89,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
8689
HelpMessage = ParamHelpMsgs.RestoreDisk.StorageAccountName)]
8790
[Parameter(Mandatory = true, Position = 1, ParameterSetName = AzureVMRestoreManagedAsUnmanaged,
8891
HelpMessage = ParamHelpMsgs.RestoreDisk.StorageAccountName)]
92+
[Parameter(Mandatory = true, Position = 1, ParameterSetName = AzureVMRestoreUnmanagedAsManaged,
93+
HelpMessage = ParamHelpMsgs.RestoreDisk.StorageAccountName)]
8994
[ValidateNotNullOrEmpty]
9095
public string StorageAccountName { get; set; }
9196

@@ -100,6 +105,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
100105
HelpMessage = ParamHelpMsgs.RestoreDisk.StorageAccountResourceGroupName)]
101106
[Parameter(Mandatory = true, Position = 2, ParameterSetName = AzureVMRestoreManagedAsUnmanaged,
102107
HelpMessage = ParamHelpMsgs.RestoreDisk.StorageAccountResourceGroupName)]
108+
[Parameter(Mandatory = true, Position = 2, ParameterSetName = AzureVMRestoreUnmanagedAsManaged,
109+
HelpMessage = ParamHelpMsgs.RestoreDisk.StorageAccountResourceGroupName)]
103110
[ValidateNotNullOrEmpty]
104111
public string StorageAccountResourceGroupName { get; set; }
105112

@@ -108,6 +115,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
108115
/// </summary>
109116
[Parameter(Mandatory = true, Position = 3, ParameterSetName = AzureVMManagedDiskParameterSet,
110117
HelpMessage = ParamHelpMsgs.RestoreVM.TargetResourceGroupName)]
118+
[Parameter(Mandatory = true, Position = 3, ParameterSetName = AzureVMRestoreUnmanagedAsManaged,
119+
HelpMessage = ParamHelpMsgs.RestoreVM.TargetResourceGroupName)]
111120
[ValidateNotNullOrEmpty]
112121
public string TargetResourceGroupName { get; set; }
113122

@@ -171,6 +180,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
171180
/// </summary>
172181
[Parameter(Mandatory = true, ParameterSetName = AzureVMUnManagedDiskParameterSet,
173182
HelpMessage = ParamHelpMsgs.RestoreVM.OsaOption)]
183+
[Parameter(Mandatory = false, ParameterSetName = AzureVMRestoreUnmanagedAsManaged,
184+
HelpMessage = ParamHelpMsgs.RestoreVM.OsaOption)]
174185
public SwitchParameter UseOriginalStorageAccount { get; set; }
175186

176187
/// <summary>
@@ -184,6 +195,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
184195
HelpMessage = ParamHelpMsgs.RestoreVM.RestoreOnlyOSDisk)]
185196
[Parameter(Mandatory = false, ParameterSetName = AzureVMUnManagedDiskParameterSet,
186197
HelpMessage = ParamHelpMsgs.RestoreVM.RestoreOnlyOSDisk)]
198+
[Parameter(Mandatory = false, ParameterSetName = AzureVMRestoreUnmanagedAsManaged,
199+
HelpMessage = ParamHelpMsgs.RestoreVM.RestoreOnlyOSDisk)]
187200
public SwitchParameter RestoreOnlyOSDisk { get; set; }
188201

189202
/// <summary>
@@ -197,6 +210,8 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
197210
HelpMessage = ParamHelpMsgs.RestoreVM.RestoreDiskList)]
198211
[Parameter(Mandatory = false, ParameterSetName = AzureVMRestoreManagedAsUnmanaged,
199212
HelpMessage = ParamHelpMsgs.RestoreVM.RestoreDiskList)]
213+
[Parameter(Mandatory = false, ParameterSetName = AzureVMRestoreUnmanagedAsManaged,
214+
HelpMessage = ParamHelpMsgs.RestoreVM.RestoreDiskList)]
200215
public string[] RestoreDiskList { get; set; }
201216

202217
/// <summary>
@@ -231,6 +246,13 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
231246
HelpMessage = ParamHelpMsgs.RestoreVM.TargetZone)]
232247
public int? TargetZoneNumber { get; set; }
233248

249+
/// <summary>
250+
/// Switch param to restore a backed up unmanaged vm as managed disks.
251+
/// </summary>
252+
[Parameter(Mandatory = true, ParameterSetName = AzureVMRestoreUnmanagedAsManaged, HelpMessage = ParamHelpMsgs.RestoreVM.RestoreAsManagedDisk)]
253+
[ValidateNotNullOrEmpty]
254+
public SwitchParameter RestoreAsManagedDisk { get; set; }
255+
234256
public override void ExecuteCmdlet()
235257
{
236258
ExecutionBlock(() =>
@@ -265,6 +287,7 @@ public override void ExecuteCmdlet()
265287
providerParameters.Add(RestoreVMBackupItemParams.RestoreOnlyOSDisk, RestoreOnlyOSDisk);
266288
providerParameters.Add(RestoreVMBackupItemParams.RestoreAsUnmanagedDisks, RestoreAsUnmanagedDisks);
267289
providerParameters.Add(CRRParams.UseSecondaryRegion, RestoreToSecondaryRegion.IsPresent);
290+
providerParameters.Add(RestoreVMBackupItemParams.RestoreAsManagedDisk, RestoreAsManagedDisk.IsPresent);
268291

269292
if (DiskEncryptionSetId != null)
270293
{

src/RecoveryServices/RecoveryServices.Backup/ParamHelpMsgs.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ internal static class RestoreVM
155155
public const string RestoreDiskList = "Specify which disks to recover of the backed up VM";
156156
public const string RestoreAsUnmanagedDisks = "Use this switch to specify to restore as unmanaged disks";
157157
public const string TargetZone = "Target zone to restore the disks";
158+
public const string RestoreAsManagedDisk = "Use this switch to specify to restore as managed disks.";
158159
}
159160

160161
internal static class RestoreFS

src/RecoveryServices/RecoveryServices/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Added support for restoring unmanaged disks vm as managed disks.
2122

2223
## Version 3.5.0
2324
* Added Cross Zonal Restore for managed virtual machines.

0 commit comments

Comments
 (0)