Skip to content

Commit 837c0f5

Browse files
authored
added CMK migration changes (#25931)
* added CMK migration changes updated help updated changelog Updated test case * re-recorded tests
1 parent 851c8f9 commit 837c0f5

File tree

12 files changed

+1620
-1336
lines changed

12 files changed

+1620
-1336
lines changed

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

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,11 @@ public VaultProperty(BackupResourceVaultConfig vaultConfig, BackupResourceEncryp
5959
SoftDeleteFeatureState = vaultConfig.SoftDeleteFeatureState;
6060

6161
// Initialize encryption properties
62-
encryptionProperties = new EncryptionConfig();
63-
encryptionProperties.EncryptionAtRestType = vaultEncryptionSetting.Properties.EncryptionAtRestType;
64-
encryptionProperties.KeyUri = vaultEncryptionSetting.Properties.KeyUri;
65-
encryptionProperties.SubscriptionId = vaultEncryptionSetting.Properties.SubscriptionId;
66-
encryptionProperties.LastUpdateStatus = vaultEncryptionSetting.Properties.LastUpdateStatus;
67-
encryptionProperties.InfrastructureEncryptionState = vaultEncryptionSetting.Properties.InfrastructureEncryptionState;
68-
encryptionProperties.Id = vaultEncryptionSetting.Id;
69-
encryptionProperties.Name = vaultEncryptionSetting.Name;
70-
encryptionProperties.Type = vaultEncryptionSetting.Type;
71-
encryptionProperties.Location = vaultEncryptionSetting.Location;
72-
encryptionProperties.UseSystemAssignedIdentity = vaultEncryptionSetting.Properties.UseSystemAssignedIdentity;
73-
encryptionProperties.UserAssignedIdentity = vaultEncryptionSetting.Properties.UserAssignedIdentity;
62+
encryptionProperties = new EncryptionConfig();
63+
encryptionProperties.KeyUri = vaultEncryptionSetting.Properties?.KeyUri;
64+
encryptionProperties.InfrastructureEncryptionState = vaultEncryptionSetting.Properties?.InfrastructureEncryptionState;
65+
encryptionProperties.UseSystemAssignedIdentity = vaultEncryptionSetting.Properties?.UseSystemAssignedIdentity;
66+
encryptionProperties.UserAssignedIdentity = vaultEncryptionSetting.Properties?.UserAssignedIdentity;
7467
}
7568
}
7669

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

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
using Microsoft.Rest.Azure.OData;
2222
using RestAzureNS = Microsoft.Rest.Azure;
2323
using System;
24-
using Newtonsoft.Json;
2524
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
2625

2726
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS
@@ -106,8 +105,23 @@ public BackupResourceConfigResource GetVaultStorageType(string resouceGroupName,
106105
/// <returns>Azure Resource Encryption response object.</returns>
107106
public BackupResourceEncryptionConfigExtendedResource GetVaultEncryptionConfig(string resouceGroupName, string vaultName)
108107
{
109-
return BmsAdapter.Client.BackupResourceEncryptionConfigs.GetWithHttpMessagesAsync(
110-
vaultName, resouceGroupName).Result.Body;
108+
ARSVault vault = GetVault(resouceGroupName, vaultName);
109+
110+
var vaultEncryptionProperty = vault.Properties.EncryptionProperty;
111+
BackupResourceEncryptionConfigExtendedResource encryptionConfig = new BackupResourceEncryptionConfigExtendedResource();
112+
113+
if (vaultEncryptionProperty != null)
114+
{
115+
encryptionConfig.Properties = new BackupResourceEncryptionConfigExtended
116+
{
117+
KeyUri = vaultEncryptionProperty.KeyVaultProperties?.KeyUri,
118+
InfrastructureEncryptionState = vaultEncryptionProperty.InfrastructureEncryption,
119+
UseSystemAssignedIdentity = vaultEncryptionProperty.KekIdentity?.UseSystemAssignedIdentity,
120+
UserAssignedIdentity = vaultEncryptionProperty.KekIdentity?.UserAssignedIdentity
121+
};
122+
}
123+
124+
return encryptionConfig;
111125
}
112126

113127
/// <summary>
@@ -156,13 +170,55 @@ public ARSVault GetVault(string resouceGroupName, string vaultName)
156170
/// <summary>
157171
/// Method to create or update Recovery Services Vault.
158172
/// </summary>
159-
/// <param name="resouceGroupName">Name of the resouce group</param>
173+
/// <param name="resourceGroupName">Name of the resouce group</param>
160174
/// <param name="vaultName">Name of the vault</param>
161175
/// <param name="patchVault">patch vault object to patch the recovery services Vault</param>
176+
/// <param name="auxiliaryAccessToken">Auxiliary access token for authorization</param>
177+
/// <param name="isMUAProtected">Flag indicating if the operation is MUA protected</param>
162178
/// <returns>Azure Recovery Services Vault.</returns>
163-
public Vault UpdateRSVault(string resouceGroupName, string vaultName, PatchVault patchVault)
179+
public Vault UpdateRSVault(string resourceGroupName, string vaultName, PatchVault patchVault, string auxiliaryAccessToken = null, bool isMUAProtected = false)
164180
{
165-
var response = RSAdapter.Client.Vaults.UpdateWithHttpMessagesAsync(resouceGroupName, vaultName, patchVault).Result;
181+
Dictionary<string, List<string>> customHeaders = new Dictionary<string, List<string>>();
182+
if (isMUAProtected)
183+
{
184+
List<ResourceGuardProxyBaseResource> resourceGuardMapping = ListResourceGuardMapping(vaultName, resourceGroupName);
185+
string operationRequest = null;
186+
187+
if (resourceGuardMapping != null && resourceGuardMapping.Count != 0)
188+
{
189+
// todo: CMK_MUA - check the op value correctly
190+
string criticalOp = "Microsoft.RecoveryServices/vaults/write#reduceImmutabilityState";
191+
192+
foreach (ResourceGuardOperationDetail operationDetail in resourceGuardMapping[0].Properties.ResourceGuardOperationDetails)
193+
{
194+
if (operationDetail.VaultCriticalOperation == criticalOp)
195+
{
196+
operationRequest = operationDetail.DefaultResourceRequest;
197+
}
198+
}
199+
200+
if (operationRequest != null)
201+
{
202+
patchVault.Properties.ResourceGuardOperationRequests = new List<string>();
203+
patchVault.Properties.ResourceGuardOperationRequests.Add(operationRequest);
204+
}
205+
}
206+
207+
if (auxiliaryAccessToken != null && auxiliaryAccessToken != "")
208+
{
209+
if (operationRequest != null)
210+
{
211+
customHeaders.Add("x-ms-authorization-auxiliary", new List<string> { "Bearer " + auxiliaryAccessToken });
212+
}
213+
else
214+
{
215+
// resx
216+
throw new ArgumentException(String.Format(Resources.UnexpectedParameterToken, "modify encryption settings for recovery services vault"));
217+
}
218+
}
219+
}
220+
221+
var response = RSAdapter.Client.Vaults.UpdateWithHttpMessagesAsync(resourceGroupName, vaultName, patchVault, default(string), customHeaders).Result;
166222
return response.Body;
167223
}
168224

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public void TestAzureVMRestoreWithMSI()
208208
);
209209
}
210210

211-
[Fact(Skip = "to be re-recorded in next release")]
211+
[Fact]
212212
[Trait(Category.AcceptanceType, Category.CheckIn)]
213213
[Trait(TestConstants.Workload, TestConstants.AzureVM)]
214214
public void TestAzureRSVaultCMK()

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,21 +381,26 @@ function Test-AzureRSVaultCMK
381381
$vaultName = "cmk-pstest-vault"
382382
$keyVault = "cmk-pstest-keyvault"
383383
$encryptionKeyId = "https://cmk-pstest-keyvault.vault.azure.net/keys/cmk-pstest-key/5569d5a163ee474cad2da4ac334af9d7"
384+
$encryptionKeyId2 = "https://oss-pstest-keyvault.vault.azure.net/keys/cmk-pstest-key2"
384385

385386
try
386387
{
387388
# Setup
388389
$vault = Get-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vaultName
389390

390391
# error scenario
391-
Assert-ThrowsContains { Set-AzRecoveryServicesVaultProperty -EncryptionKeyId $encryptionKeyId -VaultId $vault.ID -InfrastructureEncryption -UseSystemAssignedIdentity $false } `
392+
Assert-ThrowsContains { Set-AzRecoveryServicesVaultProperty -EncryptionKeyId $encryptionKeyId2 -VaultId $vault.ID -InfrastructureEncryption -UseSystemAssignedIdentity $false } `
392393
"Please input a valid UserAssignedIdentity";
393394

394395
# set and verify - CMK encryption property to UAI
395-
Set-AzRecoveryServicesVaultProperty -EncryptionKeyId $encryptionKeyId -VaultId $vault.ID -InfrastructureEncryption -UseSystemAssignedIdentity $false -UserAssignedIdentity $vault.Identity.UserAssignedIdentities.Keys[0]
396+
Set-AzRecoveryServicesVaultProperty -EncryptionKeyId $encryptionKeyId2 -VaultId $vault.ID -InfrastructureEncryption -UseSystemAssignedIdentity $false -UserAssignedIdentity $vault.Identity.UserAssignedIdentities.Keys[0]
396397
$prop = Get-AzRecoveryServicesVaultProperty -VaultId $vault.ID
397398
Assert-True { $prop.encryptionProperties.UserAssignedIdentity -eq $vault.Identity.UserAssignedIdentities.Keys[0] }
398399

400+
$vault = Get-AzRecoveryServicesVault -ResourceGroupName $resourceGroupName -Name $vaultName
401+
Assert-True { $vault.Properties.EncryptionProperty.KekIdentity.UserAssignedIdentity -eq $vault.Identity.UserAssignedIdentities.Keys[0] }
402+
Assert-True { $vault.Properties.EncryptionProperty.KeyVaultProperties.KeyUri -eq $encryptionKeyId2 }
403+
399404
Start-TestSleep -Seconds 10
400405

401406
# set and verify - CMK encryption property to system identity

0 commit comments

Comments
 (0)