objects: update the old location parent_addr only if it has value

Do not update extra_update['phys_function'] in case parent_addr
field is None. Updating it leads to an exception as extra_update
is a dictionary of non-nullable fields.

Partially implements blueprint sriov-physical-function-passthrough

Change-Id: I8b091432f76af117d0f8d303d8b6d53ad2ca8ba3
This commit is contained in:
Vladik Romanovsky 2016-01-12 13:42:56 -05:00
parent 6248dd0ae5
commit 365bd8619f
2 changed files with 12 additions and 1 deletions

View File

@ -218,7 +218,7 @@ class PciDevice(base.NovaPersistentObject, base.NovaObject):
# NOTE(ndipanov): If we are not migrating data yet, make sure
# that any changes to parent_addr are also in the old location
# in extra_info
if 'parent_addr' in updates:
if 'parent_addr' in updates and updates['parent_addr']:
extra_update = updates.get('extra_info', {})
if not extra_update and self.obj_attr_is_set('extra_info'):
extra_update = self.extra_info

View File

@ -180,6 +180,17 @@ class _TestPciDeviceObject(object):
self.assertEqual('blah', dev.parent_addr)
self.assertEqual({'phys_function': 'blah'}, dev.extra_info)
def test_save_empty_parent_addr(self):
ctxt = context.get_admin_context()
dev = pci_device.PciDevice._from_db_object(
ctxt, pci_device.PciDevice(), fake_db_dev)
dev.parent_addr = None
with mock.patch.object(db, 'pci_device_update',
return_value=fake_db_dev):
dev.save()
self.assertIsNone(dev.parent_addr)
self.assertEqual({}, dev.extra_info)
def test_save(self):
ctxt = context.get_admin_context()
self._create_fake_pci_device(ctxt=ctxt)