Skip to content

Commit 5a56a20

Browse files
committed
status cmdlet update and first batch of test changes
1 parent d8fbe9f commit 5a56a20

File tree

5 files changed

+136
-19
lines changed

5 files changed

+136
-19
lines changed

src/ResourceManager/Common/Commands.ScenarioTests.ResourceManager.Common/EnvironmentSetupHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ public virtual Collection<PSObject> RunPowerShellTest(params string[] scripts)
518518
d.Add("Microsoft.Features", null);
519519
d.Add("Microsoft.Authorization", null);
520520
d.Add("Microsoft.Compute", null);
521+
d.Add("Microsoft.Azure.Management.KeyVault", null);
521522
var providersToIgnore = new Dictionary<string, string>();
522523
providersToIgnore.Add("Microsoft.Azure.Management.Resources.ResourceManagementClient", "2016-02-01");
523524
HttpMockServer.Matcher = new PermissiveRecordMatcherWithApiExclusion(true, d, providersToIgnore);

src/ResourceManager/Compute/Commands.Compute.Test/Commands.Compute.Test.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@
6666
<Reference Include="Microsoft.Azure.Management.Compute">
6767
<HintPath>..\..\..\packages\Microsoft.Azure.Management.Compute.18.0.0\lib\net452\Microsoft.Azure.Management.Compute.dll</HintPath>
6868
</Reference>
69+
<Reference Include="Microsoft.Azure.Management.KeyVault, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
70+
<SpecificVersion>False</SpecificVersion>
71+
<HintPath>..\..\..\packages\Microsoft.Azure.Management.KeyVault.2.3.0-preview\lib\net452\Microsoft.Azure.Management.KeyVault.dll</HintPath>
72+
</Reference>
6973
<Reference Include="Microsoft.Azure.Management.Network, Version=17.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
7074
<HintPath>..\..\..\packages\Microsoft.Azure.Management.Network.17.0.0-preview\lib\net452\Microsoft.Azure.Management.Network.dll</HintPath>
7175
<Private>True</Private>

src/ResourceManager/Compute/Commands.Compute.Test/Common/ComputeTestController.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Microsoft.Azure.Graph.RBAC;
1818
using Microsoft.Azure.Management.Authorization;
1919
using Microsoft.Azure.Management.Compute;
20+
using Microsoft.Azure.Management.KeyVault;
2021
using Microsoft.Azure.Management.Network;
2122
using Microsoft.Azure.Management.Resources;
2223
using Microsoft.Azure.Management.Storage;
@@ -54,9 +55,10 @@ public sealed class ComputeTestController : RMTestBase
5455

5556
public AuthorizationManagementClient AuthorizationManagementClient { get; private set; }
5657

57-
5858
public StorageManagementClient StorageClient { get; private set; }
5959

60+
public KeyVaultManagementClient KeyVaultManagementClient { get; private set; }
61+
6062
public NetworkManagementClient NetworkManagementClient { get; private set; }
6163

6264
public ComputeManagementClient ComputeManagementClient { get; private set; }
@@ -189,6 +191,7 @@ private void SetupManagementClients(RestTestFramework.MockContext context)
189191
StorageClient = GetStorageManagementClient(context);
190192
GalleryClient = GetGalleryClient();
191193
//var eventsClient = GetEventsClient();
194+
KeyVaultManagementClient = GetKeyVaultManagementClient(context);
192195
NetworkManagementClient = this.GetNetworkManagementClientClient(context);
193196
ComputeManagementClient = GetComputeManagementClient(context);
194197
AuthorizationManagementClient = GetAuthorizationManagementClient();
@@ -202,6 +205,7 @@ private void SetupManagementClients(RestTestFramework.MockContext context)
202205
StorageClient,
203206
GalleryClient,
204207
//eventsClient,
208+
KeyVaultManagementClient,
205209
NetworkManagementClient,
206210
ComputeManagementClient,
207211
AuthorizationManagementClient,
@@ -277,6 +281,13 @@ private GalleryClient GetGalleryClient()
277281
// return TestBase.GetServiceClient<EventsClient>(this.csmTestFactory);
278282
//}
279283

284+
private KeyVaultManagementClient GetKeyVaultManagementClient(RestTestFramework.MockContext context)
285+
{
286+
return testViaCsm
287+
? context.GetServiceClient<KeyVaultManagementClient>(RestTestFramework.TestEnvironmentFactory.GetTestEnvironment())
288+
: TestBase.GetServiceClient<KeyVaultManagementClient>(new RDFETestEnvironmentFactory());
289+
}
290+
280291
private NetworkManagementClient GetNetworkManagementClientClient(RestTestFramework.MockContext context)
281292
{
282293
return testViaCsm

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineExtensionTests.ps1

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,9 +1037,9 @@ function Test-AzureDiskEncryptionExtensionSinglePass
10371037
try
10381038
{
10391039
# create virtual machine and key vault prerequisites
1040-
$vm = Create-VirtualMachine $resourceGroupName "centraluseuap"
1040+
$vm = Create-VirtualMachine $resourceGroupName
10411041
$kv = Create-KeyVault $vm.ResourceGroupName $vm.Location
1042-
1042+
10431043
# enable encryption with single pass syntax (omits AD parameters)
10441044
Set-AzureRmVMDiskEncryptionExtension `
10451045
-ResourceGroupName $vm.ResourceGroupName `
@@ -1048,14 +1048,14 @@ function Test-AzureDiskEncryptionExtensionSinglePass
10481048
-DiskEncryptionKeyVaultId $kv.DiskEncryptionKeyVaultId `
10491049
-KeyEncryptionKeyUrl $kv.KeyEncryptionKeyUrl `
10501050
-KeyEncryptionKeyVaultId $kv.KeyEncryptionKeyVaultId `
1051-
-VolumeType "All" `
1051+
-VolumeType "ALL" `
10521052
-Force
10531053

10541054
# verify encryption state
10551055
$status = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
10561056
Assert-NotNull $status
1057-
Assert-AreEqual $status.OsVolumeEncrypted $true
1058-
Assert-AreEqual $status.DataVolumesEncrypted $true
1057+
Assert-AreEqual $status.OsVolumeEncrypted Encrypted
1058+
Assert-AreEqual $status.DataVolumesEncrypted NotEncrypted
10591059

10601060
# verify encryption settings
10611061
$settings = $status.OsVolumeEncryptionSettings

src/ResourceManager/Compute/Commands.Compute/Extension/AzureDiskEncryption/GetAzureDiskEncryptionStatus.cs

Lines changed: 114 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ private bool IsExtensionInstalled(OSType currentOSType)
136136
{
137137
this.Name = this.Name ?? AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultName;
138138
}
139+
139140

140141
AzureOperationResponse<VirtualMachineExtension> extensionResult = this.VirtualMachineExtensionClient.GetWithInstanceView(this.ResourceGroupName, this.VMName, this.Name);
141142
if (extensionResult == null)
@@ -222,19 +223,14 @@ private string GetExtensionStatusMessage(OSType currentOSType, bool returnSubsta
222223
if (publisherMatch)
223224
{
224225
AzureDiskEncryptionExtensionContext context = new AzureDiskEncryptionExtensionContext(returnedExtension);
225-
if ((context == null) ||
226-
(context.Statuses == null) ||
227-
(context.Statuses.Count < 1) ||
228-
(string.IsNullOrWhiteSpace(context.Statuses[0].Message)))
226+
if ((context == null) || (context.Statuses == null) || (context.Statuses.Count < 1))
229227
{
230228
throw new KeyNotFoundException(string.Format(CultureInfo.CurrentUICulture, "Invalid extension status"));
231229
}
232230

233231
if (returnSubstatusMessage)
234232
{
235-
if((context == null) ||
236-
(context.SubStatuses == null) ||
237-
(context.SubStatuses.Count < 1))
233+
if ((context == null) || (context.SubStatuses == null) || (context.SubStatuses.Count < 1))
238234
{
239235
throw new KeyNotFoundException(string.Format(CultureInfo.CurrentUICulture, "Invalid extension substatus"));
240236
}
@@ -243,8 +239,18 @@ private string GetExtensionStatusMessage(OSType currentOSType, bool returnSubsta
243239
return context.SubStatuses[0].Message;
244240
}
245241
}
246-
247-
return context.Statuses[0].Message;
242+
else
243+
{
244+
if (!string.IsNullOrWhiteSpace(context.Statuses[0].Message))
245+
{
246+
return context.Statuses[0].Message;
247+
}
248+
else
249+
{
250+
// if message is empty, fall back to display status
251+
return context.Statuses[0].DisplayStatus;
252+
}
253+
}
248254
}
249255
else
250256
{
@@ -299,6 +305,17 @@ private EncryptionStatus IsOsVolumeEncrypted(VirtualMachine vmParameters)
299305
}
300306
}
301307

308+
private string GetLastEncryptionStatus(DiskInstanceView div)
309+
{
310+
string lastCode = "";
311+
foreach (InstanceViewStatus ivs in div.Statuses)
312+
{
313+
if (ivs.Code.StartsWith("EncryptionState/"))
314+
lastCode = ivs.Code;
315+
}
316+
return lastCode;
317+
}
318+
302319
private DiskEncryptionSettings GetOsVolumeEncryptionSettings(VirtualMachine vmParameters)
303320
{
304321
if ((vmParameters != null) &&
@@ -307,6 +324,8 @@ private DiskEncryptionSettings GetOsVolumeEncryptionSettings(VirtualMachine vmPa
307324
{
308325
return vmParameters.StorageProfile.OsDisk.EncryptionSettings;
309326
}
327+
328+
// nothing found
310329
return null;
311330
}
312331

@@ -373,6 +392,18 @@ private bool ExtensionProvisioningSucceeded(AzureDiskEncryptionExtensionContext
373392

374393
private EncryptionStatus AreDataVolumesEncrypted(VirtualMachine vmParameters)
375394
{
395+
// return true if any (non-OS) data volume attached to the VM reports an encrypted state
396+
VirtualMachineInstanceView iv = this.ComputeClient.ComputeManagementClient.VirtualMachines.InstanceView(this.ResourceGroupName, this.VMName);
397+
foreach (DiskInstanceView div in iv.Disks)
398+
{
399+
if (!((div.Name.Equals("osDisk") || div.Name.Contains("_OsDisk_"))) &&
400+
GetLastEncryptionStatus(div).Equals("EncryptionState/encrypted"))
401+
{
402+
return EncryptionStatus.Encrypted;
403+
}
404+
}
405+
406+
// no encrypted status found in disk instance data, check vm model
376407
if (vmParameters == null || vmParameters.Resources == null)
377408
{
378409
return EncryptionStatus.Unknown;
@@ -409,21 +440,91 @@ private EncryptionStatus AreDataVolumesEncrypted(VirtualMachine vmParameters)
409440
return EncryptionStatus.NotEncrypted;
410441
}
411442

443+
private AzureDiskEncryptionStatusContext GetStatusFromInstanceView()
444+
{
445+
AzureDiskEncryptionStatusContext result = null;
446+
447+
VirtualMachineInstanceView iv = this.ComputeClient.ComputeManagementClient.VirtualMachines.InstanceView(this.ResourceGroupName, this.VMName);
448+
if (iv != null)
449+
{
450+
result = new AzureDiskEncryptionStatusContext();
451+
result.OsVolumeEncrypted = EncryptionStatus.Unknown;
452+
result.DataVolumesEncrypted = EncryptionStatus.Unknown;
453+
454+
foreach (DiskInstanceView div in iv.Disks)
455+
{
456+
if (result.OsVolumeEncrypted==EncryptionStatus.Unknown &&
457+
(div.Name.Equals("osDisk") || div.Name.Contains("_OsDisk_")))
458+
{
459+
// check os volume status
460+
string status = GetLastEncryptionStatus(div);
461+
switch (status)
462+
{
463+
case "EncryptionState/encrypted":
464+
result.OsVolumeEncrypted = EncryptionStatus.Encrypted;
465+
break;
466+
case "EncryptionState/notEncrypted":
467+
result.OsVolumeEncrypted = EncryptionStatus.NotEncrypted;
468+
break;
469+
default:
470+
break;
471+
}
472+
result.OsVolumeEncryptionSettings = (div.EncryptionSettings != null) ? div.EncryptionSettings[0] : null;
473+
}
474+
else if (result.DataVolumesEncrypted == EncryptionStatus.Unknown)
475+
{
476+
// check data volume status
477+
string status = GetLastEncryptionStatus(div);
478+
if (status.Equals("EncryptionState/encrypted"))
479+
{
480+
result.DataVolumesEncrypted = EncryptionStatus.Encrypted;
481+
}
482+
else if (status.Equals("EncryptionState/notEncrypted"))
483+
{
484+
result.DataVolumesEncrypted = EncryptionStatus.NotEncrypted;
485+
}
486+
}
487+
}
488+
}
489+
490+
return result;
491+
}
492+
412493
public override void ExecuteCmdlet()
413494
{
414495
base.ExecuteCmdlet();
415496

416497
ExecuteClientAction(() =>
417498
{
499+
// get current extension status progress message
418500
VirtualMachine vmParameters = (this.ComputeClient.ComputeManagementClient.VirtualMachines.Get(this.ResourceGroupName, this.VMName));
501+
OSType osType = GetOSType(vmParameters);
502+
string progressMessage = null;
503+
if (IsExtensionInstalled(osType))
504+
{
505+
try
506+
{
507+
progressMessage = GetExtensionStatusMessage(osType);
508+
}
509+
catch (KeyNotFoundException)
510+
{
511+
progressMessage = string.Format(CultureInfo.CurrentUICulture, "Extension status not available on the VM");
512+
}
513+
}
419514

515+
// retrieve encryption state using per-disk instance status and report if successful
516+
AzureDiskEncryptionStatusContext encryptionStatus = GetStatusFromInstanceView();
517+
if (encryptionStatus != null && !(encryptionStatus.OsVolumeEncrypted==EncryptionStatus.Unknown || encryptionStatus.DataVolumesEncrypted==EncryptionStatus.Unknown))
518+
{
519+
encryptionStatus.ProgressMessage = progressMessage;
520+
WriteObject(encryptionStatus);
521+
return;
522+
}
523+
524+
// fall back to retrieval of encryption state using vm model extension status
420525
EncryptionStatus osVolumeEncrypted = IsOsVolumeEncrypted(vmParameters);
421526
DiskEncryptionSettings osVolumeEncryptionSettings = GetOsVolumeEncryptionSettings(vmParameters);
422527
EncryptionStatus dataVolumesEncrypted = AreDataVolumesEncrypted(vmParameters);
423-
AzureDiskEncryptionStatusContext encryptionStatus = null;
424-
string progressMessage = null;
425-
426-
OSType osType = GetOSType(vmParameters);
427528
switch (osType)
428529
{
429530
case OSType.Windows:

0 commit comments

Comments
 (0)