VMware: fix disk extend bug when no space on datastore

In the event that thete is no space on the datastore then ensure
that the disk extension is cleaned up accordingly.

A number of files would be left behind on the datastore.

Change-Id: Ica9daf9151e4fb1874fa8b1d7247080860ef4ae2
Related-Bug: #1255355
(cherry picked from commit 787d36b40b)
This commit is contained in:
Gary Kotton 2013-12-01 05:09:19 -08:00
parent fe48d3de43
commit 985b5aac40
2 changed files with 44 additions and 2 deletions

View File

@ -408,6 +408,38 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
'node': self.instance_node})
self._check_vm_info(info, power_state.RUNNING)
def test_spawn_disk_extend_insufficient_disk_space(self):
self.flags(use_linked_clone=True, group='vmware')
self.wait_task = self.conn._session._wait_for_task
self.call_method = self.conn._session._call_method
self.task_ref = None
id = 'fake_image_uuid'
cached_image = '[%s] vmware_base/%s.80.vmdk' % (self.ds, id)
tmp_file = '[%s] vmware_base/%s.80-flat.vmdk' % (self.ds, id)
def fake_wait_for_task(instance_uuid, task_ref):
if task_ref == self.task_ref:
self.task_ref = None
self.assertTrue(vmwareapi_fake.get_file(cached_image))
self.assertTrue(vmwareapi_fake.get_file(tmp_file))
raise exception.NovaException('No space!')
return self.wait_task(instance_uuid, task_ref)
def fake_call_method(module, method, *args, **kwargs):
task_ref = self.call_method(module, method, *args, **kwargs)
if method == "ExtendVirtualDisk_Task":
self.task_ref = task_ref
return task_ref
self.stubs.Set(self.conn._session, "_call_method", fake_call_method)
self.stubs.Set(self.conn._session, "_wait_for_task",
fake_wait_for_task)
self.assertRaises(exception.NovaException,
self._create_vm)
self.assertFalse(vmwareapi_fake.get_file(cached_image))
self.assertFalse(vmwareapi_fake.get_file(tmp_file))
def test_spawn_disk_invalid_disk_size(self):
self.mox.StubOutWithMock(vmware_images, 'get_vmdk_size_and_properties')
result = [82 * 1024 * 1024 * 1024,

View File

@ -142,8 +142,18 @@ class VMwareVMOps(object):
datacenter=dc_ref,
newCapacityKb=requested_size,
eagerZero=False)
self._session._wait_for_task(instance['uuid'],
vmdk_extend_task)
try:
self._session._wait_for_task(instance['uuid'],
vmdk_extend_task)
except Exception as e:
with excutils.save_and_reraise_exception():
LOG.error(_('Extending virtual disk failed with error: %s'),
e, instance=instance)
# Clean up files created during the extend operation
files = [name.replace(".vmdk", "-flat.vmdk"), name]
for file in files:
self._delete_datastore_file(instance, file, dc_ref)
LOG.debug(_("Extended root virtual disk"))
def _delete_datastore_file(self, instance, datastore_path, dc_ref):