object: update instance numa object to handle pagesize
Work-item: Enhance libvirt driver to report available large pages per NUMA node in the host state data Partial-Implement: blueprint virt-driver-large-pages Change-Id: I392bdc45aa3b6b169c1d1bfdada624a16c77c91c
This commit is contained in:
parent
2dc4f8937d
commit
e2bca67175
|
@ -21,18 +21,21 @@ from nova.virt import hardware
|
||||||
|
|
||||||
class InstanceNUMACell(base.NovaObject):
|
class InstanceNUMACell(base.NovaObject):
|
||||||
# Version 1.0: Initial version
|
# Version 1.0: Initial version
|
||||||
VERSION = '1.0'
|
# Version 1.1: Add pagesize field
|
||||||
|
VERSION = '1.1'
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': fields.IntegerField(read_only=True),
|
'id': fields.IntegerField(read_only=True),
|
||||||
'cpuset': fields.SetOfIntegersField(),
|
'cpuset': fields.SetOfIntegersField(),
|
||||||
'memory': fields.IntegerField(),
|
'memory': fields.IntegerField(),
|
||||||
|
'pagesize': fields.IntegerField(nullable=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class InstanceNUMATopology(base.NovaObject):
|
class InstanceNUMATopology(base.NovaObject):
|
||||||
# Version 1.0: Initial version
|
# Version 1.0: Initial version
|
||||||
VERSION = '1.0'
|
# Version 1.1: Takes into account pagesize
|
||||||
|
VERSION = '1.1'
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
# NOTE(danms): The 'id' field is no longer used and should be
|
# NOTE(danms): The 'id' field is no longer used and should be
|
||||||
|
@ -50,16 +53,24 @@ class InstanceNUMATopology(base.NovaObject):
|
||||||
if topology:
|
if topology:
|
||||||
cells = []
|
cells = []
|
||||||
for topocell in topology.cells:
|
for topocell in topology.cells:
|
||||||
|
pagesize = (topocell.pagesize
|
||||||
|
and topocell.pagesize.size_kb or None)
|
||||||
cell = InstanceNUMACell(id=topocell.id, cpuset=topocell.cpuset,
|
cell = InstanceNUMACell(id=topocell.id, cpuset=topocell.cpuset,
|
||||||
memory=topocell.memory)
|
memory=topocell.memory,
|
||||||
|
pagesize=pagesize)
|
||||||
cells.append(cell)
|
cells.append(cell)
|
||||||
return cls(cells=cells)
|
return cls(cells=cells)
|
||||||
|
|
||||||
def topology_from_obj(self):
|
def topology_from_obj(self):
|
||||||
cells = []
|
cells = []
|
||||||
for objcell in self.cells:
|
for objcell in self.cells:
|
||||||
cell = hardware.VirtNUMATopologyCellInstance(
|
pagesize = (
|
||||||
objcell.id, objcell.cpuset, objcell.memory)
|
objcell.pagesize and
|
||||||
|
hardware.VirtPageSize(objcell.pagesize) or None)
|
||||||
|
cell = hardware.VirtNUMATopologyCellInstance(objcell.id,
|
||||||
|
objcell.cpuset,
|
||||||
|
objcell.memory,
|
||||||
|
pagesize=pagesize)
|
||||||
cells.append(cell)
|
cells.append(cell)
|
||||||
return hardware.VirtNUMAInstanceTopology(cells=cells)
|
return hardware.VirtNUMAInstanceTopology(cells=cells)
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,10 @@ from nova.tests.objects import test_objects
|
||||||
from nova.virt import hardware
|
from nova.virt import hardware
|
||||||
|
|
||||||
fake_numa_topology = hardware.VirtNUMAInstanceTopology(
|
fake_numa_topology = hardware.VirtNUMAInstanceTopology(
|
||||||
cells=[hardware.VirtNUMATopologyCellInstance(0, set([1, 2]), 512),
|
cells=[hardware.VirtNUMATopologyCellInstance(
|
||||||
hardware.VirtNUMATopologyCellInstance(1, set([3, 4]), 512)])
|
0, set([1, 2]), 512, hardware.VirtPageSize(2048)),
|
||||||
|
hardware.VirtNUMATopologyCellInstance(
|
||||||
|
1, set([3, 4]), 512, hardware.VirtPageSize(2048))])
|
||||||
|
|
||||||
fake_db_topology = {
|
fake_db_topology = {
|
||||||
'created_at': None,
|
'created_at': None,
|
||||||
|
@ -55,6 +57,7 @@ class _TestInstanceNUMATopology(object):
|
||||||
self.assertIsInstance(obj_cell, objects.InstanceNUMACell)
|
self.assertIsInstance(obj_cell, objects.InstanceNUMACell)
|
||||||
self.assertEqual(topo_cell.cpuset, obj_cell.cpuset)
|
self.assertEqual(topo_cell.cpuset, obj_cell.cpuset)
|
||||||
self.assertEqual(topo_cell.memory, obj_cell.memory)
|
self.assertEqual(topo_cell.memory, obj_cell.memory)
|
||||||
|
self.assertEqual(topo_cell.pagesize.size_kb, obj_cell.pagesize)
|
||||||
|
|
||||||
@mock.patch('nova.db.instance_extra_get_by_instance_uuid')
|
@mock.patch('nova.db.instance_extra_get_by_instance_uuid')
|
||||||
def test_get_by_instance_uuid_missing(self, mock_get):
|
def test_get_by_instance_uuid_missing(self, mock_get):
|
||||||
|
|
|
@ -961,8 +961,8 @@ object_data = {
|
||||||
'InstanceGroupList': '1.6-c6b78f3c9d9080d33c08667e80589817',
|
'InstanceGroupList': '1.6-c6b78f3c9d9080d33c08667e80589817',
|
||||||
'InstanceInfoCache': '1.5-ef64b604498bfa505a8c93747a9d8b2f',
|
'InstanceInfoCache': '1.5-ef64b604498bfa505a8c93747a9d8b2f',
|
||||||
'InstanceList': '1.10-03dd7839cd11cff75c3661c9e4227900',
|
'InstanceList': '1.10-03dd7839cd11cff75c3661c9e4227900',
|
||||||
'InstanceNUMACell': '1.0-17e6ee0a24cb6651d1b084efa3027bda',
|
'InstanceNUMACell': '1.1-8d2a13c8360cc9ea1b68c9c6c4476857',
|
||||||
'InstanceNUMATopology': '1.0-86b95d263c4c68411d44c6741b8d2bb0',
|
'InstanceNUMATopology': '1.1-86b95d263c4c68411d44c6741b8d2bb0',
|
||||||
'InstancePCIRequest': '1.1-e082d174f4643e5756ba098c47c1510f',
|
'InstancePCIRequest': '1.1-e082d174f4643e5756ba098c47c1510f',
|
||||||
'InstancePCIRequests': '1.1-bc7c6684d8579ee49d6a3b8aef756918',
|
'InstancePCIRequests': '1.1-bc7c6684d8579ee49d6a3b8aef756918',
|
||||||
'KeyPair': '1.1-3410f51950d052d861c11946a6ae621a',
|
'KeyPair': '1.1-3410f51950d052d861c11946a6ae621a',
|
||||||
|
@ -1000,7 +1000,7 @@ object_relationships = {
|
||||||
'FloatingIP': {'FixedIP': '1.6'},
|
'FloatingIP': {'FixedIP': '1.6'},
|
||||||
'Instance': {'InstanceFault': '1.2',
|
'Instance': {'InstanceFault': '1.2',
|
||||||
'InstanceInfoCache': '1.5',
|
'InstanceInfoCache': '1.5',
|
||||||
'InstanceNUMATopology': '1.0',
|
'InstanceNUMATopology': '1.1',
|
||||||
'PciDeviceList': '1.1',
|
'PciDeviceList': '1.1',
|
||||||
'SecurityGroupList': '1.0',
|
'SecurityGroupList': '1.0',
|
||||||
'InstancePCIRequests': '1.1'},
|
'InstancePCIRequests': '1.1'},
|
||||||
|
|
|
@ -1042,7 +1042,9 @@ def instance_topology_from_instance(instance):
|
||||||
if dict_cells:
|
if dict_cells:
|
||||||
cells = [objects.InstanceNUMACell(id=cell['id'],
|
cells = [objects.InstanceNUMACell(id=cell['id'],
|
||||||
cpuset=set(cell['cpuset']),
|
cpuset=set(cell['cpuset']),
|
||||||
memory=cell['memory'])
|
memory=cell['memory'],
|
||||||
|
pagesize=cell.get(
|
||||||
|
'pagesize'))
|
||||||
for cell in dict_cells]
|
for cell in dict_cells]
|
||||||
instance_numa_topology = (
|
instance_numa_topology = (
|
||||||
objects.InstanceNUMATopology(cells=cells))
|
objects.InstanceNUMATopology(cells=cells))
|
||||||
|
|
Loading…
Reference in New Issue