Prepend '/dev/' to supplied dev names in the API
Make sure that all user input device names end up in the database with the '/dev/' prefix. This will make things more consistent and avoid issues when attempting to parse device names. This includes two main sources - block device mapping that can be passed as part of a request or as image metadata, and root device name, passed as image metadata. Closes-bug: #1337821 Change-Id: Ibda82f511be99f1a68f2f77c72601a1b006be7a0
This commit is contained in:
parent
00ac56a100
commit
28b37c1a70
|
@ -82,6 +82,8 @@ class BlockDeviceDict(dict):
|
|||
do_not_default = do_not_default or set()
|
||||
|
||||
self._validate(bdm_dict)
|
||||
if bdm_dict.get('device_name'):
|
||||
bdm_dict['device_name'] = prepend_dev(bdm_dict['device_name'])
|
||||
# NOTE (ndipanov): Never default db fields
|
||||
self.update(
|
||||
dict((field, None)
|
||||
|
|
|
@ -757,8 +757,9 @@ class API(base.Base):
|
|||
key_name)
|
||||
key_data = key_pair.public_key
|
||||
|
||||
root_device_name = block_device.properties_root_device_name(
|
||||
boot_meta.get('properties', {}))
|
||||
root_device_name = block_device.prepend_dev(
|
||||
block_device.properties_root_device_name(
|
||||
boot_meta.get('properties', {})))
|
||||
|
||||
system_metadata = flavors.save_flavor_info(
|
||||
dict(), instance_type)
|
||||
|
|
|
@ -4617,18 +4617,18 @@ class BlockDeviceMappingTestCase(test.TestCase):
|
|||
uuid2 = db.instance_create(self.ctxt, {})['uuid']
|
||||
|
||||
bmds_values = [{'instance_uuid': uuid1,
|
||||
'device_name': 'first'},
|
||||
'device_name': '/dev/vda'},
|
||||
{'instance_uuid': uuid2,
|
||||
'device_name': 'second'},
|
||||
'device_name': '/dev/vdb'},
|
||||
{'instance_uuid': uuid2,
|
||||
'device_name': 'third'}]
|
||||
'device_name': '/dev/vdc'}]
|
||||
|
||||
for bdm in bmds_values:
|
||||
self._create_bdm(bdm)
|
||||
|
||||
bmd = db.block_device_mapping_get_all_by_instance(self.ctxt, uuid1)
|
||||
self.assertEqual(len(bmd), 1)
|
||||
self.assertEqual(bmd[0]['device_name'], 'first')
|
||||
self.assertEqual(bmd[0]['device_name'], '/dev/vda')
|
||||
|
||||
bmd = db.block_device_mapping_get_all_by_instance(self.ctxt, uuid2)
|
||||
self.assertEqual(len(bmd), 2)
|
||||
|
@ -4644,27 +4644,27 @@ class BlockDeviceMappingTestCase(test.TestCase):
|
|||
vol_id1 = '69f5c254-1a5b-4fff-acf7-cb369904f58f'
|
||||
vol_id2 = '69f5c254-1a5b-4fff-acf7-cb369904f59f'
|
||||
|
||||
self._create_bdm({'device_name': 'fake1', 'volume_id': vol_id1})
|
||||
self._create_bdm({'device_name': 'fake2', 'volume_id': vol_id2})
|
||||
self._create_bdm({'device_name': '/dev/vda', 'volume_id': vol_id1})
|
||||
self._create_bdm({'device_name': '/dev/vdb', 'volume_id': vol_id2})
|
||||
|
||||
uuid = self.instance['uuid']
|
||||
db.block_device_mapping_destroy_by_instance_and_volume(self.ctxt, uuid,
|
||||
vol_id1)
|
||||
bdms = db.block_device_mapping_get_all_by_instance(self.ctxt, uuid)
|
||||
self.assertEqual(len(bdms), 1)
|
||||
self.assertEqual(bdms[0]['device_name'], 'fake2')
|
||||
self.assertEqual(bdms[0]['device_name'], '/dev/vdb')
|
||||
|
||||
def test_block_device_mapping_destroy_by_instance_and_device(self):
|
||||
self._create_bdm({'device_name': 'fake1'})
|
||||
self._create_bdm({'device_name': 'fake2'})
|
||||
self._create_bdm({'device_name': '/dev/vda'})
|
||||
self._create_bdm({'device_name': '/dev/vdb'})
|
||||
|
||||
uuid = self.instance['uuid']
|
||||
params = (self.ctxt, uuid, 'fake1')
|
||||
params = (self.ctxt, uuid, '/dev/vdb')
|
||||
db.block_device_mapping_destroy_by_instance_and_device(*params)
|
||||
|
||||
bdms = db.block_device_mapping_get_all_by_instance(self.ctxt, uuid)
|
||||
self.assertEqual(len(bdms), 1)
|
||||
self.assertEqual(bdms[0]['device_name'], 'fake2')
|
||||
self.assertEqual(bdms[0]['device_name'], '/dev/vda')
|
||||
|
||||
def test_block_device_mapping_get_by_volume_id(self):
|
||||
self._create_bdm({'volume_id': 'fake_id'})
|
||||
|
|
|
@ -307,6 +307,24 @@ class TestBlockDeviceDict(test.NoDBTestCase):
|
|||
self.assertNotIn('db_field1', dev_dict)
|
||||
self.assertFalse('db_field2'in dev_dict)
|
||||
|
||||
def test_init_prepend_dev_to_device_name(self):
|
||||
bdm = {'id': 3, 'instance_uuid': 'fake-instance',
|
||||
'device_name': 'vda',
|
||||
'source_type': 'volume',
|
||||
'destination_type': 'volume',
|
||||
'volume_id': 'fake-volume-id-1',
|
||||
'boot_index': 0}
|
||||
bdm_dict = block_device.BlockDeviceDict(bdm)
|
||||
self.assertEqual('/dev/vda', bdm_dict['device_name'])
|
||||
|
||||
bdm['device_name'] = '/dev/vdb'
|
||||
bdm_dict = block_device.BlockDeviceDict(bdm)
|
||||
self.assertEqual('/dev/vdb', bdm_dict['device_name'])
|
||||
|
||||
bdm['device_name'] = None
|
||||
bdm_dict = block_device.BlockDeviceDict(bdm)
|
||||
self.assertIsNone(bdm_dict['device_name'])
|
||||
|
||||
def test_validate(self):
|
||||
self.assertRaises(exception.InvalidBDMFormat,
|
||||
block_device.BlockDeviceDict,
|
||||
|
|
Loading…
Reference in New Issue