From 215f403ad3b7705a28075217b97a0f6f6e658204 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Mon, 21 Dec 2015 13:48:36 -0800 Subject: [PATCH] DriverBlockDevice must receive a BDM object, not a dict Commit 7a54543a81cbb8d20e6df29e7f4468a436dae212 made it such that a BlockDeviceMapping object has to be constructed with a request context in order to call the remotable save() method on it. We must be already passing BDM objects when constructing DriverBlockDevices otherwise calling self._bdm_obj.save() would fail with an OrphanedObjectError. So the only places that were still using bdm dicts were unit tests, and those worked because objects.BlockDeviceMapping.save() is being mocked out. This removes the false sense of ability to construct a DriverBlocKDevice without a BDM object and cleans up the unit tests to reflect that reality. Closes-Bug: #1524035 Change-Id: Ie745fc4d36ceb3e0aae1b14d5d56b2b83bbb192c --- nova/tests/unit/compute/test_compute.py | 6 +- nova/tests/unit/fake_block_device.py | 14 ++ nova/tests/unit/virt/libvirt/test_driver.py | 135 +++++++++++--------- nova/tests/unit/virt/test_block_device.py | 108 +++++++++++----- nova/tests/unit/virt/test_imagecache.py | 15 ++- nova/tests/unit/virt/test_virt_drivers.py | 24 ++-- nova/virt/block_device.py | 11 +- 7 files changed, 195 insertions(+), 118 deletions(-) diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index 6838989079c2..2caacece232c 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -534,8 +534,10 @@ class ComputeVolumeTestCase(BaseTestCase): 'volume_size': 55, 'delete_on_termination': False, })] + bdms = block_device_obj.block_device_make_list_from_dicts( + self.context, block_device_mapping) prepped_bdm = self.compute._prep_block_device( - self.context, self.instance_object, block_device_mapping) + self.context, self.instance_object, bdms) self.assertEqual(2, mock_save.call_count) volume_driver_bdm = prepped_bdm['block_device_mapping'][0] self.assertEqual(volume_driver_bdm['connection_info']['serial'], @@ -1146,6 +1148,8 @@ class ComputeVolumeTestCase(BaseTestCase): 'image_id': 1, 'device_name': '/dev/vdb', })] + bdms = block_device_obj.block_device_make_list_from_dicts( + self.context, bdms) self.assertRaises(exception.VolumeLimitExceeded, compute_manager.ComputeManager()._prep_block_device, self.context, instance, bdms) diff --git a/nova/tests/unit/fake_block_device.py b/nova/tests/unit/fake_block_device.py index 852e3a3a97c7..45682133ce67 100644 --- a/nova/tests/unit/fake_block_device.py +++ b/nova/tests/unit/fake_block_device.py @@ -18,6 +18,20 @@ import uuid from oslo_utils import timeutils from nova import block_device +from nova import objects + + +def fake_bdm_object(context, bdm_dict): + """Creates a BlockDeviceMapping object from the given bdm_dict + + :param context: nova request context + :param bdm_dict: dict of block device mapping info + :returns: nova.objects.block_device.BlockDeviceMapping + """ + # FakeDbBlockDeviceDict mutates the bdm_dict so make a copy of it. + return objects.BlockDeviceMapping._from_db_object( + context, objects.BlockDeviceMapping(), + FakeDbBlockDeviceDict(bdm_dict.copy())) class FakeDbBlockDeviceDict(block_device.BlockDeviceDict): diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 336941a48e52..d2ce13cd3282 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -63,6 +63,7 @@ from nova import db from nova import exception from nova.network import model as network_model from nova import objects +from nova.objects import block_device as block_device_obj from nova.objects import fields from nova.pci import manager as pci_manager from nova import test @@ -2424,16 +2425,21 @@ class LibvirtConnTestCase(test.NoDBTestCase): instance_ref = objects.Instance(**self.test_instance) image_meta = objects.ImageMeta.from_dict(self.test_image_meta) conn_info = {'driver_volume_type': 'fake'} - info = {'block_device_mapping': driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict( - {'id': 1, - 'source_type': 'volume', 'destination_type': 'volume', - 'device_name': '/dev/vdc'}), - fake_block_device.FakeDbBlockDeviceDict( - {'id': 2, - 'source_type': 'volume', 'destination_type': 'volume', - 'device_name': '/dev/vdd'}), - ])} + bdms = block_device_obj.block_device_make_list_from_dicts( + self.context, [ + fake_block_device.FakeDbBlockDeviceDict( + {'id': 1, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/vdc'}), + fake_block_device.FakeDbBlockDeviceDict( + {'id': 2, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/vdd'}), + ] + ) + info = {'block_device_mapping': driver_block_device.convert_volumes( + bdms + )} info['block_device_mapping'][0]['connection_info'] = conn_info info['block_device_mapping'][1]['connection_info'] = conn_info @@ -2462,20 +2468,25 @@ class LibvirtConnTestCase(test.NoDBTestCase): instance_ref = objects.Instance(**self.test_instance) image_meta = objects.ImageMeta.from_dict(self.test_image_meta) conn_info = {'driver_volume_type': 'fake'} - info = {'block_device_mapping': driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict( - {'id': 1, - 'source_type': 'volume', 'destination_type': 'volume', - 'boot_index': 0}), - fake_block_device.FakeDbBlockDeviceDict( - {'id': 2, - 'source_type': 'volume', 'destination_type': 'volume', - }), - fake_block_device.FakeDbBlockDeviceDict( - {'id': 3, - 'source_type': 'volume', 'destination_type': 'volume', - }), - ])} + bdms = block_device_obj.block_device_make_list_from_dicts( + self.context, [ + fake_block_device.FakeDbBlockDeviceDict( + {'id': 1, + 'source_type': 'volume', 'destination_type': 'volume', + 'boot_index': 0}), + fake_block_device.FakeDbBlockDeviceDict( + {'id': 2, + 'source_type': 'volume', 'destination_type': 'volume', + }), + fake_block_device.FakeDbBlockDeviceDict( + {'id': 3, + 'source_type': 'volume', 'destination_type': 'volume', + }), + ] + ) + info = {'block_device_mapping': driver_block_device.convert_volumes( + bdms + )} info['block_device_mapping'][0]['connection_info'] = conn_info info['block_device_mapping'][1]['connection_info'] = conn_info @@ -2558,17 +2569,20 @@ class LibvirtConnTestCase(test.NoDBTestCase): "properties": {"hw_scsi_model": "virtio-scsi"}}) instance_ref = objects.Instance(**self.test_instance) conn_info = {'driver_volume_type': 'fake'} + bdms = block_device_obj.block_device_make_list_from_dicts( + self.context, [ + fake_block_device.FakeDbBlockDeviceDict( + {'id': 1, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/sdc', 'disk_bus': 'scsi'}), + fake_block_device.FakeDbBlockDeviceDict( + {'id': 2, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/sdd', 'disk_bus': 'scsi'}), + ] + ) bd_info = { - 'block_device_mapping': driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict( - {'id': 1, - 'source_type': 'volume', 'destination_type': 'volume', - 'device_name': '/dev/sdc', 'disk_bus': 'scsi'}), - fake_block_device.FakeDbBlockDeviceDict( - {'id': 2, - 'source_type': 'volume', 'destination_type': 'volume', - 'device_name': '/dev/sdd', 'disk_bus': 'scsi'}), - ])} + 'block_device_mapping': driver_block_device.convert_volumes(bdms)} bd_info['block_device_mapping'][0]['connection_info'] = conn_info bd_info['block_device_mapping'][1]['connection_info'] = conn_info @@ -11659,18 +11673,19 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.stubs.Set(host.Host, 'get_domain', fake_get_domain) + bdm = objects.BlockDeviceMapping( + self.context, + **fake_block_device.FakeDbBlockDeviceDict( + {'id': 1, 'guest_format': None, + 'boot_index': 0, + 'source_type': 'volume', + 'destination_type': 'volume', + 'device_name': '/dev/vda', + 'disk_bus': 'virtio', + 'device_type': 'disk', + 'delete_on_termination': False})) block_device_info = {'block_device_mapping': - driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict( - {'id': 1, 'guest_format': None, - 'boot_index': 0, - 'source_type': 'volume', - 'destination_type': 'volume', - 'device_name': '/dev/vda', - 'disk_bus': 'virtio', - 'device_type': 'disk', - 'delete_on_termination': False}), - ])} + driver_block_device.convert_volumes([bdm])} block_device_info['block_device_mapping'][0]['connection_info'] = ( {'driver_volume_type': 'iscsi'}) with test.nested( @@ -11919,14 +11934,15 @@ class LibvirtConnTestCase(test.NoDBTestCase): image_meta = objects.ImageMeta.from_dict(self.test_image_meta) flavor = instance.get_flavor() conn_info = {'driver_volume_type': 'fake', 'data': {}} + bdm = objects.BlockDeviceMapping( + self.context, + **fake_block_device.FakeDbBlockDeviceDict({ + 'id': 1, + 'source_type': 'volume', + 'destination_type': 'volume', + 'device_name': '/dev/vdc'})) bdi = {'block_device_mapping': - driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict({ - 'id': 1, - 'source_type': 'volume', - 'destination_type': 'volume', - 'device_name': '/dev/vdc'}) - ])} + driver_block_device.convert_volumes([bdm])} bdm = bdi['block_device_mapping'][0] bdm['connection_info'] = conn_info disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type, @@ -12359,12 +12375,14 @@ class LibvirtConnTestCase(test.NoDBTestCase): image_meta = objects.ImageMeta.from_dict(self.test_image_meta) conn_info = {'driver_volume_type': 'fake'} - info = {'block_device_mapping': driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict( - {'id': 0, - 'source_type': 'volume', 'destination_type': 'volume', - 'device_name': '/dev/sda'}), - ])} + bdm = objects.BlockDeviceMapping( + self.context, + **fake_block_device.FakeDbBlockDeviceDict( + {'id': 0, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/sda'})) + info = {'block_device_mapping': driver_block_device.convert_volumes( + [bdm])} info['block_device_mapping'][0]['connection_info'] = conn_info disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type, @@ -14518,6 +14536,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase): 'destination_type': 'volume', 'volume_id': 'fake-volume-id-1', 'connection_info': '{"fake": "connection_info"}'}) + fake_bdm = objects.BlockDeviceMapping(self.c, **fake_bdm) mock_get_by_volume_id.return_value = fake_bdm self.drvr._volume_refresh_connection_info(self.c, self.inst, diff --git a/nova/tests/unit/virt/test_block_device.py b/nova/tests/unit/virt/test_block_device.py index f022a76244ad..6b28fd9217b0 100644 --- a/nova/tests/unit/virt/test_block_device.py +++ b/nova/tests/unit/virt/test_block_device.py @@ -19,8 +19,10 @@ import six from nova import block_device from nova import context from nova import exception +from nova import objects from nova.objects import fields from nova import test +from nova.tests.unit import fake_block_device from nova.tests.unit import fake_instance from nova.tests.unit import matchers from nova.virt import block_device as driver_block_device @@ -39,7 +41,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'blank': driver_block_device.DriverBlankBlockDevice } - swap_bdm = block_device.BlockDeviceDict( + swap_bdm_dict = block_device.BlockDeviceDict( {'id': 1, 'instance_uuid': 'fake-instance', 'device_name': '/dev/sdb1', 'source_type': 'blank', @@ -59,7 +61,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'device_name': '/dev/sdb1', 'swap_size': 2} - ephemeral_bdm = block_device.BlockDeviceDict( + ephemeral_bdm_dict = block_device.BlockDeviceDict( {'id': 2, 'instance_uuid': 'fake-instance', 'device_name': '/dev/sdc1', 'source_type': 'blank', @@ -84,7 +86,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'virtual_name': 'ephemeral0', 'num': 0} - volume_bdm = block_device.BlockDeviceDict( + volume_bdm_dict = block_device.BlockDeviceDict( {'id': 3, 'instance_uuid': 'fake-instance', 'device_name': '/dev/sda1', 'source_type': 'volume', @@ -112,7 +114,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'connection_info': {"fake": "connection_info"}, 'delete_on_termination': False} - snapshot_bdm = block_device.BlockDeviceDict( + snapshot_bdm_dict = block_device.BlockDeviceDict( {'id': 4, 'instance_uuid': 'fake-instance', 'device_name': '/dev/sda2', 'delete_on_termination': True, @@ -140,7 +142,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'connection_info': {"fake": "connection_info"}, 'delete_on_termination': True} - image_bdm = block_device.BlockDeviceDict( + image_bdm_dict = block_device.BlockDeviceDict( {'id': 5, 'instance_uuid': 'fake-instance', 'device_name': '/dev/sda2', 'delete_on_termination': True, @@ -168,7 +170,7 @@ class TestDriverBlockDevice(test.NoDBTestCase): 'connection_info': {"fake": "connection_info"}, 'delete_on_termination': True} - blank_bdm = block_device.BlockDeviceDict( + blank_bdm_dict = block_device.BlockDeviceDict( {'id': 6, 'instance_uuid': 'fake-instance', 'device_name': '/dev/sda2', 'delete_on_termination': True, @@ -202,11 +204,26 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.virt_driver = self.mox.CreateMock(driver.ComputeDriver) self.context = context.RequestContext('fake_user', 'fake_project') + # create bdm objects for testing + self.swap_bdm = fake_block_device.fake_bdm_object( + self.context, self.swap_bdm_dict) + self.ephemeral_bdm = fake_block_device.fake_bdm_object( + self.context, self.ephemeral_bdm_dict) + self.volume_bdm = fake_block_device.fake_bdm_object( + self.context, self.volume_bdm_dict) + self.snapshot_bdm = fake_block_device.fake_bdm_object( + self.context, self.snapshot_bdm_dict) + self.image_bdm = fake_block_device.fake_bdm_object( + self.context, self.image_bdm_dict) + self.blank_bdm = fake_block_device.fake_bdm_object( + self.context, self.blank_bdm_dict) def test_no_device_raises(self): for name, cls in self.driver_classes.items(): + bdm = fake_block_device.fake_bdm_object( + self.context, {'no_device': True}) self.assertRaises(driver_block_device._NotTransformable, - cls, {'no_device': True}) + cls, bdm) def _test_driver_device(self, name): db_bdm = getattr(self, "%s_bdm" % name) @@ -263,15 +280,17 @@ class TestDriverBlockDevice(test.NoDBTestCase): def _test_driver_default_size(self, name): size = 'swap_size' if name == 'swap' else 'size' - no_size_bdm = getattr(self, "%s_bdm" % name).copy() + no_size_bdm = getattr(self, "%s_bdm_dict" % name).copy() no_size_bdm['volume_size'] = None - driver_bdm = self.driver_classes[name](no_size_bdm) + driver_bdm = self.driver_classes[name]( + fake_block_device.fake_bdm_object(self.context, no_size_bdm)) self.assertEqual(driver_bdm[size], 0) del no_size_bdm['volume_size'] - driver_bdm = self.driver_classes[name](no_size_bdm) + driver_bdm = self.driver_classes[name]( + fake_block_device.fake_bdm_object(self.context, no_size_bdm)) self.assertEqual(driver_bdm[size], 0) def test_driver_swap_block_device(self): @@ -318,10 +337,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): def test_driver_image_block_device_destination_local(self): self._test_driver_device('image') - bdm = self.image_bdm.copy() + bdm = self.image_bdm_dict.copy() bdm['destination_type'] = 'local' self.assertRaises(driver_block_device._InvalidType, - self.driver_classes['image'], bdm) + self.driver_classes['image'], + fake_block_device.fake_bdm_object(self.context, bdm)) def test_driver_blank_block_device(self): self._test_driver_device('blank') @@ -615,9 +635,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): matchers.DictMatches(expected_conn_info)) def test_snapshot_attach_no_volume(self): - no_volume_snapshot = self.snapshot_bdm.copy() + no_volume_snapshot = self.snapshot_bdm_dict.copy() no_volume_snapshot['volume_id'] = None - test_bdm = self.driver_classes['snapshot'](no_volume_snapshot) + test_bdm = self.driver_classes['snapshot']( + fake_block_device.fake_bdm_object( + self.context, no_volume_snapshot)) snapshot = {'id': 'fake-volume-id-1', 'attach_status': 'detached'} @@ -643,9 +665,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): # Tests that the volume created from the snapshot has the same AZ as # the instance. self.flags(cross_az_attach=False, group='cinder') - no_volume_snapshot = self.snapshot_bdm.copy() + no_volume_snapshot = self.snapshot_bdm_dict.copy() no_volume_snapshot['volume_id'] = None - test_bdm = self.driver_classes['snapshot'](no_volume_snapshot) + test_bdm = self.driver_classes['snapshot']( + fake_block_device.fake_bdm_object( + self.context, no_volume_snapshot)) snapshot = {'id': 'fake-volume-id-1', 'attach_status': 'detached'} @@ -669,9 +693,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual('fake-volume-id-2', test_bdm.volume_id) def test_snapshot_attach_fail_volume(self): - fail_volume_snapshot = self.snapshot_bdm.copy() + fail_volume_snapshot = self.snapshot_bdm_dict.copy() fail_volume_snapshot['volume_id'] = None - test_bdm = self.driver_classes['snapshot'](fail_volume_snapshot) + test_bdm = self.driver_classes['snapshot']( + fake_block_device.fake_bdm_object( + self.context, fail_volume_snapshot)) snapshot = {'id': 'fake-volume-id-1', 'attach_status': 'detached'} @@ -728,9 +754,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual(test_bdm.volume_id, 'fake-volume-id-2') def test_image_attach_no_volume(self): - no_volume_image = self.image_bdm.copy() + no_volume_image = self.image_bdm_dict.copy() no_volume_image['volume_id'] = None - test_bdm = self.driver_classes['image'](no_volume_image) + test_bdm = self.driver_classes['image']( + fake_block_device.fake_bdm_object( + self.context, no_volume_image)) image = {'id': 'fake-image-id-1'} volume = {'id': 'fake-volume-id-2', @@ -753,9 +781,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): # Tests that the volume created from the image has the same AZ as the # instance. self.flags(cross_az_attach=False, group='cinder') - no_volume_image = self.image_bdm.copy() + no_volume_image = self.image_bdm_dict.copy() no_volume_image['volume_id'] = None - test_bdm = self.driver_classes['image'](no_volume_image) + test_bdm = self.driver_classes['image']( + fake_block_device.fake_bdm_object( + self.context, no_volume_image)) image = {'id': 'fake-image-id-1'} volume = {'id': 'fake-volume-id-2', @@ -776,9 +806,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual('fake-volume-id-2', test_bdm.volume_id) def test_image_attach_fail_volume(self): - fail_volume_image = self.image_bdm.copy() + fail_volume_image = self.image_bdm_dict.copy() fail_volume_image['volume_id'] = None - test_bdm = self.driver_classes['image'](fail_volume_image) + test_bdm = self.driver_classes['image']( + fake_block_device.fake_bdm_object( + self.context, fail_volume_image)) image = {'id': 'fake-image-id-1'} volume = {'id': 'fake-volume-id-2', @@ -831,9 +863,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual(test_bdm.volume_id, 'fake-volume-id-2') def test_blank_attach_fail_volume(self): - no_blank_volume = self.blank_bdm.copy() + no_blank_volume = self.blank_bdm_dict.copy() no_blank_volume['volume_id'] = None - test_bdm = self.driver_classes['blank'](no_blank_volume) + test_bdm = self.driver_classes['blank']( + fake_block_device.fake_bdm_object( + self.context, no_blank_volume)) instance = fake_instance.fake_instance_obj(mock.sentinel.ctx, **{'uuid': 'fake-uuid'}) volume = {'id': 'fake-volume-id-2', @@ -863,9 +897,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.context, volume['id']) def test_blank_attach_volume(self): - no_blank_volume = self.blank_bdm.copy() + no_blank_volume = self.blank_bdm_dict.copy() no_blank_volume['volume_id'] = None - test_bdm = self.driver_classes['blank'](no_blank_volume) + test_bdm = self.driver_classes['blank']( + fake_block_device.fake_bdm_object( + self.context, no_blank_volume)) instance = fake_instance.fake_instance_obj(mock.sentinel.ctx, **{'uuid': 'fake-uuid'}) volume_class = self.driver_classes['volume'] @@ -892,9 +928,11 @@ class TestDriverBlockDevice(test.NoDBTestCase): # Tests that the blank volume created is in the same availability zone # as the instance. self.flags(cross_az_attach=False, group='cinder') - no_blank_volume = self.blank_bdm.copy() + no_blank_volume = self.blank_bdm_dict.copy() no_blank_volume['volume_id'] = None - test_bdm = self.driver_classes['blank'](no_blank_volume) + test_bdm = self.driver_classes['blank']( + fake_block_device.fake_bdm_object( + self.context, no_blank_volume)) updates = {'uuid': 'fake-uuid', 'availability_zone': 'test-az'} instance = fake_instance.fake_instance_obj(mock.sentinel.ctx, **updates) @@ -918,9 +956,10 @@ class TestDriverBlockDevice(test.NoDBTestCase): self.assertEqual('fake-volume-id-2', test_bdm.volume_id) def test_convert_block_devices(self): + bdms = objects.BlockDeviceMappingList( + objects=[self.volume_bdm, self.ephemeral_bdm]) converted = driver_block_device._convert_block_devices( - self.driver_classes['volume'], - [self.volume_bdm, self.ephemeral_bdm]) + self.driver_classes['volume'], bdms) self.assertEqual(converted, [self.volume_driver_bdm]) def test_convert_all_volumes(self): @@ -980,9 +1019,10 @@ class TestDriverBlockDevice(test.NoDBTestCase): for bdm in (self.image_bdm, self.volume_bdm, self.swap_bdm, self.ephemeral_bdm, self.snapshot_bdm): self.assertTrue(driver_block_device.is_implemented(bdm)) - local_image = self.image_bdm.copy() + local_image = self.image_bdm_dict.copy() local_image['destination_type'] = 'local' - self.assertFalse(driver_block_device.is_implemented(local_image)) + self.assertFalse(driver_block_device.is_implemented( + fake_block_device.fake_bdm_object(self.context, local_image))) def test_is_block_device_mapping(self): test_swap = self.driver_classes['swap'](self.swap_bdm) diff --git a/nova/tests/unit/virt/test_imagecache.py b/nova/tests/unit/virt/test_imagecache.py index 09814b3b7b9a..140fe90242e3 100644 --- a/nova/tests/unit/virt/test_imagecache.py +++ b/nova/tests/unit/virt/test_imagecache.py @@ -18,6 +18,7 @@ from nova import block_device from nova.compute import vm_states from nova import context from nova import objects +from nova.objects import block_device as block_device_obj from nova import test from nova.tests.unit import fake_instance from nova.virt import imagecache @@ -101,12 +102,16 @@ class ImageCacheManagerTests(test.NoDBTestCase): 'get_by_instance_uuid') ctxt = context.get_admin_context() + swap_bdm_256_list = block_device_obj.block_device_make_list_from_dicts( + ctxt, swap_bdm_256) + swap_bdm_128_list = block_device_obj.block_device_make_list_from_dicts( + ctxt, swap_bdm_128) objects.block_device.BlockDeviceMappingList.get_by_instance_uuid( - ctxt, '123').AndReturn(swap_bdm_256) + ctxt, '123').AndReturn(swap_bdm_256_list) objects.block_device.BlockDeviceMappingList.get_by_instance_uuid( - ctxt, '456').AndReturn(swap_bdm_128) + ctxt, '456').AndReturn(swap_bdm_128_list) objects.block_device.BlockDeviceMappingList.get_by_instance_uuid( - ctxt, '789').AndReturn(swap_bdm_128) + ctxt, '789').AndReturn(swap_bdm_128_list) self.mox.ReplayAll() @@ -154,8 +159,10 @@ class ImageCacheManagerTests(test.NoDBTestCase): 'get_by_instance_uuid') ctxt = context.get_admin_context() + bdms = block_device_obj.block_device_make_list_from_dicts( + ctxt, swap_bdm_256) objects.block_device.BlockDeviceMappingList.get_by_instance_uuid( - ctxt, '123').AndReturn(swap_bdm_256) + ctxt, '123').AndReturn(bdms) self.mox.ReplayAll() running = image_cache_manager._list_running_instances(ctxt, diff --git a/nova/tests/unit/virt/test_virt_drivers.py b/nova/tests/unit/virt/test_virt_drivers.py index 36fac3ec1cd7..0f2d5e1c288d 100644 --- a/nova/tests/unit/virt/test_virt_drivers.py +++ b/nova/tests/unit/virt/test_virt_drivers.py @@ -526,17 +526,19 @@ class _VirtDriverTestCase(_FakeDriverBackendTestCase): 'swap': None, 'ephemerals': [], 'block_device_mapping': driver_block_device.convert_volumes([ - fake_block_device.FakeDbBlockDeviceDict( - {'id': 1, 'instance_uuid': instance_ref['uuid'], - 'device_name': '/dev/sda', - 'source_type': 'volume', - 'destination_type': 'volume', - 'delete_on_termination': False, - 'snapshot_id': None, - 'volume_id': 'abcdedf', - 'volume_size': None, - 'no_device': None - }), + objects.BlockDeviceMapping( + self.ctxt, + **fake_block_device.FakeDbBlockDeviceDict( + {'id': 1, 'instance_uuid': instance_ref['uuid'], + 'device_name': '/dev/sda', + 'source_type': 'volume', + 'destination_type': 'volume', + 'delete_on_termination': False, + 'snapshot_id': None, + 'volume_id': 'abcdedf', + 'volume_size': None, + 'no_device': None + })), ]) } bdm['block_device_mapping'][0]['connection_info'] = ( diff --git a/nova/virt/block_device.py b/nova/virt/block_device.py index b8be4b2158d1..0527cf5ae2c7 100644 --- a/nova/virt/block_device.py +++ b/nova/virt/block_device.py @@ -27,8 +27,6 @@ from nova import exception from nova.i18n import _LE from nova.i18n import _LI from nova.i18n import _LW -from nova import objects -from nova.objects import base as obj_base from nova.volume import encryptors CONF = cfg.CONF @@ -121,14 +119,7 @@ class DriverBlockDevice(dict): 'device_type': None} def __init__(self, bdm): - # TODO(ndipanov): Remove this check when we have all the rpc methods - # use objects for block devices. - if isinstance(bdm, obj_base.NovaObject): - self.__dict__['_bdm_obj'] = bdm - else: - self.__dict__['_bdm_obj'] = objects.BlockDeviceMapping() - self._bdm_obj.update(block_device.BlockDeviceDict(bdm)) - self._bdm_obj.obj_reset_changes() + self.__dict__['_bdm_obj'] = bdm if self._bdm_obj.no_device: raise _NotTransformable()