Add exception handling for entry points

oslo-config-generator is used to generate config sample iterating all
entry points provided to it.
But if some error appears, return code will be absent.
It is critical to have it running in CI.
So, add new func that will be used for error handling and provide it
to stevedore that suppresses all errors by default.

Change-Id: Ia78cc0d4e8ab842cd0e279713badd68606a67a58
Closes-Bug: #1419458
This commit is contained in:
vponomaryov 2015-02-24 09:11:31 +02:00
parent 0abac48813
commit b392cf1891
3 changed files with 45 additions and 9 deletions

View File

@ -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.

View File

@ -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()

View File

@ -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: