check ephemeral disk format at libvirt before use

Add ephemeral disk format at libvirt. There is no check before
so it will be used directly. This patch adds valid check function
and validate it before eph disk was used in virt layer.

Change-Id: I1934573e79f126e725cef4848b15c11a595161c9
Closes-Bug: #1293880
This commit is contained in:
jichenjc 2014-06-19 17:44:31 +08:00
parent 89cd2f9a4d
commit b1cde33175
2 changed files with 50 additions and 0 deletions

View File

@ -4904,6 +4904,34 @@ class LibvirtConnTestCase(test.TestCase):
]
self.assertEqual(gotFiles, wantFiles)
def test_create_ephemeral_specified_fs_not_valid(self):
CONF.set_override('default_ephemeral_format', 'ext4')
ephemerals = [{'device_type': 'disk',
'disk_bus': 'virtio',
'device_name': '/dev/vdb',
'guest_format': 'dummy',
'size': 1}]
block_device_info = {
'ephemerals': ephemerals}
instance_ref = self.test_instance
instance_ref['image_ref'] = 1
instance = db.instance_create(self.context, instance_ref)
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
image_meta = {'id': instance['image_ref']}
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
instance,
None,
image_meta)
disk_info['mapping'].pop('disk.local')
with contextlib.nested(
mock.patch.object(utils, 'execute'),
mock.patch.object(conn, 'get_info'),
mock.patch.object(conn, '_create_domain_and_network')):
self.assertRaises(exception.InvalidBDMFormat, conn._create_image,
context, instance, disk_info['mapping'],
block_device_info=block_device_info)
def test_create_ephemeral_default(self):
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.mox.StubOutWithMock(utils, 'execute')
@ -6919,6 +6947,18 @@ class LibvirtConnTestCase(test.TestCase):
ephemerals, swap,
block_device_mapping)
def test_is_supported_fs_format(self):
supported_fs = [disk.FS_FORMAT_EXT2, disk.FS_FORMAT_EXT3,
disk.FS_FORMAT_EXT4, disk.FS_FORMAT_XFS]
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
for fs in supported_fs:
self.assertTrue(conn.is_supported_fs_format(fs))
supported_fs = ['', 'dummy']
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
for fs in supported_fs:
self.assertFalse(conn.is_supported_fs_format(fs))
def test_hypervisor_hostname_caching(self):
# Make sure that the first hostname is always returned
class FakeConn(object):

View File

@ -2662,6 +2662,12 @@ class LibvirtDriver(driver.ComputeDriver):
for idx, eph in enumerate(driver.block_device_info_get_ephemerals(
block_device_info)):
disk_image = image(blockinfo.get_eph_disk(idx))
specified_fs = eph.get('guest_format')
if specified_fs and not self.is_supported_fs_format(specified_fs):
msg = _("%s format is not supported") % specified_fs
raise exception.InvalidBDMFormat(details=msg)
fn = functools.partial(self._create_ephemeral,
fs_label='ephemeral%d' % idx,
os_type=instance["os_type"],
@ -5287,6 +5293,10 @@ class LibvirtDriver(driver.ComputeDriver):
ephemerals, swap,
block_device_mapping)
def is_supported_fs_format(self, fs_type):
return fs_type in [disk.FS_FORMAT_EXT2, disk.FS_FORMAT_EXT3,
disk.FS_FORMAT_EXT4, disk.FS_FORMAT_XFS]
class HostState(object):
"""Manages information about the compute node through libvirt."""