diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 5fc5b4a45844..ae55c2c786a7 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -447,8 +447,8 @@ class InstanceEvents(object): def _create_or_get_event(): if instance.uuid not in self._events: self._events.setdefault(instance.uuid, {}) - return self._events[instance.uuid].setdefault( - event_name, eventlet.event.Event()) + return self._events[instance.uuid].setdefault( + event_name, eventlet.event.Event()) LOG.debug(_('Preparing to wait for external event %(event)s'), {'event': event_name}, instance=instance) return _create_or_get_event() diff --git a/nova/tests/compute/test_compute_mgr.py b/nova/tests/compute/test_compute_mgr.py index d787da2aaf7f..ec5fdfba4f73 100644 --- a/nova/tests/compute/test_compute_mgr.py +++ b/nova/tests/compute/test_compute_mgr.py @@ -1013,6 +1013,22 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): self.compute.instance_events._events['foo']['test-event']) self.assertTrue(hasattr(result, 'send')) + def test_prepare_for_instance_event_again(self): + inst_obj = instance_obj.Instance(uuid='foo') + self.compute.instance_events.prepare_for_instance_event( + inst_obj, 'test-event') + # A second attempt will avoid creating a new list; make sure we + # get the current list + result = self.compute.instance_events.prepare_for_instance_event( + inst_obj, 'test-event') + self.assertIn('foo', self.compute.instance_events._events) + self.assertIn('test-event', + self.compute.instance_events._events['foo']) + self.assertEqual( + result, + self.compute.instance_events._events['foo']['test-event']) + self.assertTrue(hasattr(result, 'send')) + def test_process_instance_event(self): event = eventlet_event.Event() self.compute.instance_events._events = {