Skip to content

Commit ed3d7c9

Browse files
authored
added MSI based Restore (#15519)
re-recorded tests
1 parent c0d0c74 commit ed3d7c9

File tree

55 files changed

+73722
-50390
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+73722
-50390
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="4.1.6-preview" />
15+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.9-preview" />
1616
<PackageReference Include="TimeZoneConverter" Version="3.0.0" />
1717
</ItemGroup>
1818

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ public enum RestoreVMBackupItemParams
7070
RestoreOnlyOSDisk,
7171
RestoreAsUnmanagedDisks,
7272
DiskEncryptionSetId,
73-
RestoreAsManagedDisk
73+
RestoreAsManagedDisk,
74+
UseSystemAssignedIdentity,
75+
UserAssignedIdentityId
7476
}
7577

7678
public enum RestoreFSBackupItemParams

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

Lines changed: 23 additions & 0 deletions
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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,4 +652,10 @@ Please contact Microsoft for further assistance.</value>
652652
<data name="MoveReadinessInfoUndefined" xml:space="preserve">
653653
<value>Move Readiness cannot be checked for given recovery points</value>
654654
</data>
655+
<data name="MSIRestoreNotSupportedForUnmanagedVM" xml:space="preserve">
656+
<value>MSI based Restore is only applicable to Managed VM Recovery Points</value>
657+
</data>
658+
<data name="MultipleMSIProvidedForRestore" xml:space="preserve">
659+
<value>MSI based Restore can't use both SystemAssigned and UserAssigned identities</value>
660+
</data>
655661
</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="4.1.6-preview" />
15+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.9-preview" />
1616
</ItemGroup>
1717

1818
<ItemGroup>

src/RecoveryServices/RecoveryServices.Backup.Models/VaultModels/VaultProperty.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class VaultProperty
5050

5151
public EncryptionConfig encryptionProperties { get; set; }
5252

53-
public VaultProperty(BackupResourceVaultConfig vaultConfig, BackupResourceEncryptionConfigResource vaultEncryptionSetting)
53+
public VaultProperty(BackupResourceVaultConfig vaultConfig, BackupResourceEncryptionConfigExtendedResource vaultEncryptionSetting)
5454
{
5555
StorageModelType = vaultConfig.StorageModelType;
5656
StorageType = vaultConfig.StorageType;
@@ -69,10 +69,12 @@ public VaultProperty(BackupResourceVaultConfig vaultConfig, BackupResourceEncryp
6969
encryptionProperties.Name = vaultEncryptionSetting.Name;
7070
encryptionProperties.Type = vaultEncryptionSetting.Type;
7171
encryptionProperties.Location = vaultEncryptionSetting.Location;
72+
encryptionProperties.UseSystemAssignedIdentity = vaultEncryptionSetting.Properties.UseSystemAssignedIdentity;
73+
encryptionProperties.UserAssignedIdentity = vaultEncryptionSetting.Properties.UserAssignedIdentity;
7274
}
73-
}
75+
}
7476

75-
public class EncryptionConfig : BackupResourceEncryptionConfig
77+
public class EncryptionConfig : BackupResourceEncryptionConfigExtended
7678
{
7779
public string Id { get; set; }
7880
public string Name { get; set; }

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,9 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
399399
string rehydrateDuration = ProviderData.ContainsKey(RecoveryPointParams.RehydrateDuration) ?
400400
ProviderData[RecoveryPointParams.RehydrateDuration].ToString() : "15";
401401
string rehydratePriority = ProviderData.ContainsKey(RecoveryPointParams.RehydratePriority) ?
402-
ProviderData[RecoveryPointParams.RehydratePriority].ToString() : null;
402+
ProviderData[RecoveryPointParams.RehydratePriority].ToString() : null;
403+
bool useSystemAssignedIdentity = (bool)ProviderData[RestoreVMBackupItemParams.UseSystemAssignedIdentity];
404+
string userAssignedIdentityId = (string) ProviderData[RestoreVMBackupItemParams.UserAssignedIdentityId];
403405

404406
Dictionary<UriEnums, string> uriDict = HelperUtils.ParseUri(rp.Id);
405407
string containerUri = HelperUtils.GetContainerUri(uriDict, rp.Id);
@@ -443,7 +445,30 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
443445
{
444446
restoreDiskLUNS = null;
445447
}
446-
448+
449+
// Vanguard M9 requirement: restores using MSI
450+
IdentityInfo identityInfo = null;
451+
if (useSystemAssignedIdentity || (userAssignedIdentityId != null && userAssignedIdentityId != ""))
452+
{
453+
if (rp.IsManagedVirtualMachine)
454+
{
455+
identityInfo = new IdentityInfo();
456+
if (useSystemAssignedIdentity)
457+
{
458+
identityInfo.IsSystemAssignedIdentity = true;
459+
}
460+
else
461+
{
462+
identityInfo.IsSystemAssignedIdentity = false;
463+
identityInfo.ManagedIdentityResourceId = userAssignedIdentityId;
464+
}
465+
}
466+
else
467+
{
468+
throw new NotSupportedException(Resources.MSIRestoreNotSupportedForUnmanagedVM);
469+
}
470+
}
471+
447472
IaasVMRestoreRequest restoreRequest = new IaasVMRestoreRequest()
448473
{
449474
CreateNewCloudService = false,
@@ -458,7 +483,8 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
458483
OriginalStorageAccountOption = useOsa,
459484
RestoreDiskLunList = restoreDiskLUNS,
460485
DiskEncryptionSetId = DiskEncryptionSetId,
461-
RestoreWithManagedDisks = restoreWithManagedDisks
486+
RestoreWithManagedDisks = restoreWithManagedDisks,
487+
IdentityInfo = identityInfo
462488
};
463489

464490
if(targetZones != null)
@@ -469,6 +495,7 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
469495
RestoreRequestResource triggerRestoreRequest = new RestoreRequestResource();
470496
triggerRestoreRequest.Properties = restoreRequest;
471497

498+
// Cross Region Restore
472499
if (useSecondaryRegion)
473500
{
474501
// get access token

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="4.1.6-preview" />
15+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.9-preview" />
1616
</ItemGroup>
1717

1818
<ItemGroup>

src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/VaultAPIs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public BackupResourceConfigResource GetVaultStorageType(string resouceGroupName,
6363
/// <param name="resouceGroupName">Name of the resouce group</param>
6464
/// <param name="vaultName">Name of the vault</param>
6565
/// <returns>Azure Resource Encryption response object.</returns>
66-
public BackupResourceEncryptionConfigResource GetVaultEncryptionConfig(string resouceGroupName, string vaultName)
66+
public BackupResourceEncryptionConfigExtendedResource GetVaultEncryptionConfig(string resouceGroupName, string vaultName)
6767
{
6868
return BmsAdapter.Client.BackupResourceEncryptionConfigs.GetWithHttpMessagesAsync(
6969
vaultName, resouceGroupName).Result.Body;

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.3.1-preview" />
16-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.6-preview" />
16+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.9-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="48.0.0" />
1515
<PackageReference Include="Microsoft.Azure.Management.Network" Version="20.5.0" />
1616
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices" Version="4.3.1-preview" />
17-
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.6-preview" />
17+
<PackageReference Include="Microsoft.Azure.Management.RecoveryServices.Backup" Version="4.1.9-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
@@ -157,5 +157,14 @@ public void TestAzureVMCrossRegionRestore()
157157
TestController.NewInstance.RunPsTest(
158158
_logger, PsBackupProviderTypes.IaasVm, "Test-AzureVMCrossRegionRestore");
159159
}
160+
161+
[Fact]
162+
[Trait(Category.AcceptanceType, Category.CheckIn)]
163+
[Trait(TestConstants.Workload, TestConstants.AzureVM)]
164+
public void TestAzureVMRestoreWithMSI()
165+
{
166+
TestController.NewInstance.RunPsTest(
167+
_logger, PsBackupProviderTypes.IaasVm, "Test-AzureVMRestoreWithMSI");
168+
}
160169
}
161170
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,44 @@
1212
# limitations under the License.
1313
# ----------------------------------------------------------------------------------
1414

15+
function Test-AzureVMRestoreWithMSI
16+
{
17+
$location = "centraluseuap"
18+
$resourceGroupName = "hiagarg"
19+
$vaultName = "hiagaVault"
20+
$vmName = "VM;iaasvmcontainerv2;hiagarg;hiagavm"
21+
$saName = "hiagasa"
22+
23+
try
24+
{
25+
# Setup
26+
$vault = Get-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vaultName
27+
$item = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM `
28+
-VaultId $vault.ID -Name $vmName
29+
30+
$backupJob = Backup-Item $vault $item
31+
$backupStartTime = $backupJob.StartTime.AddMinutes(-1);
32+
$backupEndTime = $backupJob.EndTime.AddMinutes(1);
33+
34+
$rp = Get-AzRecoveryServicesBackupRecoveryPoint `
35+
-VaultId $vault.ID `
36+
-StartDate $backupStartTime `
37+
-EndDate $backupEndTime `
38+
-Item $item;
39+
40+
$restoreJob1 = Restore-AzRecoveryServicesBackupItem -VaultId $vault.ID -VaultLocation $vault.Location `
41+
-RecoveryPoint $rp[0] -StorageAccountName $saName -StorageAccountResourceGroupName `
42+
$vault.ResourceGroupName -RestoreOnlyOSDisk -TargetResourceGroupName $vault.ResourceGroupName `
43+
-UseSystemAssignedIdentity | Wait-AzRecoveryServicesBackupJob -VaultId $vault.ID
44+
45+
Assert-True { $restoreJob1.Status -eq "Completed" }
46+
}
47+
finally
48+
{
49+
# no Cleanup
50+
}
51+
}
52+
1553
function Test-AzureVMCrossRegionRestore
1654
{
1755
$location = "centraluseuap"

0 commit comments

Comments
 (0)