Merge "avoid verbose tracebacks on known errors"

This commit is contained in:
Zuul 2018-03-11 20:23:50 +00:00 committed by Gerrit Code Review
commit f6942cebd4
5 changed files with 29 additions and 34 deletions

View File

@ -36,7 +36,8 @@ class _Base(plugin_base.PollsterBase):
# Do not load this extension if no NM support
if self.nodemanager.nm_version == 0:
raise plugin_base.ExtensionLoadError()
raise plugin_base.ExtensionLoadError(
"NodeManager not supported on host")
@property
def default_discovery(self):

View File

@ -38,7 +38,8 @@ class SensorPollster(plugin_base.PollsterBase):
# Do not load this extension if no IPMI support
if not self.ipmi.ipmi_support:
raise plugin_base.ExtensionLoadError()
raise plugin_base.ExtensionLoadError(
"IPMITool not supported on host")
@property
def default_discovery(self):

View File

@ -69,13 +69,6 @@ def hash_of_set(s):
return str(hash(frozenset(s)))
class EmptyPollstersList(Exception):
def __init__(self):
msg = ('No valid pollsters can be loaded with the startup parameter'
' polling-namespaces.')
super(EmptyPollstersList, self).__init__(msg)
class PollingException(agent.ConfigException):
def __init__(self, message, cfg):
super(PollingException, self).__init__('Polling', message, cfg)
@ -256,7 +249,8 @@ class AgentManager(cotyledon.Service):
itertools.chain(*list(extensions_fb)))
if self.extensions == []:
raise EmptyPollstersList()
LOG.warning('No valid pollsters can be loaded from %s '
'namespaces', namespaces)
discoveries = (self._extensions('discover', namespace,
self.conf).extensions
@ -292,7 +286,8 @@ class AgentManager(cotyledon.Service):
# Extension raising ExtensionLoadError can be ignored,
# and ignore anything we can't import as a safety measure.
if isinstance(exc, plugin_base.ExtensionLoadError):
LOG.exception("Skip loading extension for %s", ep.name)
LOG.debug("Skip loading extension for %s: %s",
ep.name, exc.msg)
return
show_exception = (LOG.isEnabledFor(logging.DEBUG)

View File

@ -32,7 +32,8 @@ class ExtensionLoadError(Exception):
to setup required HW/SW dependency. Any exception from it would be
propagated as ExtensionLoadError, then skip loading this pollster.
"""
pass
def __init__(self, msg=None):
self.msg = msg
class PollsterPermanentError(Exception):

View File

@ -103,42 +103,39 @@ class TestManager(base.BaseTestCase):
# Skip loading pollster upon ExtensionLoadError
@mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__',
mock.Mock(side_effect=plugin_base.ExtensionLoadError))
@mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__',
mock.Mock(return_value=None))
mock.Mock(side_effect=plugin_base.ExtensionLoadError(
'NodeManager not supported on host')))
@mock.patch('ceilometer.polling.manager.LOG')
def test_load_failed_plugins(self, LOG):
# Here we additionally check that namespaces will be converted to the
# list if param was not set as a list.
try:
manager.AgentManager(0, self.conf,
namespaces='ipmi')
except manager.EmptyPollstersList:
err_msg = 'Skip loading extension for %s'
pollster_names = [
'power', 'temperature', 'outlet_temperature',
'airflow', 'cups', 'cpu_util', 'mem_util', 'io_util']
calls = [mock.call(err_msg, 'hardware.ipmi.node.%s' % n)
for n in pollster_names]
LOG.exception.assert_has_calls(calls=calls, any_order=True)
manager.AgentManager(0, self.conf, namespaces='ipmi')
err_msg = 'Skip loading extension for %s: %s'
pollster_names = [
'power', 'temperature', 'outlet_temperature',
'airflow', 'cups', 'cpu_util', 'mem_util', 'io_util']
calls = [mock.call(err_msg, 'hardware.ipmi.node.%s' % n,
'NodeManager not supported on host')
for n in pollster_names]
LOG.debug.assert_has_calls(calls=calls[:2], any_order=True)
# Skip loading pollster upon ImportError
@mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__',
mock.Mock(side_effect=ImportError))
@mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__',
mock.Mock(return_value=None))
def test_import_error_in_plugin(self):
self.assertRaisesRegex(
manager.EmptyPollstersList,
'No valid pollsters can be loaded with the startup parameter'
' polling-namespaces.',
manager.AgentManager, 0, self.conf, {"namespaces": ['ipmi']})
mock.Mock(side_effect=ImportError))
@mock.patch('ceilometer.polling.manager.LOG')
def test_import_error_in_plugin(self, LOG):
namespaces = ['ipmi']
manager.AgentManager(0, self.conf, namespaces=namespaces)
LOG.warning.assert_called_with(
'No valid pollsters can be loaded from %s namespaces', namespaces)
# Exceptions other than ExtensionLoadError are propagated
@mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__',
mock.Mock(side_effect=PollingException))
@mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__',
mock.Mock(return_value=None))
mock.Mock(side_effect=PollingException))
def test_load_exceptional_plugins(self):
self.assertRaises(PollingException,
manager.AgentManager,