summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-04-04 06:49:13 +0000
committerGerrit Code Review <review@openstack.org>2013-04-04 06:49:13 +0000
commita892d2f740d5bdaa82aec4583ced3f336f89bb78 (patch)
treeee50bcaf307973a463e26f49dbd2a70322a1bfb9 /nova
parent34144bd68de1d2dca649b39c471eed98ad46dc3f (diff)
parent306046c7d5c20454035fcea22ce3efeac1d11cfc (diff)
downloadnova-a892d2f740d5bdaa82aec4583ced3f336f89bb78.tar.gz
nova-a892d2f740d5bdaa82aec4583ced3f336f89bb78.tar.xz
nova-a892d2f740d5bdaa82aec4583ced3f336f89bb78.zip
Merge "After migrate, catch and remove deleted instances"
Diffstat (limited to 'nova')
-rwxr-xr-xnova/compute/manager.py22
-rw-r--r--nova/tests/compute/test_compute.py50
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',