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
This commit is contained in:
Ryan Moore 2013-11-29 14:21:19 +00:00 committed by Thierry Carrez
parent 50489dc4eb
commit 3e451f1bac
3 changed files with 32 additions and 5 deletions

View File

@ -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 = []

View File

@ -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()

View File

@ -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: