diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-09-30 10:08:08 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-09-30 10:08:08 +0000 |
commit | f7032f1afbb8b52c8d0821b6d77cda09126ea6c2 (patch) | |
tree | 34383f87faf1f3137768db0f630f3219dd231b57 | |
parent | 25c7735677e16d7d7d36f9661bf906c3711d7ff2 (diff) | |
parent | e1f8664c9fa83f77f5bb763ffcc3157905ed954c (diff) | |
download | nova-f7032f1afbb8b52c8d0821b6d77cda09126ea6c2.tar.gz |
Merge "VMWare: Fix VM leak when deletion of VM during resizing"
-rw-r--r-- | nova/tests/virt/vmwareapi/test_driver_api.py | 11 | ||||
-rw-r--r-- | nova/virt/vmwareapi/vmops.py | 11 |
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) |