Skip to content

Commit 876e048

Browse files
authored
[RecoveryServices.Backup] Added support for enabling Disk access settings for managed VM restores (#25663)
* Added support for enabling Disk access settings for managed VM restores Updated help * updated changelog
1 parent 90e0032 commit 876e048

File tree

8 files changed

+132
-9
lines changed

8 files changed

+132
-9
lines changed

src/RecoveryServices/RecoveryServices.Backup.Helpers/Conversions/RecoveryPointConversions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ public static RecoveryPointBase GetPSAzureVMRecoveryPoint(
367367
Zones = recoveryPoint.Zones,
368368
RehydrationExpiryTime = (DateTime?)null,
369369
ExtendedLocation = recoveryPoint.ExtendedLocation,
370+
IsPrivateAccessEnabledOnAnyDisk = recoveryPoint.IsPrivateAccessEnabledOnAnyDisk
370371
};
371372

372373
if (recoveryPoint.RecoveryPointTierDetails != null)

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class AzureVmRecoveryPoint : AzureRecoveryPoint
4242
/// Identifies whether this recovery point represents
4343
/// an encrypted VM at the time of backup.
4444
/// </summary>
45-
public bool EncryptionEnabled { get; set; }
45+
public bool EncryptionEnabled { get; set; }
4646

4747
/// <summary>
4848
/// Identifies whether an ILR session is already active
@@ -93,6 +93,12 @@ public class AzureVmRecoveryPoint : AzureRecoveryPoint
9393
/// </summary>
9494
public ExtendedLocation ExtendedLocation { get; set; }
9595

96+
/// <summary>
97+
/// Identifies whether any of the disks in the VM are using
98+
/// Private access network setting
99+
/// </summary>
100+
public bool? IsPrivateAccessEnabledOnAnyDisk { get; set; }
101+
96102
public AzureVmRecoveryPoint()
97103
{
98104

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ public enum RestoreVMBackupItemParams
8585
TargetVNetResourceGroup,
8686
TargetSubnetName,
8787
TargetSubscriptionId,
88-
RestoreToEdgeZone
88+
RestoreToEdgeZone,
89+
DiskAccessOption,
90+
TargetDiskAccessId
8991
}
9092

9193
public enum RestoreFSBackupItemParams

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,8 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
507507
bool restoreToEdgeZone = (bool)ProviderData[RestoreVMBackupItemParams.RestoreToEdgeZone];
508508
string auxiliaryAccessToken = ProviderData.ContainsKey(ResourceGuardParams.Token) ? (string)ProviderData[ResourceGuardParams.Token] : null;
509509
bool isMUAOperation = ProviderData.ContainsKey(ResourceGuardParams.IsMUAOperation) ? (bool)ProviderData[ResourceGuardParams.IsMUAOperation] : false;
510-
510+
ServiceClientModel.TargetDiskNetworkAccessOption? diskAccessOption = ProviderData.ContainsKey(RestoreVMBackupItemParams.DiskAccessOption) ? (ServiceClientModel.TargetDiskNetworkAccessOption?)ProviderData[RestoreVMBackupItemParams.DiskAccessOption] : null;
511+
string targetDiskAccessId = ProviderData.ContainsKey(RestoreVMBackupItemParams.TargetDiskAccessId) ? (string)ProviderData[RestoreVMBackupItemParams.TargetDiskAccessId] : null;
511512

512513
Dictionary<UriEnums, string> uriDict = HelperUtils.ParseUri(rp.Id);
513514
string containerUri = HelperUtils.GetContainerUri(uriDict, rp.Id);
@@ -629,6 +630,17 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
629630
restoreRequest.ExtendedLocation = rp.ExtendedLocation;
630631
}
631632

633+
if (diskAccessOption != null)
634+
{
635+
restoreRequest.TargetDiskNetworkAccessSettings = new TargetDiskNetworkAccessSettings();
636+
restoreRequest.TargetDiskNetworkAccessSettings.TargetDiskNetworkAccessOption = diskAccessOption;
637+
638+
if(!string.IsNullOrEmpty(targetDiskAccessId))
639+
{
640+
restoreRequest.TargetDiskNetworkAccessSettings.TargetDiskAccessId = targetDiskAccessId;
641+
}
642+
}
643+
632644
if (restoreType == "OriginalLocation") // replace existing
633645
{
634646
restoreRequest.RecoveryType = RecoveryType.OriginalLocation;

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,19 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
328328
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ValueFromPipeline = false)]
329329
public string Token;
330330

331+
[Parameter(Mandatory = false, ParameterSetName = AzureManagedVMCreateNewParameterSet,
332+
HelpMessage = ParamHelpMsgs.RestoreVM.DiskAccessOption)]
333+
[Parameter(Mandatory = false, ParameterSetName = AzureManagedVMReplaceExistingParameterSet,
334+
HelpMessage = ParamHelpMsgs.RestoreVM.DiskAccessOption)]
335+
public ServiceClientModel.TargetDiskNetworkAccessOption? DiskAccessOption { get; set; }
336+
337+
[Parameter(Mandatory = false, ParameterSetName = AzureManagedVMCreateNewParameterSet,
338+
HelpMessage = ParamHelpMsgs.RestoreVM.TargetDiskAccessId)]
339+
[Parameter(Mandatory = false, ParameterSetName = AzureManagedVMReplaceExistingParameterSet,
340+
HelpMessage = ParamHelpMsgs.RestoreVM.TargetDiskAccessId)]
341+
[ValidatePattern(@"^/subscriptions/[^/]+/resourceGroups/[^/]+/providers/Microsoft.Compute/diskAccesses/[^/]+$")]
342+
public string TargetDiskAccessId { get; set; }
343+
331344
public override void ExecuteCmdlet()
332345
{
333346
ExecutionBlock(() =>
@@ -430,6 +443,43 @@ public override void ExecuteCmdlet()
430443
}
431444
}
432445

446+
if (DiskAccessOption != null)
447+
{
448+
AzureVmRecoveryPoint rp = (AzureVmRecoveryPoint)RecoveryPoint;
449+
if (!(bool)rp.IsPrivateAccessEnabledOnAnyDisk)
450+
{
451+
throw new ArgumentException("DiskAccessOption parameter can't be provided since private access is not enabled in given recovery point");
452+
}
453+
454+
if (DiskAccessOption == ServiceClientModel.TargetDiskNetworkAccessOption.EnablePrivateAccessForAllDisks)
455+
{
456+
if (string.IsNullOrEmpty(TargetDiskAccessId))
457+
{
458+
throw new ArgumentException("TargetDiskAccessId must be provided when DiskAccessOption is set to EnablePrivateAccessForAllDisks.");
459+
}
460+
}
461+
else if (RestoreToSecondaryRegion.IsPresent && DiskAccessOption == ServiceClientModel.TargetDiskNetworkAccessOption.SameAsOnSourceDisks)
462+
{
463+
throw new ArgumentException("Given DiskAccessOption isn't applicable to cross region restore");
464+
}
465+
else if (!string.IsNullOrEmpty(TargetDiskAccessId))
466+
{
467+
throw new ArgumentException("TargetDiskAccessId can't be provided for the given DiskAccessOption.");
468+
}
469+
470+
providerParameters.Add(RestoreVMBackupItemParams.DiskAccessOption, DiskAccessOption);
471+
providerParameters.Add(RestoreVMBackupItemParams.TargetDiskAccessId, TargetDiskAccessId);
472+
}
473+
else if (string.Equals(this.ParameterSetName, AzureManagedVMCreateNewParameterSet, StringComparison.Ordinal) ||
474+
string.Equals(this.ParameterSetName, AzureManagedVMReplaceExistingParameterSet, StringComparison.Ordinal))
475+
{
476+
AzureVmRecoveryPoint rp = (AzureVmRecoveryPoint)RecoveryPoint;
477+
if ((bool)rp.IsPrivateAccessEnabledOnAnyDisk)
478+
{
479+
throw new ArgumentException("DiskAccessOption parameter must be provided since private access is enabled in given recovery point");
480+
}
481+
}
482+
433483
if (TargetZoneNumber != null)
434484
{
435485
// get storage type

src/RecoveryServices/RecoveryServices.Backup/ParamHelpMsgs.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ internal static class RestoreVM
181181
public const string TargetVNetResourceGroup = "Name of the resource group which contains the target VNet, in the case of Alternate Location restore to a new VM";
182182
public const string TargetSubnetName = "Name of the subnet in which the target VM should be created, in the case of Alternate Location restore to a new VM";
183183
public const string TargetSubscriptionId = "ID of the target subscription to which the resource should be restored. Use this parameter for Cross subscription restore";
184+
public const string DiskAccessOption = "Specifies the disk access option for target disks";
185+
public const string TargetDiskAccessId = "Specifies the target disk access ID when DiskAccessOption set to EnablePrivateAccessForAllDisks";
184186
}
185187

186188
internal static class RestoreFS

src/RecoveryServices/RecoveryServices/ChangeLog.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Added support for enabling Disk access settings for managed VM restores.
2122

2223
## Version 7.0.0
23-
* [Breaking Change] Renamed the property `ResouceType` of `ASRVaultSettings` to `ResourceType`.
24+
* [Breaking Change] Renamed the property `ResouceType` of `ASRVaultSettings` to `ResourceType`.
2425

2526
## Version 6.9.0
2627
* Added support for MUA for disabling vault Immutability, increasing RPO for policy schedule, restore, stop protection with retain data.

src/RecoveryServices/RecoveryServices/help/Restore-AzRecoveryServicesBackupItem.md

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ Restore-AzRecoveryServicesBackupItem [-VaultLocation <String>] [-RecoveryPoint]
2121
[-StorageAccountName] <String> [-StorageAccountResourceGroupName] <String> [-RestoreOnlyOSDisk]
2222
[-RestoreDiskList <String[]>] [-DiskEncryptionSetId <String>] [-RestoreToSecondaryRegion]
2323
[-TargetZoneNumber <Int32>] [-RehydratePriority <String>] [-UseSystemAssignedIdentity]
24-
[-UserAssignedIdentityId <String>] [-VaultId <String>] [-DefaultProfile <IAzureContextContainer>]
24+
[-UserAssignedIdentityId <String>] [-DiskAccessOption <TargetDiskNetworkAccessOption>]
25+
[-TargetDiskAccessId <String>] [-VaultId <String>] [-DefaultProfile <IAzureContextContainer>]
2526
[-RehydrateDuration <String>] [-Token <String>] [-WhatIf] [-Confirm]
2627
[<CommonParameters>]
2728
```
@@ -54,9 +55,9 @@ Restore-AzRecoveryServicesBackupItem [-VaultLocation <String>] [-RecoveryPoint]
5455
[-TargetZoneNumber <Int32>] [-RehydratePriority <String>] [-UseSystemAssignedIdentity]
5556
[-UserAssignedIdentityId <String>] [-TargetVMName <String>] [-TargetVNetName <String>]
5657
[-TargetVNetResourceGroup <String>] [-TargetSubnetName <String>] [-TargetSubscriptionId <String>]
57-
[-RestoreToEdgeZone] [-VaultId <String>] [-DefaultProfile <IAzureContextContainer>]
58-
[-RehydrateDuration <String>] [-Token <String>] [-WhatIf] [-Confirm]
59-
[<CommonParameters>]
58+
[-RestoreToEdgeZone] [-DiskAccessOption <TargetDiskNetworkAccessOption>] [-TargetDiskAccessId <String>]
59+
[-VaultId <String>] [-DefaultProfile <IAzureContextContainer>] [-RehydrateDuration <String>] [-Token <String>]
60+
[-WhatIf] [-Confirm] [<CommonParameters>]
6061
```
6162

6263
### AzureVMUnManagedDiskParameterSet
@@ -146,7 +147,7 @@ $BackupItem = Get-AzRecoveryServicesBackupItem -BackupManagementType "AzureVM" -
146147
$StartDate = (Get-Date).AddDays(-7)
147148
$EndDate = Get-Date
148149
$RP = Get-AzRecoveryServicesBackupRecoveryPoint -Item $BackupItem -StartDate $StartDate.ToUniversalTime() -EndDate $EndDate.ToUniversalTime() -VaultId $vault.ID
149-
$AlternateLocationRestoreJob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $RP[0] -TargetResourceGroupName "Target_RG" -StorageAccountName "DestStorageAccount" -StorageAccountResourceGroupName "DestStorageAccRG" -TargetVMName "TagetVirtualMachineName" -TargetVNetName "Target_VNet" -TargetVNetResourceGroup "" -TargetSubnetName "subnetName" -VaultId $vault.ID -VaultLocation $vault.Location
150+
$AlternateLocationRestoreJob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $RP[0] -TargetResourceGroupName "Target_RG" -StorageAccountName "DestStorageAccount" -StorageAccountResourceGroupName "DestStorageAccRG" -TargetVMName "TagetVirtualMachineName" -TargetVNetName "Target_VNet" -TargetVNetResourceGroup "Target_VNet_RG" -TargetSubnetName "subnetName" -VaultId $vault.ID -VaultLocation $vault.Location
150151
$OriginalLocationRestoreJob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $RP[0] -StorageAccountName "DestStorageAccount" -StorageAccountResourceGroupName "DestStorageAccRG" -VaultId $vault.ID -VaultLocation $vault.Location
151152
```
152153

@@ -329,6 +330,23 @@ $restoreJob = Restore-AzRecoveryServicesBackupItem -VaultId $vault.ID -VaultLoca
329330

330331
In this example, we use RestoreToEdgeZone parameter to trigger a restore to new edge zone vm in alternate location. For Original location restore (OLR), restore will implicitly be an edge zone restore if the source VM is an edge zone VM.
331332

333+
### Example 12: Restore a Managed AzureVM using DiskAccessOption
334+
335+
```powershell
336+
$vault = Get-AzRecoveryServicesVault -ResourceGroupName "resourceGroup" -Name "vaultName"
337+
$BackupItem = Get-AzRecoveryServicesBackupItem -BackupManagementType "AzureVM" -WorkloadType "AzureVM" -Name "V2VM" -VaultId $vault.ID
338+
$RP = Get-AzRecoveryServicesBackupRecoveryPoint -VaultId $vault.ID -Item $item
339+
$AlternateLocationRestoreJob = Restore-AzRecoveryServicesBackupItem -RecoveryPoint $RP[0] -TargetResourceGroupName "Target_RG" -StorageAccountName "DestStorageAccount" -StorageAccountResourceGroupName "DestStorageAccRG" -TargetVMName "TagetVirtualMachineName" -TargetVNetName "Target_VNet" -TargetVNetResourceGroup "Target_VNet_RG" -TargetSubnetName "subnetName" -VaultId $vault.ID -VaultLocation $vault.Location -DiskAccessOption EnablePrivateAccessForAllDisks -TargetDiskAccessId "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgName/providers/Microsoft.Compute/diskAccesses/target-diskaccess"
340+
```
341+
342+
```output
343+
WorkloadName Operation Status StartTime EndTime
344+
------------ --------- ------ --------- -------
345+
V2VM Restore InProgress 26-Jul-24 1:14:01 PM 01-Jan-01 12:00:00 AM
346+
```
347+
348+
In this example, we use DiskAccessOption parameter to trigger a restore to new VM with private access enabled for all disks. DiskAccessOption parameter can be used to specify the disk access option for target disks. The acceptable values for this parameter are: SameAsOnSourceDisks, EnablePrivateAccessForAllDisks, EnablePublicAccessForAllDisks. TargetDiskAccessId parameter is used to specify the disk access id for the target disks. This parameter is required when DiskAccessOption is set to EnablePrivateAccessForAllDisks.
349+
332350
## PARAMETERS
333351

334352
### -DefaultProfile
@@ -347,6 +365,22 @@ Accept pipeline input: False
347365
Accept wildcard characters: False
348366
```
349367
368+
### -DiskAccessOption
369+
Specifies the disk access option for target disks
370+
371+
```yaml
372+
Type: System.Nullable`1[Microsoft.Azure.Management.RecoveryServices.Backup.Models.TargetDiskNetworkAccessOption]
373+
Parameter Sets: AzureManagedVMReplaceExistingParameterSet, AzureManagedVMCreateNewParameterSet
374+
Aliases:
375+
Accepted values: SameAsOnSourceDisks, EnablePrivateAccessForAllDisks, EnablePublicAccessForAllDisks
376+
377+
Required: False
378+
Position: Named
379+
Default value: None
380+
Accept pipeline input: False
381+
Accept wildcard characters: False
382+
```
383+
350384
### -DiskEncryptionSetId
351385
352386
The DES ID to encrypt the restored disks.
@@ -611,6 +645,21 @@ Accept pipeline input: False
611645
Accept wildcard characters: False
612646
```
613647
648+
### -TargetDiskAccessId
649+
Specifies the target disk access ID when DiskAccessOption set to EnablePrivateAccessForAllDisks
650+
651+
```yaml
652+
Type: System.String
653+
Parameter Sets: AzureManagedVMReplaceExistingParameterSet, AzureManagedVMCreateNewParameterSet
654+
Aliases:
655+
656+
Required: False
657+
Position: Named
658+
Default value: None
659+
Accept pipeline input: False
660+
Accept wildcard characters: False
661+
```
662+
614663
### -TargetFileShareName
615664
616665
The File Share to which the file share has to be restored to.

0 commit comments

Comments
 (0)