Skip to content

[AzureRT] Fix Get-AzureRmVM issue #3375

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 2 commits into from
Jan 12, 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
1 change: 1 addition & 0 deletions src/ResourceManager/Compute/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
- Additional information about change #1
-->
## Current Release
* 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.
* New parameters in New-AzureRmVMSqlServerAutoBackupConfig cmdlet to support Auto Backup for SQL Server 2016 VMs.
- BackupSystemDbs : Specifies if system databases should be added to Sql Server Managed Backup.
- BackupScheduleType : Specifies the type of managed backup schedule, manual or automated. If it's manual, schedule settings need to be specified.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public class GetAzureVMCommand : VirtualMachineBaseCmdlet
protected const string ListVirtualMachineInResourceGroupParamSet = "ListVirtualMachineInResourceGroupParamSet";
protected const string ListAllVirtualMachinesParamSet = "ListAllVirtualMachinesParamSet";
protected const string ListNextLinkVirtualMachinesParamSet = "ListNextLinkVirtualMachinesParamSet";
private const string InfoNotAvailable = "Info Not Available";

[Parameter(
Mandatory = true,
Expand Down Expand Up @@ -101,23 +102,7 @@ public override void ExecuteCmdlet()

while (vmListResult != null)
{
if (vmListResult.Body != null)
{
foreach (var item in vmListResult.Body)
{
var psItem = Mapper.Map<PSVirtualMachineListStatus>(vmListResult);
psItem = Mapper.Map(item, psItem);
if (this.Status.IsPresent)
{
// Call additional Get InstanceView of each VM to get the power states of all VM.
var state = this.VirtualMachineClient.Get(psItem.ResourceGroupName, psItem.Name, InstanceViewExpand);
var psstate = state.ToPSVirtualMachineInstanceView(psItem.ResourceGroupName, psItem.Name);
psItem.PowerState = psstate.Statuses[1].DisplayStatus;
}
psItem.DisplayHint = this.DisplayHint;
psResultListStatus.Add(psItem);
}
}
psResultListStatus = GetPowerstate(vmListResult, psResultListStatus);

if (!string.IsNullOrEmpty(vmListResult.Body.NextPageLink))
{
Expand Down Expand Up @@ -171,25 +156,9 @@ public override void ExecuteCmdlet()
AzureOperationResponse<IPage<VirtualMachine>> vmListResult = null;
vmListResult = this.VirtualMachineClient.ListWithHttpMessagesAsync(this.ResourceGroupName)
.GetAwaiter().GetResult();
var psResultListStatus = new List<PSVirtualMachineListStatus>();
if (vmListResult.Body != null)
{
foreach (var item in vmListResult.Body)
{
var psItem = Mapper.Map<PSVirtualMachineListStatus>(vmListResult);
psItem = Mapper.Map(item, psItem);

if (this.Status.IsPresent)
{
// Call additional Get InstanceView of each VM to get the power states of all VM.
var state = this.VirtualMachineClient.Get(this.ResourceGroupName, psItem.Name, InstanceViewExpand);
var psstate = state.ToPSVirtualMachineInstanceView(this.ResourceGroupName, psItem.Name);
psItem.PowerState = psstate.Statuses[1].DisplayStatus;
}
psItem.DisplayHint = this.DisplayHint;
psResultListStatus.Add(psItem);
}
}
var psResultListStatus = new List<PSVirtualMachineListStatus>();
psResultListStatus = GetPowerstate(vmListResult, psResultListStatus);

if (this.Status.IsPresent)
{
Expand All @@ -208,5 +177,53 @@ public override void ExecuteCmdlet()
}
});
}

private List<PSVirtualMachineListStatus> GetPowerstate(
AzureOperationResponse<IPage<VirtualMachine>> vmListResult,
List<PSVirtualMachineListStatus> psResultListStatus)
{
if (vmListResult.Body != null)
{
foreach (var item in vmListResult.Body)
{
var psItem = Mapper.Map<PSVirtualMachineListStatus>(vmListResult);
psItem = Mapper.Map(item, psItem);
if (this.Status.IsPresent)
{
VirtualMachine state = null;
try
{
// Call additional Get InstanceView of each VM to get the power states of all VM.
state = this.VirtualMachineClient.Get(psItem.ResourceGroupName, psItem.Name, InstanceViewExpand);
}
catch
{
// Swallow any exception during getting instance view information.
}

if (state == null)
{
psItem.PowerState = InfoNotAvailable;
}
else
{
var psstate = state.ToPSVirtualMachineInstanceView(psItem.ResourceGroupName, psItem.Name);
if (psstate != null && psstate.Statuses != null && psstate.Statuses.Count > 1)
{
psItem.PowerState = psstate.Statuses[1].DisplayStatus;
}
else
{
psItem.PowerState = InfoNotAvailable;
}
}
}
psItem.DisplayHint = this.DisplayHint;
psResultListStatus.Add(psItem);
}
}

return psResultListStatus;
}
}
}