Merge "Cancel all waiting events during compute node shutdown"

This commit is contained in:
Jenkins 2015-04-06 23:39:43 +00:00 committed by Gerrit Code Review
commit 563af55935
2 changed files with 35 additions and 0 deletions

View File

@ -544,6 +544,20 @@ class InstanceEvents(object):
return self._events.pop(instance.uuid, {})
return _clear_events()
def cancel_all_events(self):
for instance_uuid, events in self._events.items():
for event_name, eventlet_event in events.items():
LOG.debug('Canceling in-flight event %(event)s for '
'instance %(instance_uuid)s',
{'event': event_name,
'instance_uuid': instance_uuid})
name, tag = event_name.split('-', 1)
event = objects.InstanceExternalEvent(
instance_uuid=instance_uuid,
name=name, status='failed',
tag=tag, data={})
eventlet_event.send(event)
class ComputeVirtAPI(virtapi.VirtAPI):
def __init__(self, compute):
@ -1240,6 +1254,7 @@ class ComputeManager(manager.Manager):
self._update_scheduler_instance_info(context, instances)
def cleanup_host(self):
self.instance_events.cancel_all_events()
self.driver.cleanup_host(host=self.host)
def pre_start_hook(self):

View File

@ -1664,6 +1664,26 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
events[1])
do_test()
def test_cancel_all_events(self):
inst = objects.Instance(uuid='uuid')
fake_eventlet_event = mock.MagicMock()
self.compute.instance_events._events = {
inst.uuid: {
'foo-bar': fake_eventlet_event,
}
}
self.compute.instance_events.cancel_all_events()
self.assertTrue(fake_eventlet_event.send.called)
event = fake_eventlet_event.send.call_args_list[0][0][0]
self.assertEqual('foo', event.name)
self.assertEqual('bar', event.tag)
self.assertEqual('failed', event.status)
def test_cleanup_cancels_all_events(self):
with mock.patch.object(self.compute, 'instance_events') as mock_ev:
self.compute.cleanup_host()
mock_ev.cancel_all_events.assert_called_once_with()
def test_retry_reboot_pending_soft(self):
instance = objects.Instance(self.context)
instance.uuid = 'foo'