Skip to content

Fix Get-AzureRmVmssVMDiskEncryption for data disk #4731

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ public void TestGetVirtualMachineScaleSetDiskEncryptionStatus()
{
ComputeTestController.NewInstance.RunPsTest("Test-GetVirtualMachineScaleSetDiskEncryptionStatus");
}
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestGetVirtualMachineScaleSetDiskEncryptionDataDisk()
{
ComputeTestController.NewInstance.RunPsTest("Test-GetVirtualMachineScaleSetDiskEncryptionDataDisk");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -259,3 +259,43 @@ function Test-GetVirtualMachineScaleSetDiskEncryptionStatus
Clean-ResourceGroup $rgname
}
}

<#
.SYNOPSIS
Test Get Virtual Machine Scale Set Disk Encryption for VMSS with a data disk.
Precondition: The given VMSS has an encrypted data disk.
#>
function Test-GetVirtualMachineScaleSetDiskEncryptionDataDisk
{
$rgname = "hyleevmssdetest2";
$vmssName = "vmsshyleevmssdetest3";
$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname;
$output = $result | Out-String;

$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
$output = $result | Out-String;

$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
Assert-AreEqual "Encrypted" $result[0].DataVolumesEncrypted;
$output = $result | Out-String;

$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName -InstanceId "1";
Assert-AreEqual "Encrypted" $result.DataVolumesEncrypted;
$output = $result | Out-String;

Disable-AzureRmVmssDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName -Force;

$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname;
$output = $result | Out-String;

$result = Get-AzureRmVmssDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
$output = $result | Out-String;

$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName;
Assert-AreEqual "NotEncrypted" $result[0].DataVolumesEncrypted;
$output = $result | Out-String;

$result = Get-AzureRmVmssVMDiskEncryption -ResourceGroupName $rgname -VMScaleSetName $vmssName -InstanceId "1";
Assert-AreEqual "NotEncrypted" $result.DataVolumesEncrypted;
$output = $result | Out-String;
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ public class DisableAzureDiskEncryptionCommand : VirtualMachineExtensionBaseCmdl
Position = 2,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Type of the volume (OS, Data or All) to perform decryption operation")]
[ValidateSet("OS", "Data", "All")]
[ValidateSet(
AzureDiskEncryptionExtensionContext.VolumeTypeOS,
AzureDiskEncryptionExtensionContext.VolumeTypeData,
AzureDiskEncryptionExtensionContext.VolumeTypeAll)]
public string VolumeType { get; set; }

[Alias("ExtensionName")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,10 @@ public class SetAzureDiskEncryptionExtensionCommand : VirtualMachineExtensionBas
Position = 9,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Type of the volume (OS or Data) to perform encryption operation")]
[ValidateSet("OS", "Data", "All")]
[ValidateSet(
AzureDiskEncryptionExtensionContext.VolumeTypeOS,
AzureDiskEncryptionExtensionContext.VolumeTypeData,
AzureDiskEncryptionExtensionContext.VolumeTypeAll)]
public string VolumeType { get; set; }

[Parameter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
// limitations under the License.
// ----------------------------------------------------------------------------------

using Microsoft.Azure.Commands.Compute.Extension.AzureDiskEncryption;
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Management.Compute.Models;
using System;
Expand Down Expand Up @@ -90,7 +91,9 @@ protected string GetVolumeType(string VolumeType, VirtualMachineScaleSetStorageP
{
if (string.IsNullOrWhiteSpace(VolumeType))
{
return this.CurrentOSType == OperatingSystemTypes.Windows ? "All" : "Data";
return this.CurrentOSType == OperatingSystemTypes.Windows
? AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll
: AzureVmssDiskEncryptionExtensionContext.VolumeTypeData;
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class AzureVmssDiskEncryptionExtensionContext : PSVirtualMachineScaleSetE
public const string VolumeTypeOS = "OS";
public const string VolumeTypeData = "Data";
public const string VolumeTypeAll = "All";
public const string StatusSucceeded = "Succeeded";
public const string StatusSucceeded = "succeeded";
public const string EncryptionStateString = "EncryptionState/";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ public class RemoveAzureVmssDiskEncryptionCommand : VirtualMachineScaleSetExtens
Mandatory = false,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Type of the volume (OS or Data) to perform encryption operation")]
[ValidateSet("OS", "Data", "All")]
[ValidateSet(
AzureVmssDiskEncryptionExtensionContext.VolumeTypeOS,
AzureVmssDiskEncryptionExtensionContext.VolumeTypeData,
AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll)]
public string VolumeType { get; set; }

[Parameter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using Microsoft.Azure.Commands.Compute.Models;
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Management.Compute.Models;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
Expand Down Expand Up @@ -125,9 +126,6 @@ private PSVmssVMDiskEncryptionStatusContext GetDiskStatus(string rgName, string
psResult.Disks.Add(disk);
}

psResult.OsVolumeEncrypted = GetOsDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
psResult.DataVolumesEncrypted = GetDataDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);

try
{
psResult.Extension = vmssVMInstanceView.Extensions.First(e => e.Name.Equals(this.ExtensionName));
Expand All @@ -144,6 +142,9 @@ private PSVmssVMDiskEncryptionStatusContext GetDiskStatus(string rgName, string
psResult.DiskEncryptionStatus = psResult.Extension.Statuses[0].DisplayStatus;
}

psResult.OsVolumeEncrypted = GetOsDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
psResult.DataVolumesEncrypted = GetDataDiskEncryptionStatus(rgName, vmssName, psResult.DiskEncryptionStatus, vmssVM.StorageProfile);

return psResult;
}

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

private EncryptionStatus GetDataDiskEncryptionStatus(List<DiskInstanceView> disks, StorageProfile storage)
private EncryptionStatus GetDataDiskEncryptionStatus(string rgName, string vmssName, string encryptionStatus, StorageProfile storage)
{
if (storage == null || storage.DataDisks == null || storage.DataDisks.Count == 0)
{
return EncryptionStatus.NotMounted;
}

InstanceViewStatus status = null;
// Data disk does not have disk encryption extension setting.

var vmssResult = this.VirtualMachineScaleSetClient.Get(rgName, vmssName);
if (vmssResult.VirtualMachineProfile == null
|| vmssResult.VirtualMachineProfile.ExtensionProfile == null
|| vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions == null
|| vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions.Count == 0)
{
return EncryptionStatus.NotEncrypted;
}

try
{
var disk = disks.First(e => e.Name.Equals(storage.DataDisks[0].Name));
VirtualMachineScaleSetExtension ext = vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions.First(
e => e.Type.Equals(this.ExtensionName));

if (disk == null)
AzureVmssDiskEncryptionExtensionPublicSettings encryptionSettings = JsonConvert.DeserializeObject<AzureVmssDiskEncryptionExtensionPublicSettings>(
ext.Settings.ToString());
if (encryptionSettings.VolumeType.Equals(AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll, StringComparison.OrdinalIgnoreCase)
|| encryptionSettings.VolumeType.Equals(AzureVmssDiskEncryptionExtensionContext.VolumeTypeData, StringComparison.OrdinalIgnoreCase))
{
return EncryptionStatus.Unknown;
if (encryptionSettings.EncryptionOperation.Equals(AzureDiskEncryptionExtensionConstants.enableEncryptionOperation, StringComparison.OrdinalIgnoreCase))
{
return !string.IsNullOrEmpty(encryptionStatus) &&
encryptionStatus.EndsWith(AzureVmssDiskEncryptionExtensionContext.StatusSucceeded, StringComparison.OrdinalIgnoreCase)
? EncryptionStatus.Encrypted
: EncryptionStatus.Unknown;
}
}

status = disk.Statuses.First(s => s.Code.Contains(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString));
return EncryptionStatus.NotEncrypted;
}
catch (InvalidOperationException)
{
return EncryptionStatus.NotEncrypted;
return EncryptionStatus.Unknown;
}

return (status == null)
? EncryptionStatus.NotEncrypted
: ConvertToEncryptionStatus(status.Code.Replace(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString, ""));
}

private EncryptionStatus ConvertToEncryptionStatus(string encryptionStatusString)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,10 @@ public class SetAzureVmssDiskEncryptionExtensionCommand : VirtualMachineScaleSet
Mandatory = false,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Type of the volume (OS or Data) to perform encryption operation")]
[ValidateSet("OS", "Data", "All")]
[ValidateSet(
AzureVmssDiskEncryptionExtensionContext.VolumeTypeOS,
AzureVmssDiskEncryptionExtensionContext.VolumeTypeData,
AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll)]
public string VolumeType { get; set; }

[Parameter(
Expand Down