From 2bc48ff261c5d78a1d3dab884337dc08fc1a4aa4 Mon Sep 17 00:00:00 2001 From: Eoghan Glynn Date: Fri, 8 Aug 2014 18:27:53 +0100 Subject: [PATCH] Avoid duplication of discovery for multi-sink sources Perviously, where a single source has a pluggable discovery extension loaded and is associated with multiple sinks, the discovered resources were duplicated for each sink. Now, we ensure that duplicate discovery extensions are excluded. Change-Id: Icffcc65f2be2baef7730b31773b39ffdda0454a7 Closes-Bug: #1354536 --- ceilometer/agent.py | 4 ++-- ceilometer/tests/agentbase.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ceilometer/agent.py b/ceilometer/agent.py index 750de47d7f..5460e39ac1 100644 --- a/ceilometer/agent.py +++ b/ceilometer/agent.py @@ -37,11 +37,11 @@ class Resources(object): def __init__(self, agent_manager): self.agent_manager = agent_manager self._resources = [] - self._discovery = [] + self._discovery = set([]) def extend(self, pipeline): self._resources.extend(pipeline.resources) - self._discovery.extend(pipeline.discovery) + self._discovery.update(set(pipeline.discovery)) @property def resources(self): diff --git a/ceilometer/tests/agentbase.py b/ceilometer/tests/agentbase.py index 1f04c113b1..d7f1abd6b8 100644 --- a/ceilometer/tests/agentbase.py +++ b/ceilometer/tests/agentbase.py @@ -520,3 +520,27 @@ class BaseAgentManagerTestCase(base.BaseTestCase): self.assertEqual(1, len(self.PollsterAnother.samples)) self.assertEqual(['discovered_3', 'discovered_4'], self.PollsterAnother.resources) + + def test_multiple_sinks_same_discoverer(self): + self.Discovery.resources = ['discovered_1', 'discovered_2'] + sources = [{'name': 'test_source_1', + 'interval': 60, + 'counters': ['test'], + 'discovery': ['testdiscovery'], + 'sinks': ['test_sink_1', 'test_sink_2']}] + sinks = [{'name': 'test_sink_1', + 'transformers': [], + 'publishers': ['test://']}, + {'name': 'test_sink_2', + 'transformers': [], + 'publishers': ['test://']}] + self.pipeline_cfg = {'sources': sources, 'sinks': sinks} + self.mgr.discovery_manager = self.create_discovery_manager() + self.setup_pipeline() + polling_tasks = self.mgr.setup_polling_tasks() + self.assertEqual(1, len(polling_tasks)) + self.assertTrue(60 in polling_tasks.keys()) + self.mgr.interval_task(polling_tasks.get(60)) + self.assertEqual(1, len(self.Pollster.samples)) + self.assertEqual(['discovered_1', 'discovered_2'], + self.Pollster.resources)