Skip to content

Commit 64a6b29

Browse files
authored
Merge pull request #5764 from ejarvi/vmssddstatus
Update Get-AzureRmVmssDiskEncryptionStatus cmdlets
2 parents 079fd4a + 2d190cc commit 64a6b29

File tree

9 files changed

+4996
-31930
lines changed

9 files changed

+4996
-31930
lines changed

src/ResourceManager/Compute/ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
- Additional information about change #1
1919
-->
2020
## Current Release
21+
* `Get-AzureRmVmssDiskEncryptionStatus` supports encryption status at data disk level
22+
* `Get-AzureRmVmssVmDiskEncryptionStatus` supports encryption status at data disk level
2123
* Update for Zone Resilient
2224
* `New-AzureRmVm` and `New-AzureRmVmss` (simple parameter set) support availability zones.
2325
* Updated to the latest version of the Azure ClientRuntime

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

Lines changed: 143 additions & 241 deletions
Large diffs are not rendered by default.

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

Lines changed: 3592 additions & 479 deletions
Large diffs are not rendered by default.

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

Lines changed: 84 additions & 117 deletions
Large diffs are not rendered by default.

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

Lines changed: 632 additions & 26216 deletions
Large diffs are not rendered by default.

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

Lines changed: 473 additions & 4827 deletions
Large diffs are not rendered by default.

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

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class GetAzureVmssDiskEncryptionStatusCommand : VirtualMachineScaleSetExt
3939
Mandatory = false,
4040
Position = 0,
4141
ValueFromPipelineByPropertyName = true,
42-
HelpMessage = "Resource group name of the virtual machine scale set")]
42+
HelpMessage = "Resource group name of the virtual machine scale set.")]
4343
[ResourceGroupCompleter()]
4444
[ValidateNotNullOrEmpty]
4545
public string ResourceGroupName { get; set; }
@@ -57,7 +57,7 @@ public class GetAzureVmssDiskEncryptionStatusCommand : VirtualMachineScaleSetExt
5757
Mandatory = false,
5858
Position = 2,
5959
ValueFromPipelineByPropertyName = true,
60-
HelpMessage = "The extension name. If this parameter is not specified, default values used are AzureDiskEncryption for windows VMs and AzureDiskEncryptionForLinux for Linux VMs")]
60+
HelpMessage = "The extension name. If this parameter is not specified, defaults to AzureDiskEncryption for Windows and AzureDiskEncryptionForLinux for Linux.")]
6161
[ValidateNotNullOrEmpty]
6262
public string ExtensionName { get; set; }
6363

@@ -132,8 +132,8 @@ private PSVmssDiskEncryptionStatusContext GetVmssDiskStatus(string rgName, strin
132132
return psResult;
133133
}
134134

135+
// retrieve installation status of the extension
135136
SetOSType(vmssResult.VirtualMachineProfile);
136-
137137
try
138138
{
139139
if (string.IsNullOrWhiteSpace(this.ExtensionName))
@@ -155,25 +155,19 @@ private PSVmssDiskEncryptionStatusContext GetVmssDiskStatus(string rgName, strin
155155
{
156156
return psResult;
157157
}
158-
159158
psResult.EncryptionExtensionInstalled = true;
160159

160+
// retrieve public configuration settings for the extension
161161
psResult.EncryptionSettings = JsonConvert.DeserializeObject<AzureVmssDiskEncryptionExtensionPublicSettings>(
162162
ext.Settings.ToString());
163163

164-
if (psResult.EncryptionSettings.EncryptionOperation.Equals(AzureDiskEncryptionExtensionConstants.enableEncryptionOperation, StringComparison.OrdinalIgnoreCase))
165-
{
166-
psResult.EncryptionEnabled = true;
167-
}
168-
164+
// retrieve any status summary for the extension
169165
var vmssInstanceView = this.VirtualMachineScaleSetClient.GetInstanceView(rgName, vmssName);
170-
171166
if (vmssInstanceView.Extensions == null
172167
|| vmssInstanceView.Extensions.Count == 0)
173168
{
174169
return psResult;
175170
}
176-
177171
try
178172
{
179173
extSummary = vmssInstanceView.Extensions.First(e => e.Name.Equals(this.ExtensionName));
@@ -182,9 +176,45 @@ private PSVmssDiskEncryptionStatusContext GetVmssDiskStatus(string rgName, strin
182176
{
183177
return psResult;
184178
}
185-
186179
psResult.EncryptionSummary = extSummary.StatusesSummary;
187180

181+
// check if encryption is enabled on any disk in the scale set
182+
// stop evaluation at the first occurrence of an encrypted disk
183+
var page = this.VirtualMachineScaleSetVMsClient.List(rgName, vmssName);
184+
while (!psResult.EncryptionEnabled && page!=null)
185+
{
186+
foreach (var pageItem in page)
187+
{
188+
if (psResult.EncryptionEnabled) break;
189+
VirtualMachineScaleSetVMInstanceView vmiv = this.VirtualMachineScaleSetVMsClient.GetInstanceView(rgName, vmssName, pageItem.InstanceId);
190+
if (vmiv != null && vmiv.Disks != null)
191+
{
192+
foreach (DiskInstanceView div in vmiv.Disks)
193+
{
194+
List<InstanceViewStatus> perDiskEncryptionStatuses = new List<InstanceViewStatus>();
195+
bool isEncrypted = false;
196+
foreach (InstanceViewStatus ivs in div.Statuses)
197+
{
198+
if (ivs != null && ivs.Code != null && ivs.Code.StartsWith("EncryptionState"))
199+
{
200+
if (!psResult.EncryptionEnabled)
201+
{
202+
isEncrypted = ivs.Code.Equals("EncryptionState/encrypted");
203+
}
204+
}
205+
}
206+
if (isEncrypted)
207+
{
208+
psResult.EncryptionEnabled = true;
209+
break;
210+
}
211+
}
212+
}
213+
}
214+
// advance to the next page as needed
215+
page = (page.NextPageLink != null) ? VirtualMachineScaleSetVMsClient.ListNext(page.NextPageLink) : null;
216+
}
217+
188218
return psResult;
189219
}
190220
}

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

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -128,24 +128,23 @@ private PSVmssVMDiskEncryptionStatusContext GetDiskStatus(string rgName, string
128128
psResult.Disks.Add(disk);
129129
}
130130

131-
try
132-
{
133-
psResult.Extension = vmssVMInstanceView.Extensions.First(e => e.Name.Equals(this.ExtensionName));
134-
}
135-
catch (InvalidOperationException)
136-
{
137-
psResult.DiskEncryptionStatus = string.Format("The Extension, {0}, is not installed.", this.ExtensionName);
138-
}
131+
psResult.Extension = null;
132+
psResult.DiskEncryptionStatus = string.Format("The Extension, {0}, is not installed.", this.ExtensionName);
139133

140-
if (psResult.Extension != null
141-
&& psResult.Extension.Statuses != null
142-
&& psResult.Extension.Statuses.Count > 0)
134+
// replace defaults with extension and status data for the instance if found
135+
if (vmssVMInstanceView != null && vmssVMInstanceView.Extensions != null)
143136
{
144-
psResult.DiskEncryptionStatus = psResult.Extension.Statuses[0].DisplayStatus;
137+
psResult.Extension = vmssVMInstanceView.Extensions.DefaultIfEmpty(null).FirstOrDefault(e => e.Name.Equals(this.ExtensionName));
138+
if (psResult.Extension != null
139+
&& psResult.Extension.Statuses != null
140+
&& psResult.Extension.Statuses.Count > 0)
141+
{
142+
psResult.DiskEncryptionStatus = psResult.Extension.Statuses[0].DisplayStatus;
143+
}
145144
}
146145

147146
psResult.OsVolumeEncrypted = GetOsDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
148-
psResult.DataVolumesEncrypted = GetDataDiskEncryptionStatus(rgName, vmssName, psResult.DiskEncryptionStatus, vmssVM.StorageProfile);
147+
psResult.DataVolumesEncrypted = GetDataDiskEncryptionStatus(psResult.Disks, vmssVM.StorageProfile);
149148

150149
return psResult;
151150
}
@@ -178,44 +177,34 @@ private EncryptionStatus GetOsDiskEncryptionStatus(List<DiskInstanceView> disks,
178177
: ConvertToEncryptionStatus(status.Code.Replace(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString, ""));
179178
}
180179

181-
private EncryptionStatus GetDataDiskEncryptionStatus(string rgName, string vmssName, string encryptionStatus, StorageProfile storage)
180+
private EncryptionStatus GetDataDiskEncryptionStatus(List<DiskInstanceView> disks, StorageProfile storage)
182181
{
183182
if (storage == null || storage.DataDisks == null || storage.DataDisks.Count == 0)
184183
{
185184
return EncryptionStatus.NotMounted;
186185
}
187186

188-
// Data disk does not have disk encryption extension setting.
189-
190-
var vmssResult = this.VirtualMachineScaleSetClient.Get(rgName, vmssName);
191-
if (vmssResult.VirtualMachineProfile == null
192-
|| vmssResult.VirtualMachineProfile.ExtensionProfile == null
193-
|| vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions == null
194-
|| vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions.Count == 0)
195-
{
196-
return EncryptionStatus.NotEncrypted;
197-
}
198-
199187
try
200188
{
201-
VirtualMachineScaleSetExtension ext = vmssResult.VirtualMachineProfile.ExtensionProfile.Extensions.First(
202-
e => e.Type.Equals(this.ExtensionName));
203-
204-
AzureVmssDiskEncryptionExtensionPublicSettings encryptionSettings = JsonConvert.DeserializeObject<AzureVmssDiskEncryptionExtensionPublicSettings>(
205-
ext.Settings.ToString());
206-
if (encryptionSettings.VolumeType.Equals(AzureVmssDiskEncryptionExtensionContext.VolumeTypeAll, StringComparison.OrdinalIgnoreCase)
207-
|| encryptionSettings.VolumeType.Equals(AzureVmssDiskEncryptionExtensionContext.VolumeTypeData, StringComparison.OrdinalIgnoreCase))
189+
InstanceViewStatus status = null;
190+
try
208191
{
209-
if (encryptionSettings.EncryptionOperation.Equals(AzureDiskEncryptionExtensionConstants.enableEncryptionOperation, StringComparison.OrdinalIgnoreCase))
192+
var disk = disks.First(e => e.Name.Equals(storage.DataDisks[0].Name));
193+
194+
if (disk == null)
210195
{
211-
return !string.IsNullOrEmpty(encryptionStatus) &&
212-
encryptionStatus.EndsWith(AzureVmssDiskEncryptionExtensionContext.StatusSucceeded, StringComparison.OrdinalIgnoreCase)
213-
? EncryptionStatus.Encrypted
214-
: EncryptionStatus.Unknown;
196+
return EncryptionStatus.Unknown;
215197
}
198+
status = disk.Statuses.First(s => s.Code.Contains(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString));
199+
}
200+
catch (InvalidOperationException)
201+
{
202+
return EncryptionStatus.NotEncrypted;
216203
}
217204

218-
return EncryptionStatus.NotEncrypted;
205+
return (status == null)
206+
? EncryptionStatus.NotEncrypted
207+
: ConvertToEncryptionStatus(status.Code.Replace(AzureVmssDiskEncryptionExtensionContext.EncryptionStateString, ""));
219208
}
220209
catch (InvalidOperationException)
221210
{

src/ResourceManager/Compute/Commands.Compute/Models/PSVmssDiskEncryptionStatusContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class PSVmssDiskEncryptionStatusContext
2424
public string VmScaleSetName { get; set; }
2525
public AzureVmssDiskEncryptionExtensionPublicSettings EncryptionSettings { get; set; }
2626
public IList<VirtualMachineStatusCodeCount> EncryptionSummary { get; set; }
27+
// EncryptionEnabled is true when any disk reports an encrypted status
2728
public bool EncryptionEnabled { get; set; }
2829
public bool EncryptionExtensionInstalled { get; set; }
2930
}

0 commit comments

Comments
 (0)