Remove deprecated pollster-list option

Closes-Bug: #1700639
Change-Id: I4d3a404877254748d8c60e80e28a9cdc6a0ecbfc
This commit is contained in:
Julien Danjou 2017-09-25 16:28:17 +01:00
parent ad933a0b63
commit 32c129aabd
6 changed files with 16 additions and 111 deletions

View File

@ -27,10 +27,8 @@ from keystoneauth1 import exceptions as ka_exceptions
from oslo_config import cfg from oslo_config import cfg
from oslo_log import log from oslo_log import log
import oslo_messaging import oslo_messaging
from oslo_utils import fnmatch
from oslo_utils import timeutils from oslo_utils import timeutils
import six import six
from six import moves
from six.moves.urllib import parse as urlparse from six.moves.urllib import parse as urlparse
from stevedore import extension from stevedore import extension
from tooz import coordination from tooz import coordination
@ -72,19 +70,10 @@ POLLING_OPTS = [
] ]
class PollsterListForbidden(Exception):
def __init__(self):
msg = ('It is forbidden to use pollster-list option of polling agent '
'in case of using coordination between multiple agents. Please '
'use either multiple agents being coordinated or polling list '
'option for one polling agent.')
super(PollsterListForbidden, self).__init__(msg)
class EmptyPollstersList(Exception): class EmptyPollstersList(Exception):
def __init__(self): def __init__(self):
msg = ('No valid pollsters can be loaded with the startup parameters' msg = ('No valid pollsters can be loaded with the startup parameter'
' polling-namespaces and pollster-list.') ' polling-namespaces.')
super(EmptyPollstersList, self).__init__(msg) super(EmptyPollstersList, self).__init__(msg)
@ -232,26 +221,14 @@ class PollingTask(object):
class AgentManager(cotyledon.Service): class AgentManager(cotyledon.Service):
def __init__(self, worker_id, conf, namespaces=None, pollster_list=None): def __init__(self, worker_id, conf, namespaces=None):
namespaces = namespaces or ['compute', 'central'] namespaces = namespaces or ['compute', 'central']
pollster_list = pollster_list or []
group_prefix = conf.polling.partitioning_group_prefix group_prefix = conf.polling.partitioning_group_prefix
# features of using coordination and pollster-list are exclusive, and
# cannot be used at one moment to avoid both samples duplication and
# samples being lost
if pollster_list and conf.coordination.backend_url:
raise PollsterListForbidden()
super(AgentManager, self).__init__(worker_id) super(AgentManager, self).__init__(worker_id)
self.conf = conf self.conf = conf
def _match(pollster):
"""Find out if pollster name matches to one of the list."""
return any(fnmatch.fnmatch(pollster.name, pattern) for
pattern in pollster_list)
if type(namespaces) is not list: if type(namespaces) is not list:
namespaces = [namespaces] namespaces = [namespaces]
@ -262,11 +239,6 @@ class AgentManager(cotyledon.Service):
# get the extensions from pollster builder # get the extensions from pollster builder
extensions_fb = (self._extensions_from_builder('poll', namespace) extensions_fb = (self._extensions_from_builder('poll', namespace)
for namespace in namespaces) for namespace in namespaces)
if pollster_list:
extensions = (moves.filter(_match, exts)
for exts in extensions)
extensions_fb = (moves.filter(_match, exts)
for exts in extensions_fb)
self.extensions = list(itertools.chain(*list(extensions))) + list( self.extensions = list(itertools.chain(*list(extensions))) + list(
itertools.chain(*list(extensions_fb))) itertools.chain(*list(extensions_fb)))

View File

@ -66,21 +66,13 @@ CLI_OPTS = [
dest='polling_namespaces', dest='polling_namespaces',
help='Polling namespace(s) to be used while ' help='Polling namespace(s) to be used while '
'resource polling'), 'resource polling'),
MultiChoicesOpt('pollster-list',
default=[],
deprecated_for_removal=True,
dest='pollster_list',
help='List of pollsters (or wildcard templates) to be '
'used while polling. This option is deprecated. '
'Configure pollsters via polling.yaml'),
] ]
def create_polling_service(worker_id, conf): def create_polling_service(worker_id, conf):
return manager.AgentManager(worker_id, return manager.AgentManager(worker_id,
conf, conf,
conf.polling_namespaces, conf.polling_namespaces)
conf.pollster_list)
def main(): def main():

View File

@ -54,45 +54,16 @@ class TestManager(base.BaseTestCase):
mgr = manager.AgentManager(0, self.conf) mgr = manager.AgentManager(0, self.conf)
self.assertIsNotNone(list(mgr.extensions)) self.assertIsNotNone(list(mgr.extensions))
def test_load_plugins_pollster_list(self):
mgr = manager.AgentManager(0, self.conf, pollster_list=['disk.*'])
# currently we do have 28 disk-related pollsters
self.assertEqual(28, len(list(mgr.extensions)))
def test_load_invalid_plugins_pollster_list(self):
# if no valid pollsters have been loaded, the ceilometer
# polling program should exit
self.assertRaisesRegex(
manager.EmptyPollstersList,
'No valid pollsters can be loaded with the startup parameters'
' polling-namespaces and pollster-list.',
manager.AgentManager, 0, self.conf,
pollster_list=['aaa'])
def test_load_plugins_no_intersection(self):
# Let's test nothing will be polled if namespace and pollsters
# list have no intersection.
parameters = dict(namespaces=['compute'],
pollster_list=['storage.*'])
self.assertRaisesRegex(
manager.EmptyPollstersList,
'No valid pollsters can be loaded with the startup parameters'
' polling-namespaces and pollster-list.',
manager.AgentManager, 0, self.conf, parameters)
# Test plugin load behavior based on Node Manager pollsters. # Test plugin load behavior based on Node Manager pollsters.
# pollster_list is just a filter, so sensor pollsters under 'ipmi'
# namespace would be also instanced. Still need mock __init__ for it.
@mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__', @mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__',
mock.Mock(return_value=None)) mock.Mock(return_value=None))
@mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__', @mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__',
mock.Mock(return_value=None)) mock.Mock(return_value=None))
def test_load_normal_plugins(self): def test_load_normal_plugins(self):
mgr = manager.AgentManager(0, self.conf, mgr = manager.AgentManager(0, self.conf,
namespaces=['ipmi'], namespaces=['ipmi'])
pollster_list=['hardware.ipmi.node.*'])
# 8 pollsters for Node Manager # 8 pollsters for Node Manager
self.assertEqual(8, len(mgr.extensions)) self.assertEqual(12, len(mgr.extensions))
# Skip loading pollster upon ExtensionLoadError # Skip loading pollster upon ExtensionLoadError
@mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__', @mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__',
@ -105,8 +76,7 @@ class TestManager(base.BaseTestCase):
# list if param was not set as a list. # list if param was not set as a list.
try: try:
manager.AgentManager(0, self.conf, manager.AgentManager(0, self.conf,
namespaces='ipmi', namespaces='ipmi')
pollster_list=['hardware.ipmi.node.*'])
except manager.EmptyPollstersList: except manager.EmptyPollstersList:
err_msg = 'Skip loading extension for %s' err_msg = 'Skip loading extension for %s'
pollster_names = [ pollster_names = [
@ -122,13 +92,11 @@ class TestManager(base.BaseTestCase):
@mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__', @mock.patch('ceilometer.ipmi.pollsters.sensor.SensorPollster.__init__',
mock.Mock(return_value=None)) mock.Mock(return_value=None))
def test_import_error_in_plugin(self): def test_import_error_in_plugin(self):
parameters = dict(namespaces=['ipmi'],
pollster_list=['hardware.ipmi.node.*'])
self.assertRaisesRegex( self.assertRaisesRegex(
manager.EmptyPollstersList, manager.EmptyPollstersList,
'No valid pollsters can be loaded with the startup parameters' 'No valid pollsters can be loaded with the startup parameter'
' polling-namespaces and pollster-list.', ' polling-namespaces.',
manager.AgentManager, 0, self.conf, parameters) manager.AgentManager, 0, self.conf, {"namespaces": ['ipmi']})
# Exceptions other than ExtensionLoadError are propagated # Exceptions other than ExtensionLoadError are propagated
@mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__', @mock.patch('ceilometer.ipmi.pollsters.node._Base.__init__',
@ -139,16 +107,7 @@ class TestManager(base.BaseTestCase):
self.assertRaises(PollingException, self.assertRaises(PollingException,
manager.AgentManager, manager.AgentManager,
0, self.conf, 0, self.conf,
['ipmi'], ['ipmi'])
['hardware.ipmi.node.*'])
def test_load_plugins_pollster_list_forbidden(self):
self.conf.set_override('backend_url', 'http://',
group='coordination')
self.assertRaises(manager.PollsterListForbidden,
manager.AgentManager,
0, self.conf,
pollster_list=['disk.*'])
def test_builder(self): def test_builder(self):
@staticmethod @staticmethod

View File

@ -344,20 +344,6 @@ Running :command:`ceilometer-agent-ipmi` is exactly the same as:
$ ceilometer-polling --polling-namespaces ipmi $ ceilometer-polling --polling-namespaces ipmi
In addition to loading all the polling plug-ins registered in the
specified namespaces, the ``ceilometer-polling`` agent can also specify the
polling plug-ins to be loaded by using the ``pollster-list`` option:
.. code-block:: console
$ ceilometer-polling --polling-namespaces central \
--pollster-list image image.size storage.*
.. note::
HA deployment is NOT supported if the ``pollster-list`` option is
used.
Compute agent Compute agent
------------- -------------

View File

@ -99,20 +99,12 @@ polling agent start via CLI parameter::
ceilometer-polling --polling-namespaces central compute ceilometer-polling --polling-namespaces central compute
This command will basically make polling agent to load all plugins from the This command will basically make polling agent to load all plugins from the
central and compute namespaces and poll everything it can. If you need to load central and compute namespaces and poll everything it can.
only some of the pollsters, you can use ``pollster-list`` option::
ceilometer-polling --pollster-list image image.size storage.*
If both of these options are passed, the polling agent will load only those If both of these options are passed, the polling agent will load only those
pollsters specified in the pollster list, that can be loaded from the selected pollsters specified in the pollster list, that can be loaded from the selected
namespaces. namespaces.
.. note::
Agents coordination cannot be used in case of pollster-list option usage.
This allows to avoid both samples duplication and their lost.
Notifications Notifications
------------- -------------

View File

@ -0,0 +1,4 @@
---
upgrade:
- |
The deprecated `pollster-list` option has been removed.