Skip to content

Commit abd428c

Browse files
hyonholeeshahabhijeet
authored andcommitted
[AzureRT] Fix Get-AzureRmVM issue (#3375)
* Fix Get-AzureRmVM issue (#3372) * Update AzureRM.Compute changelog.
1 parent 2526f28 commit abd428c

File tree

2 files changed

+53
-35
lines changed

2 files changed

+53
-35
lines changed

src/ResourceManager/Compute/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- Additional information about change #1
1919
-->
2020
## Current Release
21+
* Fix Get-AzureRmVM with -Status issue: Get-AzureRmVM throws an exception when Get-AzureRmVM lists multiple VMs and some of the VMs are deleted during Get-AzureRmVM is performed.
2122
* New parameters in New-AzureRmVMSqlServerAutoBackupConfig cmdlet to support Auto Backup for SQL Server 2016 VMs.
2223
- BackupSystemDbs : Specifies if system databases should be added to Sql Server Managed Backup.
2324
- BackupScheduleType : Specifies the type of managed backup schedule, manual or automated. If it's manual, schedule settings need to be specified.

src/ResourceManager/Compute/Commands.Compute/VirtualMachine/Operation/GetAzureVMCommand.cs

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class GetAzureVMCommand : VirtualMachineBaseCmdlet
3232
protected const string ListVirtualMachineInResourceGroupParamSet = "ListVirtualMachineInResourceGroupParamSet";
3333
protected const string ListAllVirtualMachinesParamSet = "ListAllVirtualMachinesParamSet";
3434
protected const string ListNextLinkVirtualMachinesParamSet = "ListNextLinkVirtualMachinesParamSet";
35+
private const string InfoNotAvailable = "Info Not Available";
3536

3637
[Parameter(
3738
Mandatory = true,
@@ -101,23 +102,7 @@ public override void ExecuteCmdlet()
101102

102103
while (vmListResult != null)
103104
{
104-
if (vmListResult.Body != null)
105-
{
106-
foreach (var item in vmListResult.Body)
107-
{
108-
var psItem = Mapper.Map<PSVirtualMachineListStatus>(vmListResult);
109-
psItem = Mapper.Map(item, psItem);
110-
if (this.Status.IsPresent)
111-
{
112-
// Call additional Get InstanceView of each VM to get the power states of all VM.
113-
var state = this.VirtualMachineClient.Get(psItem.ResourceGroupName, psItem.Name, InstanceViewExpand);
114-
var psstate = state.ToPSVirtualMachineInstanceView(psItem.ResourceGroupName, psItem.Name);
115-
psItem.PowerState = psstate.Statuses[1].DisplayStatus;
116-
}
117-
psItem.DisplayHint = this.DisplayHint;
118-
psResultListStatus.Add(psItem);
119-
}
120-
}
105+
psResultListStatus = GetPowerstate(vmListResult, psResultListStatus);
121106

122107
if (!string.IsNullOrEmpty(vmListResult.Body.NextPageLink))
123108
{
@@ -171,25 +156,9 @@ public override void ExecuteCmdlet()
171156
AzureOperationResponse<IPage<VirtualMachine>> vmListResult = null;
172157
vmListResult = this.VirtualMachineClient.ListWithHttpMessagesAsync(this.ResourceGroupName)
173158
.GetAwaiter().GetResult();
174-
var psResultListStatus = new List<PSVirtualMachineListStatus>();
175-
if (vmListResult.Body != null)
176-
{
177-
foreach (var item in vmListResult.Body)
178-
{
179-
var psItem = Mapper.Map<PSVirtualMachineListStatus>(vmListResult);
180-
psItem = Mapper.Map(item, psItem);
181159

182-
if (this.Status.IsPresent)
183-
{
184-
// Call additional Get InstanceView of each VM to get the power states of all VM.
185-
var state = this.VirtualMachineClient.Get(this.ResourceGroupName, psItem.Name, InstanceViewExpand);
186-
var psstate = state.ToPSVirtualMachineInstanceView(this.ResourceGroupName, psItem.Name);
187-
psItem.PowerState = psstate.Statuses[1].DisplayStatus;
188-
}
189-
psItem.DisplayHint = this.DisplayHint;
190-
psResultListStatus.Add(psItem);
191-
}
192-
}
160+
var psResultListStatus = new List<PSVirtualMachineListStatus>();
161+
psResultListStatus = GetPowerstate(vmListResult, psResultListStatus);
193162

194163
if (this.Status.IsPresent)
195164
{
@@ -208,5 +177,53 @@ public override void ExecuteCmdlet()
208177
}
209178
});
210179
}
180+
181+
private List<PSVirtualMachineListStatus> GetPowerstate(
182+
AzureOperationResponse<IPage<VirtualMachine>> vmListResult,
183+
List<PSVirtualMachineListStatus> psResultListStatus)
184+
{
185+
if (vmListResult.Body != null)
186+
{
187+
foreach (var item in vmListResult.Body)
188+
{
189+
var psItem = Mapper.Map<PSVirtualMachineListStatus>(vmListResult);
190+
psItem = Mapper.Map(item, psItem);
191+
if (this.Status.IsPresent)
192+
{
193+
VirtualMachine state = null;
194+
try
195+
{
196+
// Call additional Get InstanceView of each VM to get the power states of all VM.
197+
state = this.VirtualMachineClient.Get(psItem.ResourceGroupName, psItem.Name, InstanceViewExpand);
198+
}
199+
catch
200+
{
201+
// Swallow any exception during getting instance view information.
202+
}
203+
204+
if (state == null)
205+
{
206+
psItem.PowerState = InfoNotAvailable;
207+
}
208+
else
209+
{
210+
var psstate = state.ToPSVirtualMachineInstanceView(psItem.ResourceGroupName, psItem.Name);
211+
if (psstate != null && psstate.Statuses != null && psstate.Statuses.Count > 1)
212+
{
213+
psItem.PowerState = psstate.Statuses[1].DisplayStatus;
214+
}
215+
else
216+
{
217+
psItem.PowerState = InfoNotAvailable;
218+
}
219+
}
220+
}
221+
psItem.DisplayHint = this.DisplayHint;
222+
psResultListStatus.Add(psItem);
223+
}
224+
}
225+
226+
return psResultListStatus;
227+
}
211228
}
212229
}

0 commit comments

Comments
 (0)