Merge "Cancel all waiting events during compute node shutdown"
This commit is contained in:
commit
563af55935
@ -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):
|
||||
|
@ -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'
|
||||
|
Loading…
x
Reference in New Issue
Block a user