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:
parent
0abac48813
commit
b392cf1891
@ -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.
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user