diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-04-04 06:49:13 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-04-04 06:49:13 +0000 |
| commit | a892d2f740d5bdaa82aec4583ced3f336f89bb78 (patch) | |
| tree | ee50bcaf307973a463e26f49dbd2a70322a1bfb9 /nova | |
| parent | 34144bd68de1d2dca649b39c471eed98ad46dc3f (diff) | |
| parent | 306046c7d5c20454035fcea22ce3efeac1d11cfc (diff) | |
| download | nova-a892d2f740d5bdaa82aec4583ced3f336f89bb78.tar.gz nova-a892d2f740d5bdaa82aec4583ced3f336f89bb78.tar.xz nova-a892d2f740d5bdaa82aec4583ced3f336f89bb78.zip | |
Merge "After migrate, catch and remove deleted instances"
Diffstat (limited to 'nova')
| -rwxr-xr-x | nova/compute/manager.py | 22 | ||||
| -rw-r--r-- | nova/tests/compute/test_compute.py | 50 |
2 files changed, 67 insertions, 5 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 3e644fecb..8556a5d26 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -440,13 +440,25 @@ class ComputeManager(manager.SchedulerDependentManager): '%(instance_host)s) is not equal to our ' 'host (%(our_host)s).'), locals(), instance=instance) - network_info = self._get_instance_nw_info(context, instance) - bdi = self._get_instance_volume_block_device_info(context, - instance) + # TODO(deva): detect if instance's disk is shared or local, + # and destroy if it is local. + destroy_disks = False + try: + network_info = self._get_instance_nw_info(context, + instance) + bdi = self._get_instance_volume_block_device_info(context, + instance) + except exception.InstanceNotFound: + network_info = network_model.NetworkInfo() + bdi = {} + LOG.info(_('Instance has been marked deleted already, ' + 'removing it from the hypervisor.'), + instance=instance) + # always destroy disks if the instance was deleted + destroy_disks = True self.driver.destroy(instance, self._legacy_nw_info(network_info), - bdi, - False) + bdi, destroy_disks) def _init_instance(self, context, instance): '''Initialize this instance during service init.''' diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 7e85ad0a7..41da61e4e 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -3936,6 +3936,56 @@ class ComputeTestCase(BaseTestCase): self.mox.VerifyAll() self.mox.UnsetStubs() + def test_init_host_with_deleted_migration(self): + our_host = self.compute.host + not_our_host = 'not-' + our_host + fake_context = 'fake-context' + + deleted_instance = { + 'name': 'fake-name', + 'host': not_our_host, + 'uuid': 'fake-uuid', + } + + self.mox.StubOutWithMock(self.compute.driver, 'init_host') + self.mox.StubOutWithMock(self.compute.driver, 'destroy') + self.mox.StubOutWithMock(self.compute.conductor_api, + 'instance_get_all_by_host') + self.mox.StubOutWithMock(context, 'get_admin_context') + self.mox.StubOutWithMock(self.compute, 'init_virt_events') + self.mox.StubOutWithMock(self.compute, '_get_instances_on_driver') + self.mox.StubOutWithMock(self.compute, '_init_instance') + self.mox.StubOutWithMock(self.compute, '_report_driver_status') + self.mox.StubOutWithMock(self.compute, 'publish_service_capabilities') + self.mox.StubOutWithMock(self.compute, '_get_instance_nw_info') + + self.compute.driver.init_host(host=our_host) + context.get_admin_context().AndReturn(fake_context) + self.compute.conductor_api.instance_get_all_by_host( + fake_context, our_host).AndReturn([]) + self.compute.init_virt_events() + + # simulate failed instance + self.compute._get_instances_on_driver(fake_context).AndReturn([ + deleted_instance]) + self.compute._get_instance_nw_info(fake_context, deleted_instance + ).AndRaise(exception.InstanceNotFound( + instance_id=deleted_instance['uuid'])) + # ensure driver.destroy is called so that driver may + # clean up any dangling files + self.compute.driver.destroy(deleted_instance, + mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()) + + self.compute._report_driver_status(fake_context) + self.compute.publish_service_capabilities(fake_context) + + self.mox.ReplayAll() + self.compute.init_host() + # tearDown() uses context.get_admin_context(), so we have + # to do the verification here and unstub it. + self.mox.VerifyAll() + self.mox.UnsetStubs() + def test_init_instance_failed_resume_sets_error(self): instance = { 'uuid': 'fake-uuid', |
