From b1cde33175bc555e1af822894e8c3f981fbb8ef6 Mon Sep 17 00:00:00 2001 From: jichenjc Date: Thu, 19 Jun 2014 17:44:31 +0800 Subject: [PATCH] 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 --- nova/tests/virt/libvirt/test_driver.py | 40 ++++++++++++++++++++++++++ nova/virt/libvirt/driver.py | 10 +++++++ 2 files changed, 50 insertions(+) diff --git a/nova/tests/virt/libvirt/test_driver.py b/nova/tests/virt/libvirt/test_driver.py index 88a7126871ff..57c54668c195 100644 --- a/nova/tests/virt/libvirt/test_driver.py +++ b/nova/tests/virt/libvirt/test_driver.py @@ -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): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 33077d1cd8c6..425b2efa696d 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -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."""