Added ability to detect import errors in list_notifier if one or more drivers could not be loaded.
This commit is contained in:
		
							
								
								
									
										1
									
								
								Authors
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Authors
									
									
									
									
									
								
							@@ -99,6 +99,7 @@ Scott Moser <smoser@ubuntu.com>
 | 
			
		||||
Soren Hansen <soren.hansen@rackspace.com>
 | 
			
		||||
Stephanie Reese <reese.sm@gmail.com>
 | 
			
		||||
Thierry Carrez <thierry@openstack.org>
 | 
			
		||||
Tim Simpson <tim.simpson@rackspace.com>
 | 
			
		||||
Todd Willey <todd@ansolabs.com>
 | 
			
		||||
Trey Morris <trey.morris@rackspace.com>
 | 
			
		||||
Tushar Patil <tushar.vitthal.patil@gmail.com>
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
from nova import flags
 | 
			
		||||
from nova import log as logging
 | 
			
		||||
from nova import utils
 | 
			
		||||
from nova.exception import ClassNotFound
 | 
			
		||||
 | 
			
		||||
flags.DEFINE_multistring('list_notifier_drivers',
 | 
			
		||||
                         ['nova.notifier.no_op_notifier'],
 | 
			
		||||
@@ -27,17 +28,31 @@ LOG = logging.getLogger('nova.notifier.list_notifier')
 | 
			
		||||
 | 
			
		||||
drivers = None
 | 
			
		||||
 | 
			
		||||
def __get_drivers():
 | 
			
		||||
 | 
			
		||||
class ImportFailureNotifier(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, exception):
 | 
			
		||||
        self.exception = exception
 | 
			
		||||
 | 
			
		||||
    def notify(message):
 | 
			
		||||
        raise self.exception
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _get_drivers():
 | 
			
		||||
    """Instantiates and returns drivers based on the flag values."""
 | 
			
		||||
    global drivers
 | 
			
		||||
    if not drivers:
 | 
			
		||||
        drivers = [utils.import_object(notification_driver)
 | 
			
		||||
                   for notification_driver in FLAGS.list_notifier_drivers]
 | 
			
		||||
        drivers = []
 | 
			
		||||
        for notification_driver in FLAGS.list_notifier_drivers:
 | 
			
		||||
            try:
 | 
			
		||||
                drivers.append(utils.import_object(notification_driver))
 | 
			
		||||
            except ClassNotFound as e:
 | 
			
		||||
                drivers.append(ImportFailureNotifier(e))
 | 
			
		||||
    return drivers
 | 
			
		||||
 | 
			
		||||
def notify(message):
 | 
			
		||||
    """Passes notification to mulitple notifiers in a list."""
 | 
			
		||||
    for driver in __get_drivers():
 | 
			
		||||
    for driver in _get_drivers():
 | 
			
		||||
        try:
 | 
			
		||||
            driver.notify(message)
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
 
 | 
			
		||||
@@ -31,10 +31,26 @@ from nova import test
 | 
			
		||||
 | 
			
		||||
class NotifierListTestCase(test.TestCase):
 | 
			
		||||
    """Test case for notifications"""
 | 
			
		||||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super(NotifierListTestCase, self).setUp()
 | 
			
		||||
        list_notifier._reset_drivers()
 | 
			
		||||
        self.stubs = stubout.StubOutForTesting()
 | 
			
		||||
        # Mock log to add one to exception_count when log.exception is called
 | 
			
		||||
        def mock_exception(cls, *args):
 | 
			
		||||
            self.exception_count += 1
 | 
			
		||||
        self.exception_count = 0
 | 
			
		||||
        list_notifier_log = logging.getLogger('nova.notifier.list_notifier')
 | 
			
		||||
        self.stubs.Set(list_notifier_log, "exception", mock_exception)
 | 
			
		||||
        # Mock no_op notifier to add one to notify_count when called.
 | 
			
		||||
        def mock_notify(cls, *args):
 | 
			
		||||
            self.notify_count += 1
 | 
			
		||||
        self.notify_count = 0
 | 
			
		||||
        self.stubs.Set(nova.notifier.no_op_notifier, 'notify', mock_notify)
 | 
			
		||||
        # Mock log_notifier to raise RuntimeError when called.
 | 
			
		||||
        def mock_notify2(cls, *args):
 | 
			
		||||
            raise RuntimeError("Bad notifier.")
 | 
			
		||||
        self.stubs.Set(nova.notifier.log_notifier, 'notify', mock_notify2)
 | 
			
		||||
 | 
			
		||||
    def tearDown(self):
 | 
			
		||||
        self.stubs.UnsetAll()
 | 
			
		||||
@@ -45,41 +61,25 @@ class NotifierListTestCase(test.TestCase):
 | 
			
		||||
        self.flags(notification_driver='nova.notifier.list_notifier',
 | 
			
		||||
                   list_notifier_drivers=['nova.notifier.no_op_notifier',
 | 
			
		||||
                                          'nova.notifier.no_op_notifier'])
 | 
			
		||||
        self.notify_count = 0
 | 
			
		||||
 | 
			
		||||
        def mock_notify(cls, *args):
 | 
			
		||||
            self.notify_count += 1
 | 
			
		||||
 | 
			
		||||
        self.stubs.Set(nova.notifier.no_op_notifier, 'notify',
 | 
			
		||||
                mock_notify)
 | 
			
		||||
 | 
			
		||||
        notify('publisher_id', 'event_type',
 | 
			
		||||
                nova.notifier.api.WARN, dict(a=3))
 | 
			
		||||
        self.assertEqual(self.notify_count, 2)
 | 
			
		||||
        self.assertEqual(self.exception_count, 0)
 | 
			
		||||
 | 
			
		||||
    def test_send_notifications_with_errors(self):
 | 
			
		||||
        self.exception_count = 0
 | 
			
		||||
        def mock_exception(cls, *args):
 | 
			
		||||
            self.exception_count += 1
 | 
			
		||||
 | 
			
		||||
        self.notify_count = 0
 | 
			
		||||
        def mock_notify(cls, *args):
 | 
			
		||||
            self.notify_count += 1
 | 
			
		||||
 | 
			
		||||
        def mock_notify2(cls, *args):
 | 
			
		||||
            raise RuntimeError("Bad notifier.")
 | 
			
		||||
 | 
			
		||||
        self.flags(notification_driver='nova.notifier.list_notifier',
 | 
			
		||||
                   list_notifier_drivers=['nova.notifier.no_op_notifier',
 | 
			
		||||
                                          'nova.notifier.log_notifier'])
 | 
			
		||||
 | 
			
		||||
        list_notifier_log = logging.getLogger('nova.notifier.list_notifier')
 | 
			
		||||
        list_notifier_log.exception
 | 
			
		||||
        self.stubs.Set(list_notifier_log, "exception", mock_exception)
 | 
			
		||||
        self.stubs.Set(nova.notifier.no_op_notifier, 'notify', mock_notify)
 | 
			
		||||
        self.stubs.Set(nova.notifier.log_notifier, 'notify', mock_notify2)
 | 
			
		||||
 | 
			
		||||
        notify('publisher_id', 'event_type', nova.notifier.api.WARN, dict(a=3))
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(self.notify_count, 1)
 | 
			
		||||
        self.assertEqual(self.exception_count, 1)
 | 
			
		||||
 | 
			
		||||
    def test_when_driver_fails_to_import(self):
 | 
			
		||||
        self.flags(notification_driver='nova.notifier.list_notifier',
 | 
			
		||||
                   list_notifier_drivers=['nova.notifier.no_op_notifier',
 | 
			
		||||
                                          'nova.notifier.logo_notifier',
 | 
			
		||||
                                          'fdsjgsdfhjkhgsfkj'])
 | 
			
		||||
        notify('publisher_id', 'event_type', nova.notifier.api.WARN, dict(a=3))
 | 
			
		||||
        self.assertEqual(self.exception_count, 2)
 | 
			
		||||
        self.assertEqual(self.notify_count, 1)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user