summaryrefslogtreecommitdiff
path: root/ceilometer
diff options
context:
space:
mode:
authorPedro Henrique <phpm13@gmail.com>2022-09-05 12:09:19 -0300
committerPedro Henrique <phpm13@gmail.com>2022-09-16 12:53:30 -0300
commit090a0eb6d09d495fdb665aa5d8ab0f8f169f3514 (patch)
tree8f4ae0ccd295baf48361d3349cad75581a050a05 /ceilometer
parent4bcc346164bd70922fdb4c79b1d1be99579f21bc (diff)
downloadceilometer-090a0eb6d09d495fdb665aa5d8ab0f8f169f3514.tar.gz
Add support to namespaces on dynamic pollsters
Problem description =================== The hardcoded pollsters are defined by namespaces, so they are instantied based on the namespaces provided to the 'AgentManager'. The dynamic pollsters, on the other hand, are always instantied, independent of the provided namespaces. Proposal ======== To allow operators to define in which namespaces the dynamic pollster will be deployed, we propose to add a new configuration 'namespaces' in the dynamic pollsters yaml configuration. This configuration will support a single entry or a list of the namespaces that the pollster must be instantiated. Change-Id: I39ba0c3dd312a0601e02f8cfcab7a44e585a8a7f
Diffstat (limited to 'ceilometer')
-rw-r--r--ceilometer/polling/manager.py23
-rw-r--r--ceilometer/tests/unit/polling/test_manager.py70
2 files changed, 91 insertions, 2 deletions
diff --git a/ceilometer/polling/manager.py b/ceilometer/polling/manager.py
index 6b9289d1..717d1426 100644
--- a/ceilometer/polling/manager.py
+++ b/ceilometer/polling/manager.py
@@ -253,7 +253,8 @@ class AgentManager(cotyledon.Service):
for namespace in namespaces)
# Create dynamic pollsters
- extensions_dynamic_pollsters = self.create_dynamic_pollsters()
+ extensions_dynamic_pollsters = self.create_dynamic_pollsters(
+ namespaces)
self.extensions = list(itertools.chain(*list(extensions))) + list(
itertools.chain(*list(extensions_fb))) + list(
@@ -291,15 +292,18 @@ class AgentManager(cotyledon.Service):
self._keystone = None
self._keystone_last_exception = None
- def create_dynamic_pollsters(self):
+ def create_dynamic_pollsters(self, namespaces):
"""Creates dynamic pollsters
This method Creates dynamic pollsters based on configurations placed on
'pollsters_definitions_dirs'
+ :param namespaces: The namespaces we are running on to validate if
+ the pollster should be instantiated or not.
:return: a list with the dynamic pollsters defined by the operator.
"""
+ namespaces_set = set(namespaces)
pollsters_definitions_dirs = self.conf.pollsters_definitions_dirs
if not pollsters_definitions_dirs:
LOG.info("Variable 'pollsters_definitions_dirs' not defined.")
@@ -333,6 +337,21 @@ class AgentManager(cotyledon.Service):
for pollster_cfg in pollsters_cfg:
pollster_name = pollster_cfg['name']
+ pollster_namespaces = pollster_cfg.get(
+ 'namespaces', ['central'])
+ if isinstance(pollster_namespaces, list):
+ pollster_namespaces = set(pollster_namespaces)
+ else:
+ pollster_namespaces = {pollster_namespaces}
+
+ if not bool(namespaces_set & pollster_namespaces):
+ LOG.info("The pollster [%s] is not configured to run in "
+ "these namespaces %s, the configured namespaces "
+ "for this pollster are %s. Therefore, we are "
+ "skipping it.", pollster_name, namespaces_set,
+ pollster_namespaces)
+ continue
+
if pollster_name not in pollsters_definitions:
LOG.info("Loading dynamic pollster [%s] from file [%s].",
pollster_name, pollsters_definitions_file)
diff --git a/ceilometer/tests/unit/polling/test_manager.py b/ceilometer/tests/unit/polling/test_manager.py
index e805b9be..c9a1e1e1 100644
--- a/ceilometer/tests/unit/polling/test_manager.py
+++ b/ceilometer/tests/unit/polling/test_manager.py
@@ -422,6 +422,76 @@ class TestPollingAgent(BaseAgent):
self.assertIn(60, polling_tasks.keys())
self.assertNotIn(10, polling_tasks.keys())
+ @mock.patch('glob.glob')
+ @mock.patch('ceilometer.declarative.load_definitions')
+ def test_setup_polling_dynamic_pollster_namespace(self, load_mock,
+ glob_mock):
+ glob_mock.return_value = ['test.yml']
+ load_mock.return_value = [{
+ 'name': "test.dynamic.pollster",
+ 'namespaces': "dynamic",
+ 'sample_type': 'gauge',
+ 'unit': 'test',
+ 'endpoint_type': 'test',
+ 'url_path': 'test',
+ 'value_attribute': 'test'
+ }, {
+ 'name': "test.compute.central.pollster",
+ 'sample_type': 'gauge',
+ 'namespaces': ["compute", "central"],
+ 'unit': 'test',
+ 'endpoint_type': 'test',
+ 'url_path': 'test',
+ 'value_attribute': 'test'
+ }, {
+ 'name': "test.compute.pollster",
+ 'namespaces': ["compute"],
+ 'sample_type': 'gauge',
+ 'unit': 'test',
+ 'endpoint_type': 'test',
+ 'url_path': 'test',
+ 'value_attribute': 'test'
+ }, {
+ 'name': "test.central.pollster",
+ 'sample_type': 'gauge',
+ 'unit': 'test',
+ 'endpoint_type': 'test',
+ 'url_path': 'test',
+ 'value_attribute': 'test'
+ }]
+ mgr = manager.AgentManager(0, self.CONF, namespaces=['dynamic'])
+ self.assertEqual(len(mgr.extensions), 1)
+ self.assertEqual(
+ mgr.extensions[0].definitions.configurations['name'],
+ 'test.dynamic.pollster')
+
+ mgr = manager.AgentManager(0, self.CONF)
+ self.assertEqual(
+ mgr.extensions[-3].definitions.configurations['name'],
+ 'test.compute.central.pollster')
+ self.assertEqual(
+ mgr.extensions[-2].definitions.configurations['name'],
+ 'test.compute.pollster')
+ self.assertEqual(
+ mgr.extensions[-1].definitions.configurations['name'],
+ 'test.central.pollster')
+
+ mgr = manager.AgentManager(0, self.CONF, namespaces=['compute'])
+ self.assertEqual(
+ mgr.extensions[-2].definitions.configurations['name'],
+ 'test.compute.central.pollster')
+ self.assertEqual(
+ mgr.extensions[-1].definitions.configurations['name'],
+ 'test.compute.pollster')
+
+ mgr = manager.AgentManager(0, self.CONF, ['central'])
+ self.assertEqual(
+ mgr.extensions[-2].definitions.configurations['name'],
+ 'test.compute.central.pollster')
+ self.assertEqual(
+ mgr.extensions[-1].definitions.configurations['name'],
+ 'test.central.pollster')
+
def test_setup_polling_task_same_interval(self):
self.polling_cfg['sources'].append({
'name': 'test_polling_1',