summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrzemyslaw Czesnowicz <przemyslaw.czesnowicz@intel.com>2015-04-07 16:31:05 +0100
committerNikola Dipanov <ndipanov@redhat.com>2015-04-21 10:50:35 +0100
commit7a609f153808f7cee1edbbb36accc292fa8df0d0 (patch)
tree5dcffa1733e4671b10efa749a516672c1b6657cb
parent880a356e40d327c0af4ce94b5a08fe0cd6fcab5d (diff)
downloadnova-7a609f153808f7cee1edbbb36accc292fa8df0d0.tar.gz
Add numa_node field to PciDevicePool
Without this field, PciDevicePool.from_dict will treat numa_node key in the dict as a tag, which in turn means that the scheduler client will drop it when converting stats to objects before reporting. Converting it back to dicts on the scheduler side thus will not have access to the numa_node information which would cause any requests that will look for the exact match between the device and instance NUMA nodes in the NUMATopologyFilter to fail. Closes-Bug: #1441169 (cherry picked from commit 7db1ebc66c59205f78829d1e9cd10dcc1201d798) Conflicts: nova/tests/unit/objects/test_objects.py Change-Id: I7381f909620e8e787178c0be9a362f8d3eb9ff7d
-rw-r--r--nova/objects/compute_node.py9
-rw-r--r--nova/objects/pci_device_pool.py15
-rw-r--r--nova/objects/service.py10
-rw-r--r--nova/tests/unit/api/openstack/compute/contrib/test_pci.py1
-rw-r--r--nova/tests/unit/fake_pci_device_pools.py2
-rw-r--r--nova/tests/unit/objects/test_objects.py16
-rw-r--r--nova/tests/unit/objects/test_pci_device_pool.py8
7 files changed, 45 insertions, 16 deletions
diff --git a/nova/objects/compute_node.py b/nova/objects/compute_node.py
index 3fa7cdbb03..e11ca577b7 100644
--- a/nova/objects/compute_node.py
+++ b/nova/objects/compute_node.py
@@ -37,7 +37,8 @@ class ComputeNode(base.NovaPersistentObject, base.NovaObject,
# Version 1.8: Added get_by_host_and_nodename()
# Version 1.9: Added pci_device_pools
# Version 1.10: Added get_first_node_by_host_for_old_compat()
- VERSION = '1.10'
+ # Version 1.11: PciDevicePoolList version 1.1
+ VERSION = '1.11'
fields = {
'id': fields.IntegerField(read_only=True),
@@ -72,7 +73,7 @@ class ComputeNode(base.NovaPersistentObject, base.NovaObject,
}
obj_relationships = {
- 'pci_device_pools': [('1.9', '1.0')],
+ 'pci_device_pools': [('1.9', '1.0'), ('1.11', '1.1')],
'supported_hv_specs': [('1.6', '1.0')],
}
@@ -283,7 +284,8 @@ class ComputeNodeList(base.ObjectListBase, base.NovaObject):
# Version 1.8 ComputeNode version 1.8 + add get_all_by_host()
# Version 1.9 ComputeNode version 1.9
# Version 1.10 ComputeNode version 1.10
- VERSION = '1.10'
+ # Version 1.11 ComputeNode version 1.11
+ VERSION = '1.11'
fields = {
'objects': fields.ListOfObjectsField('ComputeNode'),
}
@@ -300,6 +302,7 @@ class ComputeNodeList(base.ObjectListBase, base.NovaObject):
'1.8': '1.8',
'1.9': '1.9',
'1.10': '1.10',
+ '1.11': '1.11',
}
@base.remotable_classmethod
diff --git a/nova/objects/pci_device_pool.py b/nova/objects/pci_device_pool.py
index 96df7bbdba..0de57f86b1 100644
--- a/nova/objects/pci_device_pool.py
+++ b/nova/objects/pci_device_pool.py
@@ -21,19 +21,27 @@ import six
from nova import objects
from nova.objects import base
from nova.objects import fields
+from nova import utils
class PciDevicePool(base.NovaObject):
# Version 1.0: Initial version
- VERSION = '1.0'
+ # Version 1.1: Added numa_node field
+ VERSION = '1.1'
fields = {
'product_id': fields.StringField(),
'vendor_id': fields.StringField(),
+ 'numa_node': fields.IntegerField(nullable=True),
'tags': fields.DictOfNullableStringsField(),
'count': fields.IntegerField(),
}
+ def obj_make_compatible(self, primitive, target_version):
+ target_version = utils.convert_version_to_tuple(target_version)
+ if target_version < (1, 1) and 'numa_node' in primitive:
+ del primitive['numa_node']
+
# NOTE(pmurray): before this object existed the pci device pool data was
# stored as a dict. For backward compatibility we need to be able to read
# it in from a dict
@@ -43,6 +51,7 @@ class PciDevicePool(base.NovaObject):
pool = cls()
pool.vendor_id = pool_dict.pop("vendor_id")
pool.product_id = pool_dict.pop("product_id")
+ pool.numa_node = pool_dict.pop("numa_node", None)
pool.count = pool_dict.pop("count")
pool.tags = {}
pool.tags.update(pool_dict)
@@ -62,12 +71,14 @@ class PciDevicePool(base.NovaObject):
class PciDevicePoolList(base.ObjectListBase, base.NovaObject):
# Version 1.0: Initial version
# PciDevicePool <= 1.0
- VERSION = '1.0'
+ # Version 1.1: PciDevicePool version 1.1
+ VERSION = '1.1'
fields = {
'objects': fields.ListOfObjectsField('PciDevicePool'),
}
child_versions = {
'1.0': '1.0',
+ '1.1': '1.1',
}
diff --git a/nova/objects/service.py b/nova/objects/service.py
index 36eee38aef..ca11066320 100644
--- a/nova/objects/service.py
+++ b/nova/objects/service.py
@@ -41,7 +41,8 @@ class Service(base.NovaPersistentObject, base.NovaObject,
# Version 1.9: ComputeNode version 1.10
# Version 1.10: Changes behaviour of loading compute_node
# Version 1.11: Added get_by_host_and_binary
- VERSION = '1.11'
+ # Version 1.12: ComputeNode version 1.11
+ VERSION = '1.12'
fields = {
'id': fields.IntegerField(read_only=True),
@@ -57,7 +58,8 @@ class Service(base.NovaPersistentObject, base.NovaObject,
obj_relationships = {
'compute_node': [('1.1', '1.4'), ('1.3', '1.5'), ('1.5', '1.6'),
- ('1.7', '1.8'), ('1.8', '1.9'), ('1.9', '1.10')],
+ ('1.7', '1.8'), ('1.8', '1.9'), ('1.9', '1.10'),
+ ('1.12', '1.11')],
}
def obj_make_compatible(self, primitive, target_version):
@@ -189,7 +191,8 @@ class ServiceList(base.ObjectListBase, base.NovaObject):
# Version 1.7: Service version 1.9
# Version 1.8: Service version 1.10
# Version 1.9: Added get_by_binary() and Service version 1.11
- VERSION = '1.9'
+ # Version 1.10: Service version 1.12
+ VERSION = '1.10'
fields = {
'objects': fields.ListOfObjectsField('Service'),
@@ -206,6 +209,7 @@ class ServiceList(base.ObjectListBase, base.NovaObject):
'1.7': '1.9',
'1.8': '1.10',
'1.9': '1.11',
+ '1.10': '1.12',
}
@base.remotable_classmethod
diff --git a/nova/tests/unit/api/openstack/compute/contrib/test_pci.py b/nova/tests/unit/api/openstack/compute/contrib/test_pci.py
index 50eba5297b..899ca062a0 100644
--- a/nova/tests/unit/api/openstack/compute/contrib/test_pci.py
+++ b/nova/tests/unit/api/openstack/compute/contrib/test_pci.py
@@ -31,6 +31,7 @@ from nova.tests.unit.objects import test_pci_device
pci_stats = [{"count": 3,
"vendor_id": "8086",
"product_id": "1520",
+ "numa_node": 1,
"extra_info": {"phys_function": '[["0x0000", "0x04", '
'"0x00", "0x1"]]'}}]
fake_compute_node = objects.ComputeNode(
diff --git a/nova/tests/unit/fake_pci_device_pools.py b/nova/tests/unit/fake_pci_device_pools.py
index cf8edf34ab..0e5772488e 100644
--- a/nova/tests/unit/fake_pci_device_pools.py
+++ b/nova/tests/unit/fake_pci_device_pools.py
@@ -21,6 +21,7 @@ from nova.objects import pci_device_pool
fake_pool_dict = {
'product_id': 'fake-product',
'vendor_id': 'fake-vendor',
+ 'numa_node': 1,
't1': 'v1',
't2': 'v2',
'count': 2,
@@ -29,6 +30,7 @@ fake_pool_dict = {
fake_pool = pci_device_pool.PciDevicePool(count=5,
product_id='foo',
vendor_id='bar',
+ numa_node=0,
tags={'t1': 'v1', 't2': 'v2'})
fake_pool_primitive = fake_pool.obj_to_primitive()
diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py
index 02669a0d2b..f4a378e45f 100644
--- a/nova/tests/unit/objects/test_objects.py
+++ b/nova/tests/unit/objects/test_objects.py
@@ -1204,8 +1204,8 @@ object_data = {
'BlockDeviceMapping': '1.8-c87e9c7e5cfd6a402f32727aa74aca95',
'BlockDeviceMappingList': '1.9-0faaeebdca213010c791bc37a22546e3',
'CellMapping': '1.0-4b1616970814c3c819e10c7ef6b9c3d5',
- 'ComputeNode': '1.10-5f8cd6948ad98fcc0c39b79d49acc4b6',
- 'ComputeNodeList': '1.10-4ae1f844c247029fbcdb5fdccbe9e619',
+ 'ComputeNode': '1.11-5f8cd6948ad98fcc0c39b79d49acc4b6',
+ 'ComputeNodeList': '1.11-74155f002977bda12e843733c5fe3749',
'DNSDomain': '1.0-5bdc288d7c3b723ce86ede998fd5c9ba',
'DNSDomainList': '1.0-cfb3e7e82be661501c31099523154db4',
'EC2InstanceMapping': '1.0-e9c3257badcc3aa14089b0a62f163108',
@@ -1252,8 +1252,8 @@ object_data = {
'NetworkRequestList': '1.1-beeab521ac9450f1f5ef4eaa945a783c',
'PciDevice': '1.3-6d37f795ee934e7db75b5a6a1926def0',
'PciDeviceList': '1.1-38cbe2d3c23b9e46f7a74b486abcad85',
- 'PciDevicePool': '1.0-d6ed1abe611c9947345a44155abe6f11',
- 'PciDevicePoolList': '1.0-d31e08e0ff620a4df7cc2014b6c50da8',
+ 'PciDevicePool': '1.1-2f352e08e128ec5bc84bc3007936cc6d',
+ 'PciDevicePoolList': '1.1-beeab521ac9450f1f5ef4eaa945a783c',
'Quotas': '1.2-615ed622082c92d938119fd49e6d84ee',
'QuotasNoOp': '1.2-164c628906b170fd946a7672e85e4935',
'S3ImageMapping': '1.0-56d23342db8131d826797c7229dc4050',
@@ -1261,8 +1261,8 @@ object_data = {
'SecurityGroupList': '1.0-528e6448adfeeb78921ebeda499ab72f',
'SecurityGroupRule': '1.1-38290b6f9a35e416c2bcab5f18708967',
'SecurityGroupRuleList': '1.1-667fca3a9928f23d2d10e61962c55f3c',
- 'Service': '1.11-1a34a387914f90aacc33c8c43d45d0b3',
- 'ServiceList': '1.9-54656820acc49b3cc0eb57b2a684b84a',
+ 'Service': '1.12-1a34a387914f90aacc33c8c43d45d0b3',
+ 'ServiceList': '1.10-15338ee1affe868479d2deba306cfd33',
'Tag': '1.0-521693d0515aa031dff2b8ae3f86c8e0',
'TagList': '1.0-e89bf8c8055f1f1d654fb44f0abf1f53',
'TestSubclassedObject': '1.6-d0f7f126f87433003c4d2ced202d6c86',
@@ -1276,7 +1276,7 @@ object_data = {
object_relationships = {
'BlockDeviceMapping': {'Instance': '1.19'},
- 'ComputeNode': {'HVSpec': '1.0', 'PciDevicePoolList': '1.0'},
+ 'ComputeNode': {'HVSpec': '1.0', 'PciDevicePoolList': '1.1'},
'FixedIP': {'Instance': '1.19', 'Network': '1.2',
'VirtualInterface': '1.0',
'FloatingIPList': '1.7'},
@@ -1298,7 +1298,7 @@ object_relationships = {
'NUMACell': {'NUMAPagesTopology': '1.0'},
'NUMATopology': {'NUMACell': '1.2'},
'SecurityGroupRule': {'SecurityGroup': '1.1'},
- 'Service': {'ComputeNode': '1.10'},
+ 'Service': {'ComputeNode': '1.11'},
'TestSubclassedObject': {'MyOwnedObject': '1.0'},
'VirtCPUModel': {'VirtCPUFeature': '1.0', 'VirtCPUTopology': '1.0'},
}
diff --git a/nova/tests/unit/objects/test_pci_device_pool.py b/nova/tests/unit/objects/test_pci_device_pool.py
index a2df17ea6d..8ad5be8621 100644
--- a/nova/tests/unit/objects/test_pci_device_pool.py
+++ b/nova/tests/unit/objects/test_pci_device_pool.py
@@ -33,6 +33,7 @@ class _TestPciDevicePoolObject(object):
pool_obj = objects.PciDevicePool.from_dict(fake_pci.fake_pool_dict)
self.assertEqual(pool_obj.product_id, 'fake-product')
self.assertEqual(pool_obj.vendor_id, 'fake-vendor')
+ self.assertEqual(pool_obj.numa_node, 1)
self.assertEqual(pool_obj.tags, {'t1': 'v1', 't2': 'v2'})
self.assertEqual(pool_obj.count, 2)
@@ -61,6 +62,13 @@ class _TestPciDevicePoolObject(object):
pool_dict = pool_obj.to_dict()
self.assertEqual({'product_id': 'pid'}, pool_dict)
+ def test_obj_make_compatible(self):
+ pool_obj = objects.PciDevicePool(product_id='pid', numa_node=1)
+ primitive = pool_obj.obj_to_primitive()
+ self.assertIn('numa_node', primitive['nova_object.data'])
+ pool_obj.obj_make_compatible(primitive['nova_object.data'], '1.0')
+ self.assertNotIn('numa_node', primitive['nova_object.data'])
+
class TestPciDevicePoolObject(test_objects._LocalTest,
_TestPciDevicePoolObject):