summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-09-30 10:08:08 +0000
committerGerrit Code Review <review@openstack.org>2014-09-30 10:08:08 +0000
commitf7032f1afbb8b52c8d0821b6d77cda09126ea6c2 (patch)
tree34383f87faf1f3137768db0f630f3219dd231b57
parent25c7735677e16d7d7d36f9661bf906c3711d7ff2 (diff)
parente1f8664c9fa83f77f5bb763ffcc3157905ed954c (diff)
downloadnova-f7032f1afbb8b52c8d0821b6d77cda09126ea6c2.tar.gz
Merge "VMWare: Fix VM leak when deletion of VM during resizing"
-rw-r--r--nova/tests/virt/vmwareapi/test_driver_api.py11
-rw-r--r--nova/virt/vmwareapi/vmops.py11
2 files changed, 20 insertions, 2 deletions
diff --git a/nova/tests/virt/vmwareapi/test_driver_api.py b/nova/tests/virt/vmwareapi/test_driver_api.py
index fb3e2450a5..7d99a98818 100644
--- a/nova/tests/virt/vmwareapi/test_driver_api.py
+++ b/nova/tests/virt/vmwareapi/test_driver_api.py
@@ -1482,8 +1482,15 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
self.conn.destroy(self.context, self.instance,
self.network_info,
None, True)
- mock_get.assert_called_once_with(self.conn._vmops._session,
- self.instance['uuid'])
+ mock_get.assert_called_with(self.conn._vmops._session,
+ self.instance['uuid'])
+ expected_args = [((self.conn._vmops._session,
+ self.instance['uuid'] + '-orig'),),
+ ((self.conn._vmops._session,
+ self.instance['uuid']),)]
+ # one for VM named uuid-orig, one for VM named uuid
+ self.assertEqual(expected_args, mock_get.call_args_list)
+ self.assertEqual(2, mock_get.call_count)
self.assertFalse(mock_call.called)
def _rescue(self, config_drive=False):
diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py
index 2c5ecd467e..5c6b580b1a 100644
--- a/nova/virt/vmwareapi/vmops.py
+++ b/nova/virt/vmwareapi/vmops.py
@@ -838,6 +838,17 @@ class VMwareVMOps(object):
self._destroy_instance(instance,
destroy_disks=destroy_disks,
instance_name=rescue_name)
+ # When VM deletion is triggered in middle of VM resize before VM
+ # arrive RESIZED state, uuid-orig VM need to deleted to avoid
+ # VM leak. Within method _destroy_instance it will check vmref
+ # exist or not before attempt deletion.
+ resize_orig_vmname = instance['uuid'] + self._migrate_suffix
+ vm_orig_ref = vm_util.get_vm_ref_from_name(self._session,
+ resize_orig_vmname)
+ if vm_orig_ref:
+ self._destroy_instance(instance,
+ destroy_disks=destroy_disks,
+ instance_name=resize_orig_vmname)
self._destroy_instance(instance, destroy_disks=destroy_disks)
LOG.debug("Instance destroyed", instance=instance)