From 31a4ffc49cd3f11adb9e61b2ff70d7e742515e51 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Thu, 6 Mar 2014 12:46:11 -0800 Subject: [PATCH] Fix BDM legacy usage with objects When we're doing an upgrade against Havana, our backleveled compute RPC version will cause us to run block_device.legacy_mapping(), which attempts to convert a BlockDeviceMapping object into an old- style dict. This trips over a common problem with objects where things expecting a list or a dict decide the object is a dict and try to iterate it as such. This makes the small tweak necessary and adds a test that verifies that it works. Change-Id: I98fe496720ad1c4fce44c0c7fea8bfa1c2721812 --- nova/block_device.py | 2 +- nova/tests/test_block_device.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/nova/block_device.py b/nova/block_device.py index 7a036cd23e..050393e1b8 100644 --- a/nova/block_device.py +++ b/nova/block_device.py @@ -86,7 +86,7 @@ class BlockDeviceDict(dict): self.update( dict((field, None) for field in self._fields - do_not_default)) - self.update(bdm_dict) + self.update(list(bdm_dict.iteritems())) def _validate(self, bdm_dict): """Basic data format validations.""" diff --git a/nova/tests/test_block_device.py b/nova/tests/test_block_device.py index 3ce1e9600d..c1b5f11926 100644 --- a/nova/tests/test_block_device.py +++ b/nova/tests/test_block_device.py @@ -423,6 +423,19 @@ class TestBlockDeviceDict(test.NoDBTestCase): for legacy, expected in zip(got_legacy, self.legacy_mapping): self.assertThat(expected, matchers.IsSubDictOf(legacy)) + def test_legacy_mapping_from_object_list(self): + bdm1 = block_device_obj.BlockDeviceMapping() + bdm1 = block_device_obj.BlockDeviceMapping._from_db_object( + None, bdm1, fake_block_device.FakeDbBlockDeviceDict( + self.new_mapping[0])) + bdm2 = block_device_obj.BlockDeviceMapping() + bdm2 = block_device_obj.BlockDeviceMapping._from_db_object( + None, bdm2, fake_block_device.FakeDbBlockDeviceDict( + self.new_mapping[1])) + bdmlist = block_device_obj.BlockDeviceMappingList() + bdmlist.objects = [bdm1, bdm2] + block_device.legacy_mapping(bdmlist) + def test_image_mapping(self): removed_fields = ['id', 'instance_uuid', 'connection_info', 'device_name', 'created_at', 'updated_at',