Empty VM list in WAP tenant portal although VMs are listed in VMM
This article fixes an issue in which you see an empty virtual machine list in Windows Azure Pack tenant portal.
Original product version: System Center 2016 Virtual Machine Manager, Microsoft System Center 2012 R2 Virtual Machine Manager
Original KB number: 4033452
Symptoms
When a tenant logs into the Windows Azure Pack (WAP) tenant portal and navigates to Virtual Machines, no virtual machines (VMs) appear in the list. This issue occurs even though VMs are available in the cloud and the VM list appears as expected in System Center Virtual Machine Manager (SCVMM).
This issue occurs when the following conditions are true:
- At least one of the VMs in the affected cloud is located on a VMWare host.
- At least one of the VMWare VMs has a snapshot.
When this issue occurs, you see the following error:
The following events are logged in the
Microsoft-WindowsAzurePack-MgmtSvc-TenantSite
operational event log:Log Name: Microsoft-WindowsAzurePack-MgmtSvc-TenantSite/Operational
Source: Microsoft-WindowsAzurePack-MgmtSvc-TenantSite
Date: DATE
Event ID: 221
Task Category: (2)
Level: Error
Keywords: None
User: IIS APPPOOL\USER
Computer: COMPUTER
Description:
Failed to load list of Virtual Machines for SubscriptionId: '<SUBSCRIPTION GUID>', Exception: 'DataServiceClientException: Error processing response stream. Server failed with following message:
Unable to construct the property LastRestoredCheckpointId from the object returned from the cmdlet. Cause: Unable to convert from .NET Framework type System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 to type System.Nullable`1[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
<Exception>
<Type>DataServiceClientException</Type>
<Message>Error processing response stream. Server failed with following message: Unable to construct the property LastRestoredCheckpointId from the object returned from the cmdlet. Cause: Unable to convert from .NET Framework type System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 to type System.Nullable`1[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.</Message>
<StackTrace><![CDATA[
at System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ODataFeedOrEntryReader.TryRead()
at System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ODataFeedOrEntryReader.TryStartReadFeedOrEntry()
at System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ODataFeedOrEntryReader.TryReadEntry(MaterializerEntry& entry)
at System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ODataFeedOrEntryReader.<LazyReadEntries>d__0.MoveNext()
at System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ODataFeedOrEntryReader.Read()
at System.Data.Services.Client.Materialization.ODataEntityMaterializer.ReadImplementation()
at System.Data.Services.Client.MaterializeAtom.MoveNextInternal()
at System.Data.Services.Client.MaterializeAtom.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__94`1.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass2f`2.<Then>b__2e(Task`1 t)
at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass35`2.<ThenImpl>b__34(Task innerTask)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.WindowsAzure.Server.VM.TenantExtension.Controllers.VMController.<>c__DisplayClass154.<<ListVMsInternalAsync>b__14d>d__159.MoveNext()]]></StackTrace>
<InnerException>
<Type>ODataErrorException</Type>
<Message>An error was read from the payload. See the 'Error' property for more details.</Message>
<StackTrace><![CDATA[
at Microsoft.Data.OData.Atom.BufferingXmlReader.ReadNextAndCheckForInStreamError()
at Microsoft.Data.OData.Atom.BufferingXmlReader.ReadInternal(Boolean ignoreInStreamErrors)
at Microsoft.Data.OData.Atom.BufferingXmlReader.Read()
at Microsoft.Data.OData.Atom.ODataAtomReader.ReadAtEntryEndImplementation()
at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()
at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)
at System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ODataFeedOrEntryReader.TryRead()]]></StackTrace>
</InnerException>
Cause
This issue is caused by a bug that is not scheduled to be fixed.
The VMWare VM has an associated snapshot (called a checkpoint in Hyper-V), and Virtual Machine Manager stores its ID in the VirtualMachineDB
database together with extra information. This extra information is appended to the GUID that is stored in the LastRestoredCheckpointID
column in the tbl_WLC_VmInstance
table.
To check whether you have an affected VM, run the following query:
select LastRestoredCheckpointID FROM tbl_wlc_vminstance where LEN(LastRestoredCheckpointID) > 36
The result is shown in the following format:
GUID*snapshot-401
For example, the result is shown as:
94EC7414-5BC5-5ABE-D1FB-66F4EBB7ECAD*snapshot-401
Resolution
To resolve this issue, remove the extra string from the LastRestoredCheckpointID
value of the affected VMs. To do this, run the following query to remove the extra string from all LastRestoredCheckpointIDs
instances:
update tbl_wlc_vminstance set lastrestoredcheckpointid = SUBSTRING(lastrestoredcheckpointid,1,36) where len(LastRestoredCheckpointID) > 36
Alternatively, you can update the string for a single VM by running the following query:
update tbl_wlc_vminstance set lastrestoredcheckpointid = SUBSTRING(lastrestoredcheckpointid,1,36) where len(LastRestoredCheckpointID) > 35 AND ComputerName = '<COMPUTERNAME>'
Note
In this query, <COMPUTERNAME> represents the actual name of the VM that you're trying to change.
Running these queries fixes the issue temporarily. However, the bad values will be re-created by SCVMM. To prevent this from occurring without manual intervention, you can add the following trigger to the tbl_wlc_vminstance
table so that it automatically removes the offending data each time a row is inserted or updated.
Important
You have to run the first query to wipe all bad values from the database first because this trigger affects only newly inserted or updated rows in the database.
CREATE TRIGGER dbo.tr_Remove_Broken_LastRestoredCheckpointID
ON dbo.tbl_wlc_vminstance
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
update tbl_WLC_VmInstance set LastRestoredCheckpointID =
SUBSTRING(LastRestoredCheckpointID,1,36) where len(LastRestoredCheckpointID) > 36
and VMInstanceId in (select VMInstanceId from inserted)
END
GO
More Information
For more information about VMWare VMs in VM clouds, see the following article:
Requirements for using VM Clouds
For more information about third-party extensions for Windows Azure Pack, see the following website:
Third-party information disclaimer
The third-party products that this article discusses are manufactured by companies that are independent of Microsoft. Microsoft makes no warranty, implied or otherwise, about the performance or reliability of these products.
Third-party contact disclaimer
Microsoft provides third-party contact information to help you find additional information about this topic. This contact information may change without notice. Microsoft does not guarantee the accuracy of third-party contact information.
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for