def test_from_db_obj_pre_1_4_format(self): ctxt = context.get_admin_context() dev = pci_device.PciDevice._from_db_object(ctxt, pci_device.PciDevice(), fake_db_dev_old) self.assertEqual('blah', dev.parent_addr) self.assertEqual({'phys_function': 'blah'}, dev.extra_info)
def test_dev_type_vdpa_1_6(self): ctxt = context.get_admin_context() fake_dev = copy.deepcopy(fake_db_dev) fake_dev['dev_type'] = fields.PciDeviceType.STANDARD dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_dev) dev.obj_make_compatible(dev.obj_to_primitive(), '1.6') self.assertEqual(dev.dev_type, fake_dev['dev_type'])
def setUp(self): super(PciDeviceTestCase, self).setUp() self.ctxt = context.get_admin_context() self.inst = instance.Instance() self.inst.uuid = 'fake-inst-uuid' self.inst.pci_devices = pci_device_obj.PciDeviceList() self.devobj = pci_device_obj.PciDevice._from_db_object( self.ctxt, pci_device_obj.PciDevice(), dev_dict)
def test_dev_type_vdpa_1_6_fails(self): ctxt = context.get_admin_context() fake_dev = copy.deepcopy(fake_db_dev) fake_dev['dev_type'] = fields.PciDeviceType.VDPA dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_dev) self.assertRaises(exception.ObjectActionError, dev.obj_to_primitive, '1.6')
def test_from_db_obj_pre_1_5_format(self): ctxt = context.get_admin_context() fake_dev_pre_1_5 = copy.deepcopy(fake_db_dev_old) fake_dev_pre_1_5['status'] = fields.PciDeviceStatus.UNAVAILABLE dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_dev_pre_1_5) self.assertRaises(exception.ObjectActionError, dev.obj_to_primitive, '1.4')
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_migrate_parent_addr(self, get_min_ver_mock): ctxt = context.get_admin_context() dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_db_dev_old) with mock.patch.object(db, 'pci_device_update', return_value=fake_db_dev_old) as update_mock: dev.save() update_mock.assert_called_once_with( ctxt, dev.compute_node_id, dev.address, {'extra_info': '{}', 'parent_addr': 'blah'})
def test_save_RHOS_6_0_format_no_numa(self): ctxt = context.get_admin_context kw = {'compute_node_id': 1, 'address': 'a', 'status': 'available', 'numa_node': 1} self.pci_device = pci_device.PciDevice(ctxt, **kw) self.pci_device.obj_reset_changes() self.mox.StubOutWithMock(db, 'pci_device_update') expected_updates = {'extra_info': '{}'} self.pci_device.save() self.assertRemotes()
def test_free_allocated_device(self): self._create_fake_instance() ctx = context.get_admin_context() devobj = pci_device.PciDevice._from_db_object(ctx, pci_device.PciDevice(), fake_db_dev) devobj.claim(self.inst) devobj.allocate(self.inst) self.assertEqual(len(self.inst.pci_devices), 1) devobj.free(self.inst) self.assertEqual(len(self.inst.pci_devices), 0) self.assertEqual(devobj.status, fields.PciDeviceStatus.AVAILABLE) self.assertIsNone(devobj.instance_uuid)
def test_from_db_obj_missing_uuid(self, mock_create_uuid): """Ensure a UUID is generated if it's not present.""" ctxt = context.get_admin_context() fake_dev_no_uuid = copy.deepcopy(fake_db_dev) fake_dev_no_uuid['uuid'] = None dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_dev_no_uuid) # UUID should have been populated self.assertIn('uuid', dev) self.assertIsNotNone(dev.uuid) self.assertEqual(1, mock_create_uuid.call_count)
def test_save_migrate_parent_addr_updated(self, get_min_ver_mock): ctxt = context.get_admin_context() dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_db_dev_old) # Note that the pci manager code will never update parent_addr alone, # but we want to make it future proof so we guard against it dev.parent_addr = 'doh!' with mock.patch.object(db, 'pci_device_update', return_value=fake_db_dev_old) as update_mock: dev.save() update_mock.assert_called_once_with( ctxt, dev.compute_node_id, dev.address, {'extra_info': '{}', 'parent_addr': 'doh!'})
def test_save_dont_migrate_parent_addr(self, get_min_ver_mock): ctxt = context.get_admin_context() dev = pci_device.PciDevice._from_db_object( ctxt, pci_device.PciDevice(), fake_db_dev_old) dev.extra_info['other'] = "blahtoo" with mock.patch.object(db, 'pci_device_update', return_value=fake_db_dev_old) as update_mock: dev.save() self.assertEqual("blah", update_mock.call_args[0][3]['parent_addr']) self.assertIn("phys_function", update_mock.call_args[0][3]['extra_info']) self.assertIn("other", update_mock.call_args[0][3]['extra_info'])
def test_save_RHOS_6_0_format_numa_field_set(self): ctxt = context.get_admin_context kw = {'compute_node_id': 1, 'address': 'a', 'status': 'available', 'numa_node': 1} self.pci_device = pci_device.PciDevice(ctxt, **kw) self.pci_device.obj_reset_changes() self.pci_device['extra_info'] = {'numa_node': 0} self.mox.StubOutWithMock(db, 'pci_device_update') expected_updates = {'extra_info': '{}'} db.pci_device_update(ctxt, 1, 'a', expected_updates).AndReturn(fake_db_dev_1) self.mox.ReplayAll() self.pci_device.save() self.assertEqual(self.pci_device.numa_node, 1) self.assertEqual(self.pci_device.extra_info, {}) self.assertRemotes()