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:
parent
fe48d3de43
commit
985b5aac40
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue