From f692f727236b7e3e97b657c048194870ddf88a47 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Mon, 20 May 2013 23:51:09 +0000 Subject: xenapi: Disable VDI size check when root_gb=0 Nova uses root_gb=0 to indicate that we should use the image as-is without trying to resize the root disk. Currently the xenapi virt-driver doesn't properly implement this behavior. This patch gets us a step closer by disabling the VDI size check when root_gb=0. We still need to ensure that the disk-resize code handle root_gb=0 as well. References bug 1155113 Change-Id: If91963e079e197a1315c48b8643f3419b42b0b2c --- nova/tests/virt/xenapi/test_vm_utils.py | 49 +++++++++++++++++++++++++++++++++ nova/virt/xenapi/vm_utils.py | 23 ++++++++-------- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/nova/tests/virt/xenapi/test_vm_utils.py b/nova/tests/virt/xenapi/test_vm_utils.py index 57f031a4c..4a7370dd9 100644 --- a/nova/tests/virt/xenapi/test_vm_utils.py +++ b/nova/tests/virt/xenapi/test_vm_utils.py @@ -20,6 +20,7 @@ import contextlib import fixtures import mox +from nova.compute import flavors from nova import exception from nova import test from nova import utils @@ -365,3 +366,51 @@ class ResizeHelpersTestCase(test.TestCase): self.mox.ReplayAll() vm_utils._resize_part_and_fs("fake", 0, 20, 30) + + +class CheckVDISizeTestCase(test.TestCase): + def setUp(self): + super(CheckVDISizeTestCase, self).setUp() + self.context = 'fakecontext' + self.session = 'fakesession' + self.instance = dict(uuid='fakeinstance') + self.vdi_uuid = 'fakeuuid' + + def test_not_too_large(self): + self.mox.StubOutWithMock(flavors, 'extract_instance_type') + flavors.extract_instance_type(self.instance).AndReturn( + dict(root_gb=1)) + + self.mox.StubOutWithMock(vm_utils, '_get_vdi_chain_size') + vm_utils._get_vdi_chain_size(self.session, + self.vdi_uuid).AndReturn(1073741824) + + self.mox.ReplayAll() + + vm_utils._check_vdi_size(self.context, self.session, self.instance, + self.vdi_uuid) + + def test_too_large(self): + self.mox.StubOutWithMock(flavors, 'extract_instance_type') + flavors.extract_instance_type(self.instance).AndReturn( + dict(root_gb=1)) + + self.mox.StubOutWithMock(vm_utils, '_get_vdi_chain_size') + vm_utils._get_vdi_chain_size(self.session, + self.vdi_uuid).AndReturn(1073741825) + + self.mox.ReplayAll() + + self.assertRaises(exception.InstanceTypeDiskTooSmall, + vm_utils._check_vdi_size, self.context, self.session, + self.instance, self.vdi_uuid) + + def test_zero_root_gb_disables_check(self): + self.mox.StubOutWithMock(flavors, 'extract_instance_type') + flavors.extract_instance_type(self.instance).AndReturn( + dict(root_gb=0)) + + self.mox.ReplayAll() + + vm_utils._check_vdi_size(self.context, self.session, self.instance, + self.vdi_uuid) diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 69a944b9b..fde075000 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -1192,21 +1192,20 @@ def _get_vdi_chain_size(session, vdi_uuid): def _check_vdi_size(context, session, instance, vdi_uuid): - size_bytes = _get_vdi_chain_size(session, vdi_uuid) - - # FIXME(jk0): this was copied directly from compute.manager.py, let's - # refactor this to a common area instance_type = flavors.extract_instance_type(instance) - allowed_size_gb = instance_type['root_gb'] - allowed_size_bytes = allowed_size_gb * 1024 * 1024 * 1024 + allowed_size = instance_type['root_gb'] * (1024 ** 3) + + if not allowed_size: + # root_gb=0 indicates that we're disabling size checks + return - LOG.debug(_("image_size_bytes=%(size_bytes)d, allowed_size_bytes=" - "%(allowed_size_bytes)d"), locals(), instance=instance) + size = _get_vdi_chain_size(session, vdi_uuid) + if size > allowed_size: + LOG.error(_("Image size %(size)d exceeded instance_type " + "allowed size %(allowed_size)d"), + {'size': size, 'allowed_size': allowed_size}, + instance=instance) - if size_bytes > allowed_size_bytes: - LOG.info(_("Image size %(size_bytes)d exceeded instance_type " - "allowed size %(allowed_size_bytes)d"), - locals(), instance=instance) raise exception.InstanceTypeDiskTooSmall() -- cgit