Merge "avoid verbose tracebacks on known errors"
This commit is contained in:
commit
f6942cebd4
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user