def test_get_devs_object(self): def _fake_obj_load_attr(foo, attrname): if attrname == 'pci_devices': self.load_attr_called = True foo.pci_devices = objects.PciDeviceList() self.stub_out('nova.objects.Instance.obj_load_attr', _fake_obj_load_attr) self.load_attr_called = False manager.get_instance_pci_devs(objects.Instance()) self.assertTrue(self.load_attr_called)
def test_get_devs_object(self): def _fake_obj_load_attr(foo, attrname): if attrname == 'pci_devices': self.load_attr_called = True foo.pci_devices = objects.PciDeviceList() self.stub_out( 'nova.objects.Instance.obj_load_attr', _fake_obj_load_attr) self.load_attr_called = False manager.get_instance_pci_devs(objects.Instance()) self.assertTrue(self.load_attr_called)
def _bind_port(self, port_id, zone, instance, pci_request_id): """Populate gluon binding:profile. Populate it with SR-IOV related information """ LOG.info('In _bind_port') LOG.info('binding port %s' % port_id) pci_profile = None if pci_request_id: pci_dev = pci_manager.get_instance_pci_devs( instance, pci_request_id).pop() devspec = pci_whitelist.get_pci_device_devspec(pci_dev) pci_profile = {'pci_vendor_info': "%s:%s" % (pci_dev.vendor_id, pci_dev.product_id), 'pci_slot': pci_dev.address, 'physical_network': devspec.get_tags().get('physical_network') } # These are used by Neutron extensions and could be used by other # things... flavor = instance.get_flavor() rxtx_factor = flavor.get('rxtx_factor') host = instance.get('host') self.client.bind(port_id, zone, instance.uuid, host, pci_profile=pci_profile, rxtx_factor=rxtx_factor)
def test_free_device(self): pci_requests_obj = self._create_pci_requests_object([{ 'count': 1, 'spec': [{ 'vendor_id': 'v' }] }]) self.tracker.claim_instance(mock.sentinel.context, pci_requests_obj, None) self.tracker.update_pci_for_instance(None, self.inst, sign=1) free_pci_device_ids = ([ dev.id for dev in self.tracker.pci_stats.get_free_devs() ]) self.assertEqual(2, len(free_pci_device_ids)) allocated_devs = manager.get_instance_pci_devs(self.inst) pci_device = allocated_devs[0] self.assertNotIn(pci_device.id, free_pci_device_ids) instance_uuid = self.inst['uuid'] self.assertIn(pci_device, self.tracker.allocations[instance_uuid]) self.tracker.free_device(pci_device, self.inst) free_pci_device_ids = ([ dev.id for dev in self.tracker.pci_stats.get_free_devs() ]) self.assertEqual(3, len(free_pci_device_ids)) self.assertIn(pci_device.id, free_pci_device_ids) self.assertIsNone(self.tracker.allocations.get(instance_uuid))
def _bind_port(self, port_id, zone, instance, pci_request_id): """Populate gluon binding:profile. Populate it with SR-IOV related information """ LOG.error('binding port %s' % port_id) pci_profile = None if pci_request_id: pci_dev = pci_manager.get_instance_pci_devs( instance, pci_request_id).pop() devspec = pci_whitelist.get_pci_device_devspec(pci_dev) pci_profile = { 'pci_vendor_info': "%s:%s" % (pci_dev.vendor_id, pci_dev.product_id), 'pci_slot': pci_dev.address, 'physical_network': devspec.get_tags().get('physical_network') } # These are used by Neutron extensions and could be used by other # things... flavor = instance.get_flavor() rxtx_factor = flavor.get('rxtx_factor') host = instance.get('host') self.client.bind(port_id, zone, instance.uuid, host, pci_profile=pci_profile, rxtx_factor=rxtx_factor)
def test_get_devs_object(self): def _fake_obj_load_attr(foo, attrname): if attrname == 'pci_devices': self.load_attr_called = True foo.pci_devices = objects.PciDeviceList() inst = fakes.stub_instance(id='1') ctxt = context.get_admin_context() self.mox.StubOutWithMock(db, 'instance_get') db.instance_get(ctxt, '1', columns_to_join=[]).AndReturn(inst) self.mox.ReplayAll() inst = objects.Instance.get_by_id(ctxt, '1', expected_attrs=[]) self.stubs.Set(objects.Instance, 'obj_load_attr', _fake_obj_load_attr) self.load_attr_called = False manager.get_instance_pci_devs(inst) self.assertEqual(self.load_attr_called, True)
def test_get_devs_object(self): def _fake_obj_load_attr(foo, attrname): if attrname == 'pci_devices': self.load_attr_called = True foo.pci_devices = objects.PciDeviceList() inst = fakes.stub_instance(id='1') ctxt = context.get_admin_context() self.mox.StubOutWithMock(db, 'instance_get') db.instance_get(ctxt, '1', columns_to_join=[] ).AndReturn(inst) self.mox.ReplayAll() inst = objects.Instance.get_by_id(ctxt, '1', expected_attrs=[]) self.stubs.Set(objects.Instance, 'obj_load_attr', _fake_obj_load_attr) self.load_attr_called = False manager.get_instance_pci_devs(inst) self.assertEqual(self.load_attr_called, True)
def test_get_devs_object(self, mock_instance_get): def _fake_obj_load_attr(foo, attrname): if attrname == 'pci_devices': self.load_attr_called = True foo.pci_devices = objects.PciDeviceList() inst = fakes.stub_instance(id='1') mock_instance_get.return_value = inst inst = objects.Instance.get_by_id(self.fake_context, '1', expected_attrs=[]) self.stub_out( 'nova.objects.Instance.obj_load_attr', _fake_obj_load_attr) self.load_attr_called = False manager.get_instance_pci_devs(inst) self.assertEqual(self.load_attr_called, True) mock_instance_get.assert_called_with(self.fake_context, '1', columns_to_join=[])
def test_get_devs_object(self, mock_instance_get): def _fake_obj_load_attr(foo, attrname): if attrname == 'pci_devices': self.load_attr_called = True foo.pci_devices = objects.PciDeviceList() inst = fakes.stub_instance(id='1') mock_instance_get.return_value = inst inst = objects.Instance.get_by_id(self.fake_context, '1', expected_attrs=[]) self.stub_out('nova.objects.Instance.obj_load_attr', _fake_obj_load_attr) self.load_attr_called = False manager.get_instance_pci_devs(inst) self.assertEqual(self.load_attr_called, True) mock_instance_get.assert_called_with(self.fake_context, '1', columns_to_join=[])
def test_free_device(self): pci_requests_obj = self._create_pci_requests_object( [{'count': 1, 'spec': [{'vendor_id': 'v'}]}]) self.tracker.claim_instance(mock.sentinel.context, pci_requests_obj, None) self.tracker.update_pci_for_instance(None, self.inst, sign=1) free_pci_device_ids = ( [dev.id for dev in self.tracker.pci_stats.get_free_devs()]) self.assertEqual(2, len(free_pci_device_ids)) allocated_devs = manager.get_instance_pci_devs(self.inst) pci_device = allocated_devs[0] self.assertNotIn(pci_device.id, free_pci_device_ids) instance_uuid = self.inst['uuid'] self.assertIn(pci_device, self.tracker.allocations[instance_uuid]) self.tracker.free_device(pci_device, self.inst) free_pci_device_ids = ( [dev.id for dev in self.tracker.pci_stats.get_free_devs()]) self.assertEqual(3, len(free_pci_device_ids)) self.assertIn(pci_device.id, free_pci_device_ids) self.assertIsNone(self.tracker.allocations.get(instance_uuid))
def test_get_devs_no_pci_devices(self): inst = objects.Instance(pci_devices=None) self.assertEqual([], manager.get_instance_pci_devs(inst))
def _test_finish_migration(self, power_on=True, resize_instance=True, throw_exception=None): self._stub_out_common() self.mox.StubOutWithMock(vm_utils, "import_all_migrated_disks") self.mox.StubOutWithMock(self.vmops, "_attach_mapped_block_devices") context = "context" migration = {} name_label = "dummy" instance = {"name": name_label, "uuid": "fake_uuid"} disk_info = "disk_info" network_info = "net_info" image_meta = {"id": "image_id"} block_device_info = "bdi" session = self.vmops._session self.vmops._ensure_instance_name_unique(name_label) self.vmops._ensure_enough_free_mem(instance) di_type = "di_type" vm_utils.determine_disk_image_type(image_meta).AndReturn(di_type) root_vdi = {"ref": "fake_ref"} ephemeral_vdi = {"ref": "fake_ref_e"} vdis = {"root": root_vdi, "ephemerals": {4: ephemeral_vdi}} vm_utils.import_all_migrated_disks(self.vmops._session, instance).AndReturn(vdis) kernel_file = "kernel" ramdisk_file = "ramdisk" vm_utils.create_kernel_and_ramdisk(context, session, instance, name_label).AndReturn((kernel_file, ramdisk_file)) vm_ref = "fake_vm_ref" self.vmops._create_vm_record(context, instance, name_label, di_type, kernel_file, ramdisk_file, image_meta).AndReturn(vm_ref) if resize_instance: self.vmops._resize_up_vdis(instance, vdis) self.vmops._attach_disks(instance, vm_ref, name_label, vdis, di_type, network_info, False, None, None) self.vmops._attach_mapped_block_devices(instance, block_device_info) pci_manager.get_instance_pci_devs(instance).AndReturn([]) self.vmops._inject_instance_metadata(instance, vm_ref) self.vmops._inject_auto_disk_config(instance, vm_ref) self.vmops._file_inject_vm_settings(instance, vm_ref, vdis, network_info) self.vmops.inject_network_info(instance, network_info, vm_ref) self.vmops._create_vifs(instance, vm_ref, network_info) self.vmops.firewall_driver.setup_basic_filtering(instance, network_info).AndRaise(NotImplementedError) self.vmops.firewall_driver.prepare_instance_filter(instance, network_info) if power_on: self.vmops._start(instance, vm_ref) self.vmops._wait_for_instance_to_start(instance, vm_ref) self.vmops.firewall_driver.apply_instance_filter(instance, network_info) last_call = self.vmops._update_instance_progress(context, instance, step=5, total_steps=5) if throw_exception: last_call.AndRaise(throw_exception) self.vmops._destroy(instance, vm_ref, network_info=network_info) vm_utils.destroy_kernel_ramdisk(self.vmops._session, instance, kernel_file, ramdisk_file) vm_utils.safe_destroy_vdis(self.vmops._session, ["fake_ref_e", "fake_ref"]) self.mox.ReplayAll() self.vmops.finish_migration(context, migration, instance, disk_info, network_info, image_meta, resize_instance, block_device_info, power_on)
def _test_spawn(self, name_label_param=None, block_device_info_param=None, rescue=False, include_root_vdi=True, throw_exception=None, attach_pci_dev=False): self._stub_out_common() instance = {"name": "dummy", "uuid": "fake_uuid"} name_label = name_label_param if name_label is None: name_label = "dummy" image_meta = {"id": "image_id"} context = "context" session = self.vmops._session injected_files = "fake_files" admin_password = "******" network_info = "net_info" steps = 10 if rescue: steps += 1 block_device_info = block_device_info_param if block_device_info and not block_device_info['root_device_name']: block_device_info = dict(block_device_info_param) block_device_info['root_device_name'] = \ self.vmops.default_root_dev di_type = "di_type" vm_utils.determine_disk_image_type(image_meta).AndReturn(di_type) step = 1 self.vmops._update_instance_progress(context, instance, step, steps) vdis = {"other": {"ref": "fake_ref_2", "osvol": True}} if include_root_vdi: vdis["root"] = {"ref": "fake_ref"} self.vmops._get_vdis_for_instance(context, instance, name_label, "image_id", di_type, block_device_info).AndReturn(vdis) self.vmops._resize_up_vdis(instance, vdis) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) kernel_file = "kernel" ramdisk_file = "ramdisk" vm_utils.create_kernel_and_ramdisk(context, session, instance, name_label).AndReturn((kernel_file, ramdisk_file)) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) vm_ref = "fake_vm_ref" self.vmops._ensure_instance_name_unique(name_label) self.vmops._ensure_enough_free_mem(instance) self.vmops._create_vm_record(context, instance, name_label, di_type, kernel_file, ramdisk_file, image_meta).AndReturn(vm_ref) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) self.vmops._attach_disks(instance, vm_ref, name_label, vdis, di_type, network_info, rescue, admin_password, injected_files) if attach_pci_dev: fake_dev = { 'created_at': None, 'updated_at': None, 'deleted_at': None, 'deleted': None, 'id': 1, 'compute_node_id': 1, 'address': '00:00.0', 'vendor_id': '1234', 'product_id': 'abcd', 'dev_type': 'type-PCI', 'status': 'available', 'dev_id': 'devid', 'label': 'label', 'instance_uuid': None, 'extra_info': '{}', } pci_manager.get_instance_pci_devs(instance).AndReturn([fake_dev]) vm_utils.set_other_config_pci(self.vmops._session, vm_ref, "0/0000:00:00.0") else: pci_manager.get_instance_pci_devs(instance).AndReturn([]) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) self.vmops._inject_instance_metadata(instance, vm_ref) self.vmops._inject_auto_disk_config(instance, vm_ref) self.vmops._inject_hostname(instance, vm_ref, rescue) self.vmops._file_inject_vm_settings(instance, vm_ref, vdis, network_info) self.vmops.inject_network_info(instance, network_info, vm_ref) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) self.vmops._create_vifs(instance, vm_ref, network_info) self.vmops.firewall_driver.setup_basic_filtering(instance, network_info).AndRaise(NotImplementedError) self.vmops.firewall_driver.prepare_instance_filter(instance, network_info) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) if rescue: self.vmops._attach_orig_disks(instance, vm_ref) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) self.vmops._start(instance, vm_ref) self.vmops._wait_for_instance_to_start(instance, vm_ref) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) self.vmops._configure_new_instance_with_agent(instance, vm_ref, injected_files, admin_password) self.vmops._remove_hostname(instance, vm_ref) step += 1 self.vmops._update_instance_progress(context, instance, step, steps) self.vmops.firewall_driver.apply_instance_filter(instance, network_info) step += 1 last_call = self.vmops._update_instance_progress(context, instance, step, steps) if throw_exception: last_call.AndRaise(throw_exception) self.vmops._destroy(instance, vm_ref, network_info=network_info) vm_utils.destroy_kernel_ramdisk(self.vmops._session, instance, kernel_file, ramdisk_file) vm_utils.safe_destroy_vdis(self.vmops._session, ["fake_ref"]) self.vmops._volumeops.safe_cleanup_from_vdis(["fake_ref_2"]) self.mox.ReplayAll() self.vmops.spawn(context, instance, image_meta, injected_files, admin_password, network_info, block_device_info_param, name_label_param, rescue)