From 3e451f1bac57d24e47171cffb3ad59bb1610d836 Mon Sep 17 00:00:00 2001 From: Ryan Moore Date: Fri, 29 Nov 2013 14:21:19 +0000 Subject: [PATCH] use 'os_type' in ephemeral filename only if mkfs defined Currently for undefined os-types it will use the default mkfs command, but use the meta 'os_type' in the name of the ephemeral file (e.g. ephemeral_20_abcdef). Which can result in a lot of files (DoS?) This change will only use 'os_type' in the ephemeral filename if there is a specific mkfs command defined, otherwise it will use 'default' (e.g. ephemeral_20_default) Modifed the tests to test for: os_type='' os_type=None os_type='test' - with no mkfs command specified os_type='test' - with a mkfs command specified Closes-Bug: 1253980 Backport of Original Change-Id: Ie4c10f99ce690c5e4ef181624bd688c38923855c to stable/grizzly Change-Id: Ia040910e90861a2987eff345ad1c01863655b124 --- nova/tests/test_libvirt.py | 28 ++++++++++++++++++++++++++-- nova/virt/disk/api.py | 4 ++++ nova/virt/libvirt/driver.py | 5 ++--- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 4b07d65b05cb..d2ac73ba8a96 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -2725,7 +2725,7 @@ class LibvirtConnTestCase(test.TestCase): self.assertTrue(self.cache_called_for_disk) db.instance_destroy(self.context, instance['uuid']) - def test_create_image_plain(self): + def _test_create_image_plain(self, os_type='', filename='', mkfs=False): gotFiles = [] def fake_image(self, instance, name, image_type=''): @@ -2760,11 +2760,15 @@ class LibvirtConnTestCase(test.TestCase): instance_ref = self.test_instance instance_ref['image_ref'] = 1 instance = db.instance_create(self.context, instance_ref) + instance['os_type'] = os_type conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) self.stubs.Set(conn, 'to_xml', fake_none) self.stubs.Set(conn, '_create_domain_and_network', fake_none) self.stubs.Set(conn, 'get_info', fake_get_info) + if mkfs: + self.stubs.Set(nova.virt.disk.api, '_MKFS_COMMAND', + {os_type: 'mkfs.ext3 --label %(fs_label)s %(target)s'}) image_meta = {'id': instance['image_ref']} disk_info = blockinfo.get_disk_info(CONF.libvirt_type, @@ -2779,11 +2783,31 @@ class LibvirtConnTestCase(test.TestCase): wantFiles = [ {'filename': '356a192b7913b04c54574d18c28d46e6395428ab', 'size': 10 * 1024 * 1024 * 1024}, - {'filename': 'ephemeral_20_default', + {'filename': filename, 'size': 20 * 1024 * 1024 * 1024}, ] self.assertEquals(gotFiles, wantFiles) + def test_create_image_plain_os_type_blank(self): + self._test_create_image_plain(os_type='', + filename='ephemeral_20_default', + mkfs=False) + + def test_create_image_plain_os_type_none(self): + self._test_create_image_plain(os_type=None, + filename='ephemeral_20_default', + mkfs=False) + + def test_create_image_plain_os_type_set_no_fs(self): + self._test_create_image_plain(os_type='test', + filename='ephemeral_20_default', + mkfs=False) + + def test_create_image_plain_os_type_set_with_fs(self): + self._test_create_image_plain(os_type='test', + filename='ephemeral_20_test', + mkfs=True) + def test_create_image_with_swap(self): gotFiles = [] diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index e1af0bfdd5c0..a17ba59ce4de 100755 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -90,6 +90,10 @@ for s in CONF.virt_mkfs: _DEFAULT_MKFS_COMMAND = mkfs_command +def get_fs_type_for_os_type(os_type): + return os_type if _MKFS_COMMAND.get(os_type) else 'default' + + def mkfs(os_type, fs_label, target): mkfs_command = (_MKFS_COMMAND.get(os_type, _DEFAULT_MKFS_COMMAND) or '') % locals() diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index ff1117cc78d0..0f0ea46275a2 100755 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1826,9 +1826,8 @@ class LibvirtDriver(driver.ComputeDriver): project_id=instance['project_id']) # Lookup the filesystem type if required - os_type_with_default = instance['os_type'] - if not os_type_with_default: - os_type_with_default = 'default' + os_type_with_default = disk.get_fs_type_for_os_type( + instance['os_type']) ephemeral_gb = instance['ephemeral_gb'] if 'disk.local' in disk_mapping: