snapshot: Add device_name to the snapshot bdms
33e3d4c6b9e0b11500fe47d861110be1c1981572 drops device names - at the time of writing, the idea was that Nova should collect all the block device information and decide on device names with the help of the hypervisor. It turns out that as well meaning as that change was - it also removed the ability to do some of the things that the EC2 API needs device names for (see the linked bug for a more detailed explanation). An example is overriding some of the attributes of a block device entry in the image. The only "indexable" property of a block device from EC2 POV is device name so we need to put it back even though they may be overriden by the virt layer upon a successful intance boot. Change-Id: Ib1ba130042aabbbe7bb8d60fc212c66e446c1d73 Related-bug: #1370177 Related-bug: #1370250
This commit is contained in:
parent
a8b5028bbd
commit
0e367d2248
@ -241,7 +241,7 @@ class BlockDeviceDict(dict):
|
||||
return legacy_block_device
|
||||
|
||||
def get_image_mapping(self):
|
||||
drop_fields = (set(['connection_info', 'device_name']) |
|
||||
drop_fields = (set(['connection_info']) |
|
||||
self._db_only_fields)
|
||||
mapping_dict = dict(self)
|
||||
for fld in drop_fields:
|
||||
@ -292,7 +292,8 @@ def snapshot_from_bdm(snapshot_id, template):
|
||||
"""Create a basic volume snapshot BDM from a given template bdm."""
|
||||
|
||||
copy_from_template = ('disk_bus', 'device_type', 'boot_index',
|
||||
'delete_on_termination', 'volume_size')
|
||||
'delete_on_termination', 'volume_size',
|
||||
'device_name')
|
||||
snapshot_dict = {'source_type': 'snapshot',
|
||||
'destination_type': 'volume',
|
||||
'snapshot_id': snapshot_id}
|
||||
|
@ -1012,8 +1012,8 @@ class ServerActionsControllerTestV21(test.TestCase):
|
||||
self.assertEqual(bdms[0]['source_type'], 'snapshot')
|
||||
self.assertEqual(bdms[0]['destination_type'], 'volume')
|
||||
self.assertEqual(bdms[0]['snapshot_id'], snapshot['id'])
|
||||
for fld in ('connection_info', 'id',
|
||||
'instance_uuid', 'device_name'):
|
||||
self.assertEqual('/dev/vda', bdms[0]['device_name'])
|
||||
for fld in ('connection_info', 'id', 'instance_uuid'):
|
||||
self.assertNotIn(fld, bdms[0])
|
||||
for k in extra_properties.keys():
|
||||
self.assertEqual(properties[k], extra_properties[k])
|
||||
|
@ -1991,6 +1991,7 @@ class _ComputeAPIUnitTestMixIn(object):
|
||||
'image_id': None, 'volume_id': None, 'disk_bus': None,
|
||||
'volume_size': None, 'source_type': 'snapshot',
|
||||
'device_type': None, 'snapshot_id': '1-snapshot',
|
||||
'device_name': '/dev/vda',
|
||||
'destination_type': 'volume', 'delete_on_termination': False})
|
||||
|
||||
# All the db_only fields and the volume ones are removed
|
||||
|
@ -646,8 +646,7 @@ class TestBlockDeviceDict(test.NoDBTestCase):
|
||||
|
||||
def test_image_mapping(self):
|
||||
removed_fields = ['id', 'instance_uuid', 'connection_info',
|
||||
'device_name', 'created_at', 'updated_at',
|
||||
'deleted_at', 'deleted']
|
||||
'created_at', 'updated_at', 'deleted_at', 'deleted']
|
||||
for bdm in self.new_mapping:
|
||||
mapping_bdm = fake_block_device.FakeDbBlockDeviceDict(
|
||||
bdm).get_image_mapping()
|
||||
@ -662,6 +661,7 @@ class TestBlockDeviceDict(test.NoDBTestCase):
|
||||
self.assertEqual(template.volume_size, snapshot['volume_size'])
|
||||
self.assertEqual(template.delete_on_termination,
|
||||
snapshot['delete_on_termination'])
|
||||
self.assertEqual(template.device_name, snapshot['device_name'])
|
||||
for key in ['disk_bus', 'device_type', 'boot_index']:
|
||||
self.assertEqual(snapshot[key], template[key])
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user