From 8962837f880d185dea5d8fabe717a397fb7d7fd1 Mon Sep 17 00:00:00 2001 From: Fei Long Wang Date: Fri, 15 Jan 2016 15:29:27 +1300 Subject: [PATCH] Add Support for subscription list v2 Change-Id: I1ce38e6875034f31fa105b656f74a3ce8a32b4ed --- setup.cfg | 1 + zaqarclient/queues/v2/cli.py | 47 +++++++++++++++++++++++ zaqarclient/queues/v2/client.py | 7 +++- zaqarclient/queues/v2/core.py | 7 +++- zaqarclient/queues/v2/subscription.py | 8 ++-- zaqarclient/tests/queues/subscriptions.py | 33 ++++++++++++++++ 6 files changed, 95 insertions(+), 8 deletions(-) diff --git a/setup.cfg b/setup.cfg index ef450eae..77ce8e2c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -88,6 +88,7 @@ openstack.messaging.v2 = subscription_update = zaqarclient.queues.v2.cli:UpdateSubscription subscription_delete = zaqarclient.queues.v2.cli:DeleteSubscription subscription_show = zaqarclient.queues.v2.cli:ShowSubscription + subscription_list = zaqarclient.queues.v2.cli:ListSubscriptions openstack.cli.extension = messaging = zaqarclient.queues.cli diff --git a/zaqarclient/queues/v2/cli.py b/zaqarclient/queues/v2/cli.py index fa1d7984..ab98bb0b 100644 --- a/zaqarclient/queues/v2/cli.py +++ b/zaqarclient/queues/v2/cli.py @@ -16,6 +16,7 @@ import json import logging from cliff import command +from cliff import lister from cliff import show from openstackclient.common import utils @@ -264,3 +265,49 @@ class ShowSubscription(show.ShowOne): **kwargs) columns = ('ID', 'Subscriber', 'TTL', 'Options') return columns, utils.get_dict_properties(pool_data.__dict__, columns) + + +class ListSubscriptions(lister.Lister): + """List available subscriptions""" + + log = logging.getLogger(__name__ + ".ListSubscriptions") + + def get_parser(self, prog_name): + parser = super(ListSubscriptions, self).get_parser(prog_name) + parser.add_argument( + "queue_name", + metavar="", + help="Name of the queue to subscribe to") + parser.add_argument( + "--marker", + metavar="", + help="Subscription's paging marker, " + "the ID of the last subscription of the previous page") + parser.add_argument( + "--limit", + metavar="", + help="Page size limit, default value is 20") + parser.add_argument( + "--detailed", + type=bool, + default=False, + metavar="", + help="Whether to show subscription metadata") + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + + client = self.app.client_manager.messaging + + kwargs = {'queue_name': parsed_args.queue_name, + 'detailed': parsed_args.detailed} + if parsed_args.marker is not None: + kwargs["marker"] = parsed_args.marker + if parsed_args.limit is not None: + kwargs["limit"] = parsed_args.limit + + data = client.subscriptions(**kwargs) + columns = ('ID', 'Subscriber', 'TTL', 'Options') + return (columns, + (utils.get_item_properties(s, columns) for s in data)) diff --git a/zaqarclient/queues/v2/client.py b/zaqarclient/queues/v2/client.py index bc77b802..391d2f44 100644 --- a/zaqarclient/queues/v2/client.py +++ b/zaqarclient/queues/v2/client.py @@ -60,7 +60,7 @@ class Client(client.Client): return subscription.Subscription(self, queue_name, **kwargs) @decorators.version(min_version=2) - def subscriptions(self, **params): + def subscriptions(self, queue_name, **params): """Gets a list of subscriptions from the server :param params: Filters to use for getting subscriptions @@ -71,7 +71,10 @@ class Client(client.Client): """ req, trans = self._request_and_transport() - subscription_list = core.subscription_list(trans, req, **params) + subscription_list = core.subscription_list(trans, req, queue_name, + **params) + for s in subscription_list['subscriptions']: + s['queue_name'] = queue_name return iterator._Iterator(self, subscription_list, diff --git a/zaqarclient/queues/v2/core.py b/zaqarclient/queues/v2/core.py index 0d496e62..707539fa 100644 --- a/zaqarclient/queues/v2/core.py +++ b/zaqarclient/queues/v2/core.py @@ -199,24 +199,27 @@ def subscription_delete(transport, request, queue_name, subscription_id): transport.send(request) -def subscription_list(transport, request, **kwargs): +def subscription_list(transport, request, queue_name, **kwargs): """Gets a list of subscriptions :param transport: Transport instance to use :type transport: `transport.base.Transport` :param request: Request instance ready to be sent. :type request: `transport.request.Request` + :param queue_name: Queue reference name. + :type queue_name: `six.text_type` :param kwargs: Optional arguments for this operation. - marker: Where to start getting subscriptions from. - limit: Maximum number of subscriptions to get. """ request.operation = 'subscription_list' + request.params['queue_name'] = queue_name request.params.update(kwargs) resp = transport.send(request) if not resp.content: - return {'links': [], 'pools': []} + return {'links': [], 'subscriptions': []} return resp.deserialized_content diff --git a/zaqarclient/queues/v2/subscription.py b/zaqarclient/queues/v2/subscription.py index dbc9a074..2cabe776 100644 --- a/zaqarclient/queues/v2/subscription.py +++ b/zaqarclient/queues/v2/subscription.py @@ -76,9 +76,9 @@ class Subscription(object): def create_object(parent): - return lambda kwargs: Subscription(parent, kwargs["queue_name"], - subscriber=kwargs['subscriber'], - ttl=kwargs['ttl'], - id=kwargs['id'], + return lambda kwargs: Subscription(parent, kwargs.pop("queue_name"), + subscriber=kwargs.pop('subscriber'), + ttl=kwargs.pop('ttl'), + id=kwargs.pop('id'), auto_create=False, **kwargs) diff --git a/zaqarclient/tests/queues/subscriptions.py b/zaqarclient/tests/queues/subscriptions.py index d68a5800..eb6239f4 100644 --- a/zaqarclient/tests/queues/subscriptions.py +++ b/zaqarclient/tests/queues/subscriptions.py @@ -119,6 +119,30 @@ class QueuesV2SubscriptionUnitTest(base.QueuesTestBase): self.assertEqual('http://trigger.me', subscription.subscriber) self.assertEqual(3600, subscription.ttl) + def test_subscription_list(self): + subscription_data = {'subscriptions': + [{'id': '568afabb508f153573f6a56f', + 'subscriber': 'http://trigger.me', + 'ttl': 3600, + 'options': {}}, + {'id': '568afabb508f153573f6a56x', + 'subscriber': 'http://trigger.you', + 'ttl': 7200, + 'options': {}}]} + + with mock.patch.object(self.transport, 'send', + autospec=True) as send_method: + + list_resp = response.Response(None, + json.dumps(subscription_data)) + send_method.side_effect = iter([list_resp]) + + # NOTE(flwang): This will call + # ensure exists in the client instance + # since auto_create's default is True + subscriptions = self.client.subscriptions('beijing') + self.assertEqual(2, len(list(subscriptions))) + class QueuesV2SubscriptionFunctionalTest(base.QueuesTestBase): @@ -169,3 +193,12 @@ class QueuesV2SubscriptionFunctionalTest(base.QueuesTestBase): self.assertEqual('http://trigger.me', subscription_get.subscriber) self.assertEqual(3600, subscription_get.ttl) + + def test_subscription_list(self): + subscriptions = self.client.subscriptions(self.queue_name) + subscriptions = list(subscriptions) + self.assertEqual(2, len(subscriptions)) + + subscriber_list = [s.subscriber for s in subscriptions] + self.assertIn('http://trigger.me', subscriber_list) + self.assertIn('http://trigger.he', subscriber_list)