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."""