Merge "DRYing up volume_in_mapping code."
This commit is contained in:
commit
d7ad6c1471
@ -17,8 +17,11 @@
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from nova.openstack.common import log as logging
|
||||||
from nova.virt import driver
|
from nova.virt import driver
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEFAULT_ROOT_DEV_NAME = '/dev/sda1'
|
DEFAULT_ROOT_DEV_NAME = '/dev/sda1'
|
||||||
_DEFAULT_MAPPINGS = {'ami': 'sda1',
|
_DEFAULT_MAPPINGS = {'ami': 'sda1',
|
||||||
'ephemeral0': 'sda2',
|
'ephemeral0': 'sda2',
|
||||||
@ -144,3 +147,25 @@ def match_device(device):
|
|||||||
if not match:
|
if not match:
|
||||||
return None
|
return None
|
||||||
return match.groups()
|
return match.groups()
|
||||||
|
|
||||||
|
|
||||||
|
def volume_in_mapping(mount_device, block_device_info, strip=strip_dev):
|
||||||
|
# FIXME(sirp): xen uses strip_prefix to be mountpoint agnostic. There is
|
||||||
|
# probably a better way to handle this so that strip_dev can be used
|
||||||
|
# exclusively.
|
||||||
|
block_device_list = [strip(vol['mount_device'])
|
||||||
|
for vol in
|
||||||
|
driver.block_device_info_get_mapping(
|
||||||
|
block_device_info)]
|
||||||
|
|
||||||
|
swap = driver.block_device_info_get_swap(block_device_info)
|
||||||
|
if driver.swap_is_usable(swap):
|
||||||
|
block_device_list.append(strip(swap['device_name']))
|
||||||
|
|
||||||
|
block_device_list += [strip(ephemeral['device_name'])
|
||||||
|
for ephemeral in
|
||||||
|
driver.block_device_info_get_ephemerals(
|
||||||
|
block_device_info)]
|
||||||
|
|
||||||
|
LOG.debug(_("block_device_list %s"), block_device_list)
|
||||||
|
return strip(mount_device) in block_device_list
|
||||||
|
@ -91,3 +91,38 @@ class BlockDeviceTestCase(test.TestCase):
|
|||||||
self.assertEqual(block_device.strip_prefix('a'), 'a')
|
self.assertEqual(block_device.strip_prefix('a'), 'a')
|
||||||
self.assertEqual(block_device.strip_prefix('xvda'), 'a')
|
self.assertEqual(block_device.strip_prefix('xvda'), 'a')
|
||||||
self.assertEqual(block_device.strip_prefix('vda'), 'a')
|
self.assertEqual(block_device.strip_prefix('vda'), 'a')
|
||||||
|
|
||||||
|
def test_volume_in_mapping(self):
|
||||||
|
swap = {'device_name': '/dev/sdb',
|
||||||
|
'swap_size': 1}
|
||||||
|
ephemerals = [{'num': 0,
|
||||||
|
'virtual_name': 'ephemeral0',
|
||||||
|
'device_name': '/dev/sdc1',
|
||||||
|
'size': 1},
|
||||||
|
{'num': 2,
|
||||||
|
'virtual_name': 'ephemeral2',
|
||||||
|
'device_name': '/dev/sdd',
|
||||||
|
'size': 1}]
|
||||||
|
block_device_mapping = [{'mount_device': '/dev/sde',
|
||||||
|
'device_path': 'fake_device'},
|
||||||
|
{'mount_device': '/dev/sdf',
|
||||||
|
'device_path': 'fake_device'}]
|
||||||
|
block_device_info = {
|
||||||
|
'root_device_name': '/dev/sda',
|
||||||
|
'swap': swap,
|
||||||
|
'ephemerals': ephemerals,
|
||||||
|
'block_device_mapping': block_device_mapping}
|
||||||
|
|
||||||
|
def _assert_volume_in_mapping(device_name, true_or_false):
|
||||||
|
in_mapping = block_device.volume_in_mapping(
|
||||||
|
device_name, block_device_info)
|
||||||
|
self.assertEquals(in_mapping, true_or_false)
|
||||||
|
|
||||||
|
_assert_volume_in_mapping('sda', False)
|
||||||
|
_assert_volume_in_mapping('sdb', True)
|
||||||
|
_assert_volume_in_mapping('sdc1', True)
|
||||||
|
_assert_volume_in_mapping('sdd', True)
|
||||||
|
_assert_volume_in_mapping('sde', True)
|
||||||
|
_assert_volume_in_mapping('sdf', True)
|
||||||
|
_assert_volume_in_mapping('sdg', False)
|
||||||
|
_assert_volume_in_mapping('sdh1', False)
|
||||||
|
@ -2883,42 +2883,6 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
|
|
||||||
self.mox.UnsetStubs()
|
self.mox.UnsetStubs()
|
||||||
|
|
||||||
def test_volume_in_mapping(self):
|
|
||||||
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
|
||||||
swap = {'device_name': '/dev/sdb',
|
|
||||||
'swap_size': 1}
|
|
||||||
ephemerals = [{'num': 0,
|
|
||||||
'virtual_name': 'ephemeral0',
|
|
||||||
'device_name': '/dev/sdc1',
|
|
||||||
'size': 1},
|
|
||||||
{'num': 2,
|
|
||||||
'virtual_name': 'ephemeral2',
|
|
||||||
'device_name': '/dev/sdd',
|
|
||||||
'size': 1}]
|
|
||||||
block_device_mapping = [{'mount_device': '/dev/sde',
|
|
||||||
'device_path': 'fake_device'},
|
|
||||||
{'mount_device': '/dev/sdf',
|
|
||||||
'device_path': 'fake_device'}]
|
|
||||||
block_device_info = {
|
|
||||||
'root_device_name': '/dev/sda',
|
|
||||||
'swap': swap,
|
|
||||||
'ephemerals': ephemerals,
|
|
||||||
'block_device_mapping': block_device_mapping}
|
|
||||||
|
|
||||||
def _assert_volume_in_mapping(device_name, true_or_false):
|
|
||||||
self.assertEquals(conn._volume_in_mapping(device_name,
|
|
||||||
block_device_info),
|
|
||||||
true_or_false)
|
|
||||||
|
|
||||||
_assert_volume_in_mapping('sda', False)
|
|
||||||
_assert_volume_in_mapping('sdb', True)
|
|
||||||
_assert_volume_in_mapping('sdc1', True)
|
|
||||||
_assert_volume_in_mapping('sdd', True)
|
|
||||||
_assert_volume_in_mapping('sde', True)
|
|
||||||
_assert_volume_in_mapping('sdf', True)
|
|
||||||
_assert_volume_in_mapping('sdg', False)
|
|
||||||
_assert_volume_in_mapping('sdh1', False)
|
|
||||||
|
|
||||||
def test_immediate_delete(self):
|
def test_immediate_delete(self):
|
||||||
def fake_lookup_by_name(instance_name):
|
def fake_lookup_by_name(instance_name):
|
||||||
raise exception.InstanceNotFound(instance_id=instance_name)
|
raise exception.InstanceNotFound(instance_id=instance_name)
|
||||||
|
@ -1432,8 +1432,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
if size == 0 or suffix == '.rescue':
|
if size == 0 or suffix == '.rescue':
|
||||||
size = None
|
size = None
|
||||||
|
|
||||||
if not self._volume_in_mapping(self.default_root_device,
|
if not block_device.volume_in_mapping(
|
||||||
block_device_info):
|
self.default_root_device, block_device_info):
|
||||||
image('disk').cache(fetch_func=libvirt_utils.fetch_image,
|
image('disk').cache(fetch_func=libvirt_utils.fetch_image,
|
||||||
context=context,
|
context=context,
|
||||||
filename=root_fname,
|
filename=root_fname,
|
||||||
@ -1448,7 +1448,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
os_type_with_default = 'default'
|
os_type_with_default = 'default'
|
||||||
|
|
||||||
ephemeral_gb = instance['ephemeral_gb']
|
ephemeral_gb = instance['ephemeral_gb']
|
||||||
if ephemeral_gb and not self._volume_in_mapping(
|
if ephemeral_gb and not block_device.volume_in_mapping(
|
||||||
self.default_second_device, block_device_info):
|
self.default_second_device, block_device_info):
|
||||||
swap_device = self.default_third_device
|
swap_device = self.default_third_device
|
||||||
fn = functools.partial(self._create_ephemeral,
|
fn = functools.partial(self._create_ephemeral,
|
||||||
@ -1480,7 +1480,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
if driver.swap_is_usable(swap):
|
if driver.swap_is_usable(swap):
|
||||||
swap_mb = swap['swap_size']
|
swap_mb = swap['swap_size']
|
||||||
elif (inst_type['swap'] > 0 and
|
elif (inst_type['swap'] > 0 and
|
||||||
not self._volume_in_mapping(swap_device, block_device_info)):
|
not block_device.volume_in_mapping(
|
||||||
|
swap_device, block_device_info)):
|
||||||
swap_mb = inst_type['swap']
|
swap_mb = inst_type['swap']
|
||||||
|
|
||||||
if swap_mb > 0:
|
if swap_mb > 0:
|
||||||
@ -1557,24 +1558,6 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
if CONF.libvirt_type == 'uml':
|
if CONF.libvirt_type == 'uml':
|
||||||
libvirt_utils.chown(image('disk').path, 'root')
|
libvirt_utils.chown(image('disk').path, 'root')
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _volume_in_mapping(mount_device, block_device_info):
|
|
||||||
block_device_list = [block_device.strip_dev(vol['mount_device'])
|
|
||||||
for vol in
|
|
||||||
driver.block_device_info_get_mapping(
|
|
||||||
block_device_info)]
|
|
||||||
swap = driver.block_device_info_get_swap(block_device_info)
|
|
||||||
if driver.swap_is_usable(swap):
|
|
||||||
block_device_list.append(
|
|
||||||
block_device.strip_dev(swap['device_name']))
|
|
||||||
block_device_list += [block_device.strip_dev(ephemeral['device_name'])
|
|
||||||
for ephemeral in
|
|
||||||
driver.block_device_info_get_ephemerals(
|
|
||||||
block_device_info)]
|
|
||||||
|
|
||||||
LOG.debug(_("block_device_list %s"), block_device_list)
|
|
||||||
return block_device.strip_dev(mount_device) in block_device_list
|
|
||||||
|
|
||||||
def get_host_capabilities(self):
|
def get_host_capabilities(self):
|
||||||
"""Returns an instance of config.LibvirtConfigCaps representing
|
"""Returns an instance of config.LibvirtConfigCaps representing
|
||||||
the capabilities of the host"""
|
the capabilities of the host"""
|
||||||
@ -1708,8 +1691,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
self.default_second_device)
|
self.default_second_device)
|
||||||
devices.append(diskos)
|
devices.append(diskos)
|
||||||
else:
|
else:
|
||||||
ebs_root = self._volume_in_mapping(self.default_root_device,
|
ebs_root = block_device.volume_in_mapping(
|
||||||
block_device_info)
|
self.default_root_device, block_device_info)
|
||||||
|
|
||||||
if not ebs_root:
|
if not ebs_root:
|
||||||
if root_device_type == "cdrom":
|
if root_device_type == "cdrom":
|
||||||
@ -1723,8 +1706,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
devices.append(diskos)
|
devices.append(diskos)
|
||||||
|
|
||||||
ephemeral_device = None
|
ephemeral_device = None
|
||||||
if not (self._volume_in_mapping(self.default_second_device,
|
if not (block_device.volume_in_mapping(
|
||||||
block_device_info) or
|
self.default_second_device, block_device_info) or
|
||||||
0 in [eph['num'] for eph in
|
0 in [eph['num'] for eph in
|
||||||
driver.block_device_info_get_ephemerals(
|
driver.block_device_info_get_ephemerals(
|
||||||
block_device_info)]):
|
block_device_info)]):
|
||||||
@ -1758,8 +1741,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
swap['device_name']))
|
swap['device_name']))
|
||||||
devices.append(diskswap)
|
devices.append(diskswap)
|
||||||
elif (inst_type['swap'] > 0 and
|
elif (inst_type['swap'] > 0 and
|
||||||
not self._volume_in_mapping(swap_device,
|
not block_device.volume_in_mapping(
|
||||||
block_device_info)):
|
swap_device, block_device_info)):
|
||||||
diskswap = disk_info('disk.swap', swap_device)
|
diskswap = disk_info('disk.swap', swap_device)
|
||||||
devices.append(diskswap)
|
devices.append(diskswap)
|
||||||
self.virtapi.instance_update(
|
self.virtapi.instance_update(
|
||||||
|
@ -339,8 +339,8 @@ class VMwareVMOps(object):
|
|||||||
"data_store_name": data_store_name},
|
"data_store_name": data_store_name},
|
||||||
instance=instance)
|
instance=instance)
|
||||||
|
|
||||||
ebs_root = self._volume_in_mapping(self._default_root_device,
|
ebs_root = block_device.volume_in_mapping(
|
||||||
block_device_info)
|
self._default_root_device, block_device_info)
|
||||||
|
|
||||||
if not ebs_root:
|
if not ebs_root:
|
||||||
linked_clone = CONF.use_linked_clone
|
linked_clone = CONF.use_linked_clone
|
||||||
@ -1331,21 +1331,3 @@ class VMwareVMOps(object):
|
|||||||
interfaces.append(device.key)
|
interfaces.append(device.key)
|
||||||
|
|
||||||
return interfaces
|
return interfaces
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _volume_in_mapping(mount_device, block_device_info):
|
|
||||||
block_device_list = [block_device.strip_dev(vol['mount_device'])
|
|
||||||
for vol in
|
|
||||||
driver.block_device_info_get_mapping(
|
|
||||||
block_device_info)]
|
|
||||||
swap = driver.block_device_info_get_swap(block_device_info)
|
|
||||||
if driver.swap_is_usable(swap):
|
|
||||||
block_device_list.append(
|
|
||||||
block_device.strip_dev(swap['device_name']))
|
|
||||||
block_device_list += [block_device.strip_dev(ephemeral['device_name'])
|
|
||||||
for ephemeral in
|
|
||||||
driver.block_device_info_get_ephemerals(
|
|
||||||
block_device_info)]
|
|
||||||
|
|
||||||
LOG.debug(_("block_device_list %s"), block_device_list)
|
|
||||||
return block_device.strip_dev(mount_device) in block_device_list
|
|
||||||
|
@ -47,7 +47,6 @@ from nova import utils
|
|||||||
from nova.virt import configdrive
|
from nova.virt import configdrive
|
||||||
from nova.virt.disk import api as disk
|
from nova.virt.disk import api as disk
|
||||||
from nova.virt.disk.vfs import localfs as vfsimpl
|
from nova.virt.disk.vfs import localfs as vfsimpl
|
||||||
from nova.virt import driver
|
|
||||||
from nova.virt.xenapi import agent
|
from nova.virt.xenapi import agent
|
||||||
from nova.virt.xenapi import volume_utils
|
from nova.virt.xenapi import volume_utils
|
||||||
|
|
||||||
@ -489,29 +488,13 @@ def get_vdis_for_boot_from_vol(session, dev_params):
|
|||||||
return vdis
|
return vdis
|
||||||
|
|
||||||
|
|
||||||
def _volume_in_mapping(mount_device, block_device_info):
|
|
||||||
block_device_list = [block_device.strip_prefix(vol['mount_device'])
|
|
||||||
for vol in
|
|
||||||
driver.block_device_info_get_mapping(
|
|
||||||
block_device_info)]
|
|
||||||
swap = driver.block_device_info_get_swap(block_device_info)
|
|
||||||
if driver.swap_is_usable(swap):
|
|
||||||
swap_dev = swap['device_name']
|
|
||||||
block_device_list.append(block_device.strip_prefix(swap_dev))
|
|
||||||
block_device_list += [block_device.strip_prefix(ephemeral['device_name'])
|
|
||||||
for ephemeral in
|
|
||||||
driver.block_device_info_get_ephemerals(
|
|
||||||
block_device_info)]
|
|
||||||
LOG.debug(_("block_device_list %s"), block_device_list)
|
|
||||||
return block_device.strip_prefix(mount_device) in block_device_list
|
|
||||||
|
|
||||||
|
|
||||||
def get_vdis_for_instance(context, session, instance, name_label, image,
|
def get_vdis_for_instance(context, session, instance, name_label, image,
|
||||||
image_type, block_device_info=None):
|
image_type, block_device_info=None):
|
||||||
if block_device_info:
|
if block_device_info:
|
||||||
LOG.debug(_("block device info: %s"), block_device_info)
|
LOG.debug(_("block device info: %s"), block_device_info)
|
||||||
rootdev = block_device_info['root_device_name']
|
rootdev = block_device_info['root_device_name']
|
||||||
if _volume_in_mapping(rootdev, block_device_info):
|
if block_device.volume_in_mapping(rootdev, block_device_info,
|
||||||
|
strip=block_device.strip_prefix):
|
||||||
# call function to return the vdi in connection info of block
|
# call function to return the vdi in connection info of block
|
||||||
# device.
|
# device.
|
||||||
# make it a point to return from here.
|
# make it a point to return from here.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user