Add Support for subscription list v2

Change-Id: I1ce38e6875034f31fa105b656f74a3ce8a32b4ed
This commit is contained in:
Fei Long Wang 2016-01-15 15:29:27 +13:00
parent f933dc8131
commit 8962837f88
6 changed files with 95 additions and 8 deletions

View File

@ -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

View File

@ -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="<queue_name>",
help="Name of the queue to subscribe to")
parser.add_argument(
"--marker",
metavar="<subscription_id>",
help="Subscription's paging marker, "
"the ID of the last subscription of the previous page")
parser.add_argument(
"--limit",
metavar="<limit>",
help="Page size limit, default value is 20")
parser.add_argument(
"--detailed",
type=bool,
default=False,
metavar="<detailed>",
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))

View File

@ -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,

View File

@ -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

View File

@ -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)

View File

@ -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)