Skip to content

Commit 28a470e

Browse files
authored
Merge pull request #4731 from hyonholee/preview
Fix Get-AzureRmVmssVMDiskEncryption for data disk
2 parents 22d98f3 + 440d454 commit 28a470e

File tree

10 files changed

+27766
-21
lines changed

10 files changed

+27766
-21
lines changed

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineScaleSetExtensionTests.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ public void TestGetVirtualMachineScaleSetDiskEncryptionStatus()
3939
{
4040
ComputeTestController.NewInstance.RunPsTest("Test-GetVirtualMachineScaleSetDiskEncryptionStatus");
4141
}
42-
}
4342

43+
[Fact]
44+
[Trait(Category.AcceptanceType, Category.CheckIn)]
45+
public void TestGetVirtualMachineScaleSetDiskEncryptionDataDisk()
46+
{
47+
ComputeTestController.NewInstance.RunPsTest("Test-GetVirtualMachineScaleSetDiskEncryptionDataDisk");
48+
}
49+
}
4450
}

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,3 +259,43 @@ function Test-GetVirtualMachineScaleSetDiskEncryptionStatus
259259
Clean-ResourceGroup $rgname
260260
}
261261
}
262+
263+
<#
264+
.SYNOPSIS
265+
Test Get Virtual Machine Scale Set Disk Encryption for VMSS with a data disk.
266+
Precondition: The given VMSS has an encrypted data disk.
267+
#>
268+
function Test-GetVirtualMachineScaleSetDiskEncryptionDataDisk
269+
{
270+
$rgname = "hyleevmssdetest2";
271+
$vmssName = "vmsshyleevmssdetest3";
272+
$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname;
273+
$output = $result | Out-String;
274+
275+
$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
276+
$output = $result | Out-String;
277+
278+
$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
279+
Assert-AreEqual "Encrypted" $result[0].DataVolumesEncrypted;
280+
$output = $result | Out-String;
281+
282+
$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName -InstanceId "1";
283+
Assert-AreEqual "Encrypted" $result.DataVolumesEncrypted;
284+
$output = $result | Out-String;
285+
286+
Disable-AzureRmVmssDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName -Force;
287+
288+
$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname;
289+
$output = $result | Out-String;
290+
291+
$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
292+
$output = $result | Out-String;
293+
294+
$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
295+
Assert-AreEqual "NotEncrypted" $result[0].DataVolumesEncrypted;
296+
$output = $result | Out-String;
297+
298+
$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName -InstanceId "1";
299+
Assert-AreEqual "NotEncrypted" $result.DataVolumesEncrypted;
300+
$output = $result | Out-String;
301+
}

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineScaleSetExtensionTests/TestGetVirtualMachineScaleSetDiskEncryptionDataDisk.json

Lines changed: 27667 additions & 0 deletions
Large diffs are not rendered by default.

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ public class DisableAzureDiskEncryptionCommand : VirtualMachineExtensionBaseCmdl
5454
Position = 2,
5555
ValueFromPipelineByPropertyName = true,
5656
HelpMessage = "Type of the volume (OS, Data or All) to perform decryption operation")]
57-
[ValidateSet("OS", "Data", "All")]
57+
[ValidateSet(
58+
AzureDiskEncryptionExtensionContext.VolumeTypeOS,
59+
AzureDiskEncryptionExtensionContext.VolumeTypeData,
60+
AzureDiskEncryptionExtensionContext.VolumeTypeAll)]
5861
public string VolumeType { get; set; }
5962

6063
[Alias("ExtensionName")]

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,10 @@ public class SetAzureDiskEncryptionExtensionCommand : VirtualMachineExtensionBas
119119
Position = 9,
120120
ValueFromPipelineByPropertyName = true,
121121
HelpMessage = "Type of the volume (OS or Data) to perform encryption operation")]
122-
[ValidateSet("OS", "Data", "All")]
122+
[ValidateSet(
123+
AzureDiskEncryptionExtensionContext.VolumeTypeOS,
124+
AzureDiskEncryptionExtensionContext.VolumeTypeData,
125+
AzureDiskEncryptionExtensionContext.VolumeTypeAll)]
123126
public string VolumeType { get; set; }
124127

125128
[Parameter(

src/ResourceManager/Compute/Commands.Compute/Extension/VirtualMachineScaleSetExtensionBaseCmdlet.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// limitations under the License.
1313
// ----------------------------------------------------------------------------------
1414

15+
using Microsoft.Azure.Commands.Compute.Extension.AzureDiskEncryption;
1516
using Microsoft.Azure.Management.Compute;
1617
using Microsoft.Azure.Management.Compute.Models;
1718
using System;
@@ -90,7 +91,9 @@ protected string GetVolumeType(string VolumeType, VirtualMachineScaleSetStorageP
9091
{
9192
if (string.IsNullOrWhiteSpace(VolumeType))
9293
{
93-
return this.CurrentOSType == OperatingSystemTypes.Windows ? "All" : "Data";
94+
return this.CurrentOSType == OperatingSystemTypes.Windows
95+
? AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll
96+
: AzureVmssDiskEncryptionExtensionContext.VolumeTypeData;
9497
}
9598
else
9699
{

src/ResourceManager/Compute/Commands.Compute/Extension/VmssDiskEncryption/AzureVmssDiskEncryptionExtensionContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class AzureVmssDiskEncryptionExtensionContext : PSVirtualMachineScaleSetE
3232
public const string VolumeTypeOS = "OS";
3333
public const string VolumeTypeData = "Data";
3434
public const string VolumeTypeAll = "All";
35-
public const string StatusSucceeded = "Succeeded";
35+
public const string StatusSucceeded = "succeeded";
3636
public const string EncryptionStateString = "EncryptionState/";
3737
}
3838
}

src/ResourceManager/Compute/Commands.Compute/Extension/VmssDiskEncryption/DisableAzureVmssDiskEncryption.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ public class RemoveAzureVmssDiskEncryptionCommand : VirtualMachineScaleSetExtens
5959
Mandatory = false,
6060
ValueFromPipelineByPropertyName = true,
6161
HelpMessage = "Type of the volume (OS or Data) to perform encryption operation")]
62-
[ValidateSet("OS", "Data", "All")]
62+
[ValidateSet(
63+
AzureVmssDiskEncryptionExtensionContext.VolumeTypeOS,
64+
AzureVmssDiskEncryptionExtensionContext.VolumeTypeData,
65+
AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll)]
6366
public string VolumeType { get; set; }
6467

6568
[Parameter(

src/ResourceManager/Compute/Commands.Compute/Extension/VmssDiskEncryption/GetAzureVmssVMDiskEncryptionStatus.cs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Microsoft.Azure.Commands.Compute.Models;
1818
using Microsoft.Azure.Management.Compute;
1919
using Microsoft.Azure.Management.Compute.Models;
20+
using Newtonsoft.Json;
2021
using System.Collections.Generic;
2122
using System.Linq;
2223
using System.Management.Automation;
@@ -125,9 +126,6 @@ private PSVmssVMDiskEncryptionStatusContext GetDiskStatus(string rgName, string
125126
psResult.Disks.Add(disk);
126127
}
127128

128-
psResult.OsVolumeEncrypted = GetOsDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
129-
psResult.DataVolumesEncrypted = GetDataDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
130-
131129
try
132130
{
133131
psResult.Extension = vmssVMInstanceView.Extensions.First(e => e.Name.Equals(this.ExtensionName));
@@ -144,6 +142,9 @@ private PSVmssVMDiskEncryptionStatusContext GetDiskStatus(string rgName, string
144142
psResult.DiskEncryptionStatus = psResult.Extension.Statuses[0].DisplayStatus;
145143
}
146144

145+
psResult.OsVolumeEncrypted = GetOsDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
146+
psResult.DataVolumesEncrypted = GetDataDiskEncryptionStatus(rgName, vmssName, psResult.DiskEncryptionStatus, vmssVM.StorageProfile);
147+
147148
return psResult;
148149
}
149150

@@ -175,33 +176,49 @@ private EncryptionStatus GetOsDiskEncryptionStatus(List<DiskInstanceView> disks,
175176
: ConvertToEncryptionStatus(status.Code.Replace(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString, ""));
176177
}
177178

178-
private EncryptionStatus GetDataDiskEncryptionStatus(List<DiskInstanceView> disks, StorageProfile storage)
179+
private EncryptionStatus GetDataDiskEncryptionStatus(string rgName, string vmssName, string encryptionStatus, StorageProfile storage)
179180
{
180181
if (storage == null || storage.DataDisks == null || storage.DataDisks.Count == 0)
181182
{
182183
return EncryptionStatus.NotMounted;
183184
}
184185

185-
InstanceViewStatus status = null;
186+
// Data disk does not have disk encryption extension setting.
187+
188+
var vmssResult = this.VirtualMachineScaleSetClient.Get(rgName, vmssName);
189+
if (vmssResult.VirtualMachineProfile == null
190+
|| vmssResult.VirtualMachineProfile.ExtensionProfile == null
191+
|| vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions == null
192+
|| vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions.Count == 0)
193+
{
194+
return EncryptionStatus.NotEncrypted;
195+
}
196+
186197
try
187198
{
188-
var disk = disks.First(e => e.Name.Equals(storage.DataDisks[0].Name));
199+
VirtualMachineScaleSetExtension ext = vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions.First(
200+
e => e.Type.Equals(this.ExtensionName));
189201

190-
if (disk == null)
202+
AzureVmssDiskEncryptionExtensionPublicSettings encryptionSettings = JsonConvert.DeserializeObject<AzureVmssDiskEncryptionExtensionPublicSettings>(
203+
ext.Settings.ToString());
204+
if (encryptionSettings.VolumeType.Equals(AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll, StringComparison.OrdinalIgnoreCase)
205+
|| encryptionSettings.VolumeType.Equals(AzureVmssDiskEncryptionExtensionContext.VolumeTypeData, StringComparison.OrdinalIgnoreCase))
191206
{
192-
return EncryptionStatus.Unknown;
207+
if (encryptionSettings.EncryptionOperation.Equals(AzureDiskEncryptionExtensionConstants.enableEncryptionOperation, StringComparison.OrdinalIgnoreCase))
208+
{
209+
return !string.IsNullOrEmpty(encryptionStatus) &&
210+
encryptionStatus.EndsWith(AzureVmssDiskEncryptionExtensionContext.StatusSucceeded, StringComparison.OrdinalIgnoreCase)
211+
? EncryptionStatus.Encrypted
212+
: EncryptionStatus.Unknown;
213+
}
193214
}
194215

195-
status = disk.Statuses.First(s => s.Code.Contains(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString));
216+
return EncryptionStatus.NotEncrypted;
196217
}
197218
catch (InvalidOperationException)
198219
{
199-
return EncryptionStatus.NotEncrypted;
220+
return EncryptionStatus.Unknown;
200221
}
201-
202-
return (status == null)
203-
? EncryptionStatus.NotEncrypted
204-
: ConvertToEncryptionStatus(status.Code.Replace(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString, ""));
205222
}
206223

207224
private EncryptionStatus ConvertToEncryptionStatus(string encryptionStatusString)

src/ResourceManager/Compute/Commands.Compute/Extension/VmssDiskEncryption/SetAzureVmssDiskEncryptionExtension.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ public class SetAzureVmssDiskEncryptionExtensionCommand : VirtualMachineScaleSet
9292
Mandatory = false,
9393
ValueFromPipelineByPropertyName = true,
9494
HelpMessage = "Type of the volume (OS or Data) to perform encryption operation")]
95-
[ValidateSet("OS", "Data", "All")]
95+
[ValidateSet(
96+
AzureVmssDiskEncryptionExtensionContext.VolumeTypeOS,
97+
AzureVmssDiskEncryptionExtensionContext.VolumeTypeData,
98+
AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll)]
9699
public string VolumeType { get; set; }
97100

98101
[Parameter(

0 commit comments

Comments
 (0)