Skip to content
This repository was archived by the owner on Sep 26, 2019. It is now read-only.

Commit b5f5a16

Browse files
author
Daniel Watkins
committed
Use a registry to configure reporting handlers.
Also ensure that the LogHandler is registered by default. Change-Id: Ib9e306a0aa45ab6f5c9b543782b5dd7019b72cf1
1 parent 91a5942 commit b5f5a16

File tree

2 files changed

+39
-21
lines changed

2 files changed

+39
-21
lines changed

cloudinit/reporting.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import abc
1313
import logging
1414

15+
from cloudinit.registry import DictRegistry
16+
1517

1618
FINISH_EVENT_TYPE = 'finish'
1719
START_EVENT_TYPE = 'start'
@@ -63,7 +65,8 @@ def publish_event(self, event):
6365
logger.info(event.as_string())
6466

6567

66-
HANDLERS = [LogHandler()]
68+
handler_registry = DictRegistry()
69+
handler_registry.register_item('_logging', LogHandler())
6770

6871

6972
def report_event(event):
@@ -76,7 +79,7 @@ def report_event(event):
7679
The type of the event; this should be a constant from the
7780
reporting module.
7881
"""
79-
for handler in HANDLERS:
82+
for _, handler in handler_registry.registered_items.items():
8083
handler.publish_event(event)
8184

8285

cloudinit/tests/test_reporting.py

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,22 @@
1010
from cloudinit.tests.util import mock
1111

1212

13+
def _fake_registry():
14+
return mock.Mock(registered_items={'a': mock.MagicMock(),
15+
'b': mock.MagicMock()})
16+
17+
1318
class TestReportStartEvent(unittest.TestCase):
1419

15-
@mock.patch('cloudinit.reporting.HANDLERS',
16-
new_callable=lambda: [mock.MagicMock(), mock.MagicMock()])
20+
@mock.patch('cloudinit.reporting.handler_registry',
21+
new_callable=_fake_registry)
1722
def test_report_start_event_passes_something_with_as_string_to_handlers(
18-
self, HANDLERS):
23+
self, handler_registry):
1924
event_name, event_description = 'my_test_event', 'my description'
2025
reporting.report_start_event(event_name, event_description)
2126
expected_string_representation = ': '.join(
2227
['start', event_name, event_description])
23-
for handler in HANDLERS:
28+
for _, handler in handler_registry.registered_items.items():
2429
self.assertEqual(1, handler.publish_event.call_count)
2530
event = handler.publish_event.call_args[0][0]
2631
self.assertEqual(expected_string_representation, event.as_string())
@@ -36,42 +41,42 @@ def _report_finish_event(self, successful=None):
3641

3742
def assertHandlersPassedObjectWithAsString(
3843
self, handlers, expected_as_string):
39-
for handler in handlers:
44+
for _, handler in handlers.items():
4045
self.assertEqual(1, handler.publish_event.call_count)
4146
event = handler.publish_event.call_args[0][0]
4247
self.assertEqual(expected_as_string, event.as_string())
4348

44-
@mock.patch('cloudinit.reporting.HANDLERS',
45-
new_callable=lambda: [mock.MagicMock(), mock.MagicMock()])
49+
@mock.patch('cloudinit.reporting.handler_registry',
50+
new_callable=_fake_registry)
4651
def test_report_finish_event_passes_something_with_as_string_to_handlers(
47-
self, HANDLERS):
52+
self, handler_registry):
4853
event_name, event_description = self._report_finish_event()
4954
expected_string_representation = ': '.join(
5055
['finish', event_name, event_description])
5156
self.assertHandlersPassedObjectWithAsString(
52-
HANDLERS, expected_string_representation)
57+
handler_registry.registered_items, expected_string_representation)
5358

54-
@mock.patch('cloudinit.reporting.HANDLERS',
55-
new_callable=lambda: [mock.MagicMock(), mock.MagicMock()])
56-
def test_reporting_successful_finish_has_sensible_string_repr(self,
57-
HANDLERS):
59+
@mock.patch('cloudinit.reporting.handler_registry',
60+
new_callable=_fake_registry)
61+
def test_reporting_successful_finish_has_sensible_string_repr(
62+
self, handler_registry):
5863
event_name, event_description = self._report_finish_event(
5964
successful=True)
6065
expected_string_representation = ': '.join(
6166
['finish', event_name, 'success', event_description])
6267
self.assertHandlersPassedObjectWithAsString(
63-
HANDLERS, expected_string_representation)
68+
handler_registry.registered_items, expected_string_representation)
6469

65-
@mock.patch('cloudinit.reporting.HANDLERS',
66-
new_callable=lambda: [mock.MagicMock(), mock.MagicMock()])
67-
def test_reporting_unsuccessful_finish_has_sensible_string_repr(self,
68-
HANDLERS):
70+
@mock.patch('cloudinit.reporting.handler_registry',
71+
new_callable=_fake_registry)
72+
def test_reporting_unsuccessful_finish_has_sensible_string_repr(
73+
self, handler_registry):
6974
event_name, event_description = self._report_finish_event(
7075
successful=False)
7176
expected_string_representation = ': '.join(
7277
['finish', event_name, 'fail', event_description])
7378
self.assertHandlersPassedObjectWithAsString(
74-
HANDLERS, expected_string_representation)
79+
handler_registry.registered_items, expected_string_representation)
7580

7681

7782
class TestReportingEvent(unittest.TestCase):
@@ -115,3 +120,13 @@ def test_log_message_uses_event_as_string(self, getLogger):
115120
reporting.LogHandler().publish_event(event)
116121
self.assertIn(event.as_string(),
117122
getLogger.return_value.info.call_args[0][0])
123+
124+
125+
class TestDefaultRegisteredHandler(TestCase):
126+
127+
def test_log_handler_registered_by_default(self):
128+
for _, item in reporting.handler_registry.registered_items.items():
129+
if isinstance(item, reporting.LogHandler):
130+
break
131+
else:
132+
self.fail('No reporting LogHandler registered by default.')

0 commit comments

Comments
 (0)