Add a get_root_bdm utility function

Getting the root block device out of a list of block devices is a common
idiom and we use it in several places in our code base. This patch
factors it out in a handy utilty method and adds tests for it.

Change-Id: I4a2cb3c689fed9fbc0bc51ddba095e1269cacb2d
blueprint: clean-up-legacy-block-device-mapping
This commit is contained in:
Nikola Dipanov
2013-10-08 16:58:29 +02:00
parent 1ebc86f51b
commit c569c6ed7a
4 changed files with 27 additions and 13 deletions

View File

@@ -388,6 +388,13 @@ def new_format_is_ephemeral(bdm):
return False
def get_root_bdm(bdms):
try:
return (bdm for bdm in bdms if bdm.get('boot_index', -1) == 0).next()
except StopIteration:
return None
def mappings_prepend_dev(mappings):
"""Prepend '/dev/' to 'device' entry of swap/ephemeral virtual type."""
for m in mappings:

View File

@@ -1297,10 +1297,8 @@ class ComputeManager(manager.SchedulerDependentManager):
It also ensures that there is a root_device_name and is set to the
first block device in the boot sequence (boot_index=0).
"""
try:
root_bdm = (bdm for bdm in block_devices
if bdm['boot_index'] == 0).next()
except StopIteration:
root_bdm = block_device.get_root_bdm(block_devices)
if not root_bdm:
return
# Get the root_device_name from the root BDM or the instance

View File

@@ -129,6 +129,19 @@ class BlockDeviceTestCase(test.NoDBTestCase):
_assert_volume_in_mapping('sdg', False)
_assert_volume_in_mapping('sdh1', False)
def test_get_root_bdm(self):
root_bdm = {'device_name': 'vda', 'boot_index': 0}
bdms = [root_bdm,
{'device_name': 'vdb', 'boot_index': 1},
{'device_name': 'vdc', 'boot_index': -1},
{'device_name': 'vdd'}]
self.assertEqual(root_bdm, block_device.get_root_bdm(bdms))
self.assertEqual(root_bdm, block_device.get_root_bdm([bdms[0]]))
self.assertEqual(None, block_device.get_root_bdm(bdms[1:]))
self.assertEqual(None, block_device.get_root_bdm(bdms[2:]))
self.assertEqual(None, block_device.get_root_bdm(bdms[3:]))
self.assertEqual(None, block_device.get_root_bdm([]))
class TestBlockDeviceDict(test.NoDBTestCase):
def setUp(self):

View File

@@ -517,15 +517,11 @@ def get_disk_mapping(virt_type, instance,
return mapping
try:
root_bdm = (bdm for bdm in
driver.block_device_info_get_mapping(block_device_info)
if bdm.get('boot_index') == 0).next()
except StopIteration:
# NOTE (ndipanov): This happens when we boot from image as
# there is no driver representation of local targeted images
# and they will not be in block_device_info list.
root_bdm = None
# NOTE (ndipanov): root_bdm can be None when we boot from image
# as there is no driver represenation of local targeted images
# and they will not be in block_device_info list.
root_bdm = block_device.get_root_bdm(
driver.block_device_info_get_mapping(block_device_info))
root_device_name = block_device.strip_dev(
driver.block_device_info_get_root(block_device_info))