From 3b7888c84a556466ccfcf08f4360203311a46bea Mon Sep 17 00:00:00 2001 From: Fei Long Wang Date: Tue, 8 Sep 2015 15:11:04 +1200 Subject: [PATCH] Fix duplicated queues on multi pools Now we're saving queues on management plane, so it's not necessary to interate all the pools to list queues. This patch fixes the issue and adds a test for that. Closes-Bug: #1490807 Change-Id: I595f240d2944c55c2f4883bbc3070aaf25c19763 --- zaqar/storage/pooling.py | 15 ++++++++------- zaqar/tests/unit/storage/test_pool_catalog.py | 13 +++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/zaqar/storage/pooling.py b/zaqar/storage/pooling.py index 7f007a73b..931deb17d 100644 --- a/zaqar/storage/pooling.py +++ b/zaqar/storage/pooling.py @@ -146,13 +146,14 @@ class QueueController(storage.Queue): def all_pages(): cursor = self._pool_catalog._pools_ctrl.list(limit=0) - for pool in next(cursor): - yield next(self._pool_catalog.get_driver(pool['name']) - .queue_controller.list( - project=project, - marker=marker, - limit=limit, - detailed=detailed)) + pools_list = list(next(cursor)) + anypool = pools_list and pools_list[0] + yield next(self._pool_catalog.get_driver(anypool['name']) + .queue_controller.list( + project=project, + marker=marker, + limit=limit, + detailed=detailed)) # make a heap compared with 'name' ls = heapq.merge(*[ diff --git a/zaqar/tests/unit/storage/test_pool_catalog.py b/zaqar/tests/unit/storage/test_pool_catalog.py index e38768954..6fdcdfbfd 100644 --- a/zaqar/tests/unit/storage/test_pool_catalog.py +++ b/zaqar/tests/unit/storage/test_pool_catalog.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations under # the License. +import mock import uuid from zaqar.openstack.common.cache import cache as oslo_cache @@ -96,3 +97,15 @@ class PoolCatalogTest(testing.TestBase): self.catalog.register, 'test', project=self.project, flavor='fake') + + def test_queues_list_on_multi_pools(self): + def fake_list(project=None, marker=None, limit=10, detailed=False): + yield iter([{'name': 'fake_queue'}]) + + list_str = 'zaqar.storage.mongodb.queues.QueueController.list' + with mock.patch(list_str) as queues_list: + queues_list.side_effect = fake_list + queue_controller = pooling.QueueController(self.catalog) + result = queue_controller.list(project=self.project) + queue_list = list(next(result)) + self.assertEqual(1, len(queue_list))