diff --git a/oslo_config/generator.py b/oslo_config/generator.py index cfdecc83..17977c21 100644 --- a/oslo_config/generator.py +++ b/oslo_config/generator.py @@ -257,12 +257,18 @@ def _list_opts(namespaces): :param namespaces: a list of namespaces registered under 'oslo.config.opts' :returns: a list of (namespace, [(group, [opt_1, opt_2])]) tuples """ - mgr = stevedore.named.NamedExtensionManager('oslo.config.opts', - names=namespaces, - invoke_on_load=True) + mgr = stevedore.named.NamedExtensionManager( + 'oslo.config.opts', + names=namespaces, + on_load_failure_callback=on_load_failure_callback, + invoke_on_load=True) return [(ep.name, ep.obj) for ep in mgr] +def on_load_failure_callback(*args, **kwargs): + raise + + def generate(conf): """Generate a sample config file. diff --git a/oslo_config/tests/test_generator.py b/oslo_config/tests/test_generator.py index 668274c2..5922fb41 100644 --- a/oslo_config/tests/test_generator.py +++ b/oslo_config/tests/test_generator.py @@ -525,9 +525,11 @@ class GeneratorTestCase(base.BaseTestCase): content = open(output_file).read() self.assertEqual(self.expected, content) - named_mgr.assert_called_once_with('oslo.config.opts', - names=namespaces, - invoke_on_load=True) + named_mgr.assert_called_once_with( + 'oslo.config.opts', + names=namespaces, + on_load_failure_callback=generator.on_load_failure_callback, + invoke_on_load=True) log_warning = getattr(self, 'log_warning', None) if log_warning is not None: @@ -536,4 +538,30 @@ class GeneratorTestCase(base.BaseTestCase): self.assertFalse(mock_log.warning.called) +class GeneratorRaiseErrorTestCase(base.BaseTestCase): + + def test_generator_raises_error(self): + """Verifies that errors from extension manager are not suppressed.""" + class FakeException(Exception): + pass + + class FakeEP(object): + + def __init__(self): + self.name = 'callback_is_expected' + self.require = self.resolve + self.load = self.resolve + + def resolve(self, *args, **kwargs): + raise FakeException() + + fake_ep = FakeEP() + self.conf = cfg.ConfigOpts() + self.conf.register_opts(generator._generator_opts) + self.conf.set_default('namespace', fake_ep.name) + fake_eps = mock.Mock(return_value=[fake_ep]) + with mock.patch('pkg_resources.iter_entry_points', fake_eps): + self.assertRaises(FakeException, generator.generate, self.conf) + + GeneratorTestCase.generate_scenarios() diff --git a/tests/test_generator.py b/tests/test_generator.py index e4768672..6717da08 100644 --- a/tests/test_generator.py +++ b/tests/test_generator.py @@ -540,9 +540,11 @@ class GeneratorTestCase(base.BaseTestCase): content = open(output_file).read() self.assertEqual(self.expected, content) - named_mgr.assert_called_once_with('oslo.config.opts', - names=namespaces, - invoke_on_load=True) + named_mgr.assert_called_once_with( + 'oslo.config.opts', + names=namespaces, + on_load_failure_callback=generator.on_load_failure_callback, + invoke_on_load=True) log_warning = getattr(self, 'log_warning', None) if log_warning is not None: