Skip to content

Commit 6133e37

Browse files
committed
Added support for enabling Disk access settings for managed VM restores
Updated help
1 parent 90e0032 commit 6133e37

File tree

8 files changed

+112
-7
lines changed

8 files changed

+112
-7
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: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,18 @@ 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+
public string TargetDiskAccessId { get; set; }
342+
331343
public override void ExecuteCmdlet()
332344
{
333345
ExecutionBlock(() =>
@@ -430,6 +442,43 @@ public override void ExecuteCmdlet()
430442
}
431443
}
432444

445+
if (DiskAccessOption != null)
446+
{
447+
AzureVmRecoveryPoint rp = (AzureVmRecoveryPoint)RecoveryPoint;
448+
if (!(bool)rp.IsPrivateAccessEnabledOnAnyDisk)
449+
{
450+
throw new ArgumentException("DiskAccessOption parameter can't be provided since private access is not enabled in given recovery point");
451+
}
452+
453+
if (DiskAccessOption == ServiceClientModel.TargetDiskNetworkAccessOption.EnablePrivateAccessForAllDisks)
454+
{
455+
if (string.IsNullOrEmpty(TargetDiskAccessId))
456+
{
457+
throw new ArgumentException("TargetDiskAccessId must be provided when DiskAccessOption is set to EnablePrivateAccessForAllDisks.");
458+
}
459+
}
460+
else if (RestoreToSecondaryRegion.IsPresent && DiskAccessOption == ServiceClientModel.TargetDiskNetworkAccessOption.SameAsOnSourceDisks)
461+
{
462+
throw new ArgumentException("Given DiskAccessOption isn't applicable to cross region restore");
463+
}
464+
else if (!string.IsNullOrEmpty(TargetDiskAccessId))
465+
{
466+
throw new ArgumentException("TargetDiskAccessId can't be provided for the given DiskAccessOption.");
467+
}
468+
469+
providerParameters.Add(RestoreVMBackupItemParams.DiskAccessOption, DiskAccessOption);
470+
providerParameters.Add(RestoreVMBackupItemParams.TargetDiskAccessId, TargetDiskAccessId);
471+
}
472+
else if (string.Equals(this.ParameterSetName, AzureManagedVMCreateNewParameterSet, StringComparison.Ordinal) ||
473+
string.Equals(this.ParameterSetName, AzureManagedVMReplaceExistingParameterSet, StringComparison.Ordinal))
474+
{
475+
AzureVmRecoveryPoint rp = (AzureVmRecoveryPoint)RecoveryPoint;
476+
if ((bool)rp.IsPrivateAccessEnabledOnAnyDisk)
477+
{
478+
throw new ArgumentException("DiskAccessOption parameter must be provided since private access is enabled in given recovery point");
479+
}
480+
}
481+
433482
if (TargetZoneNumber != null)
434483
{
435484
// 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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
## Version 7.0.0
2323
* [Breaking Change] Renamed the property `ResouceType` of `ASRVaultSettings` to `ResourceType`.
24+
* Added support for enabling Disk access settings for managed VM restores.
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: 36 additions & 4 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
@@ -347,6 +348,22 @@ Accept pipeline input: False
347348
Accept wildcard characters: False
348349
```
349350
351+
### -DiskAccessOption
352+
Specifies the disk access option for target disks
353+
354+
```yaml
355+
Type: System.Nullable`1[Microsoft.Azure.Management.RecoveryServices.Backup.Models.TargetDiskNetworkAccessOption]
356+
Parameter Sets: AzureManagedVMReplaceExistingParameterSet, AzureManagedVMCreateNewParameterSet
357+
Aliases:
358+
Accepted values: SameAsOnSourceDisks, EnablePrivateAccessForAllDisks, EnablePublicAccessForAllDisks
359+
360+
Required: False
361+
Position: Named
362+
Default value: None
363+
Accept pipeline input: False
364+
Accept wildcard characters: False
365+
```
366+
350367
### -DiskEncryptionSetId
351368
352369
The DES ID to encrypt the restored disks.
@@ -611,6 +628,21 @@ Accept pipeline input: False
611628
Accept wildcard characters: False
612629
```
613630
631+
### -TargetDiskAccessId
632+
Specifies the target disk access ID when DiskAccessOption set to EnablePrivateAccessForAllDisks
633+
634+
```yaml
635+
Type: System.String
636+
Parameter Sets: AzureManagedVMReplaceExistingParameterSet, AzureManagedVMCreateNewParameterSet
637+
Aliases:
638+
639+
Required: False
640+
Position: Named
641+
Default value: None
642+
Accept pipeline input: False
643+
Accept wildcard characters: False
644+
```
645+
614646
### -TargetFileShareName
615647
616648
The File Share to which the file share has to be restored to.

0 commit comments

Comments
 (0)