CLI support for queue existence and metadata operations

This patch extends the queues operation supported by the CLI.
It also renames some of the previously added features to make
them more consistent with their behaviour.

Features added:
- Check queue existence
- Set queue metadata
- Get queue metadata
- Get queue stats

Some examples:
	$ openstack queue exists myqueue
	$ openstack queue set metadata '{"key":"value"}'
	$ openstack queue stats myqueue

The above assumes Keystone is installed and has an endpoint
configured for Zaqar. In order to bypass this in a non-Keystone
based deployment, the user can pass Marconi's url manually:

    $  openstack --os-token test
                 --os-url http://127.0.0.1:8888
		 queue exists myqueue

Partially-Implements: blueprint cli
Co-Author-by: Victoria Martínez de la Cruz <victoria@vmartinezdelacruz.com>
Change-Id: Idcc455a04b12a6e55ed077d221f6d3ca2ef055f8
This commit is contained in:
Jeffrey Zhang 2014-09-12 08:09:27 +08:00
parent 5dca4b0b24
commit e29209ae6c
3 changed files with 159 additions and 23 deletions

View File

@ -42,8 +42,12 @@ zaqarclient.api =
openstack.queuing.v1 = openstack.queuing.v1 =
queue_list = zaqarclient.queues.v1.cli:ListQueues queue_list = zaqarclient.queues.v1.cli:ListQueues
queue_create = zaqarclient.queues.v1.cli:CreateQueues queue_create = zaqarclient.queues.v1.cli:CreateQueue
queue_delete = zaqarclient.queues.v1.cli:DeleteQueues queue_delete = zaqarclient.queues.v1.cli:DeleteQueue
queue_exists = zaqarclient.queues.v1.cli:CheckQueueExistence
queue_set_metadata = zaqarclient.queues.v1.cli:SetQueueMetadata
queue_get_metadata = zaqarclient.queues.v1.cli:GetQueueMetadata
queue_stats = zaqarclient.queues.v1.cli:GetQueueStats
openstack.cli.extension = openstack.cli.extension =
queuing = zaqarclient.queues.cli queuing = zaqarclient.queues.cli

View File

@ -12,8 +12,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import json
import logging import logging
import six
from cliff import command from cliff import command
from cliff import lister from cliff import lister
@ -22,16 +22,16 @@ from cliff import show
from openstackclient.common import utils from openstackclient.common import utils
class CreateQueues(show.ShowOne): class CreateQueue(show.ShowOne):
"""List available queues.""" """Create a queue."""
log = logging.getLogger(__name__ + ".CreateQueues") log = logging.getLogger(__name__ + ".CreateQueue")
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(CreateQueues, self).get_parser(prog_name) parser = super(CreateQueue, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"name", "queue_name",
metavar="<name>", metavar="<queue_name>",
help="Name of the queue") help="Name of the queue")
return parser return parser
@ -40,29 +40,34 @@ class CreateQueues(show.ShowOne):
client = self.app.client_manager.queuing client = self.app.client_manager.queuing
name = parsed_args.name queue_name = parsed_args.queue_name
client.queue(name) data = client.queue(queue_name)
return zip(*sorted(six.iteritems({"name": name}))) columns = ('Name',)
properties = ("_Name",)
return columns, utils.get_item_properties(data, properties)
class DeleteQueues(command.Command): class DeleteQueue(command.Command):
"""List available queues.""" """Delete a queue."""
log = logging.getLogger(__name__ + ".DeleteQueues") log = logging.getLogger(__name__ + ".DeleteQueue")
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(DeleteQueues, self).get_parser(prog_name) parser = super(DeleteQueue, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"name", "queue_name",
metavar="<name>", metavar="<queue_name>",
help="Name of the queue") help="Name of the queue")
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args) self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.queuing client = self.app.client_manager.queuing
client.queue(parsed_args.name).delete()
queue_name = parsed_args.queue_name
client.queue(queue_name).delete()
class ListQueues(lister.Lister): class ListQueues(lister.Lister):
@ -95,6 +100,130 @@ class ListQueues(lister.Lister):
kwargs["limit"] = parsed_args.limit kwargs["limit"] = parsed_args.limit
data = client.queues(**kwargs) data = client.queues(**kwargs)
columns = ["_Name"] columns = ("Name", )
properties = ("_Name",)
return (columns,
(utils.get_item_properties(s, properties) for s in data))
return (columns, (utils.get_item_properties(s, columns) for s in data))
class CheckQueueExistence(show.ShowOne):
"""Check queue existence."""
log = logging.getLogger(__name__ + ".CheckQueueExistence")
def get_parser(self, prog_name):
parser = super(CheckQueueExistence, self).get_parser(prog_name)
parser.add_argument(
"queue_name",
metavar="<queue_name>",
help="Name of the queue")
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.queuing
queue_name = parsed_args.queue_name
queue = client.queue(queue_name, auto_create=False)
columns = ('Exists',)
data = dict(exists=queue.exists())
return columns, utils.get_dict_properties(data, columns)
class SetQueueMetadata(command.Command):
"""Set queue metadata."""
log = logging.getLogger(__name__ + ".SetQueueMetadata")
def get_parser(self, prog_name):
parser = super(SetQueueMetadata, self).get_parser(prog_name)
parser.add_argument(
"queue_name",
metavar="<queue_name>",
help="Name of the queue")
parser.add_argument(
"queue_metadata",
metavar="<queue_metadata>",
help="Queue metadata")
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.queuing
queue_name = parsed_args.queue_name
queue_metadata = parsed_args.queue_metadata
queue_exists = client.queue(queue_name, auto_create=False).exists()
if not queue_exists:
raise RuntimeError("Queue(%s) does not exist." % queue_name)
try:
valid_metadata = json.loads(queue_metadata)
except ValueError:
raise RuntimeError("Queue metadata(%s) is not a valid json." %
queue_metadata)
client.queue(queue_name, auto_create=False).\
metadata(new_meta=valid_metadata)
class GetQueueMetadata(show.ShowOne):
"""Get queue metadata."""
log = logging.getLogger(__name__ + ".GetQueueMetadata")
def get_parser(self, prog_name):
parser = super(GetQueueMetadata, self).get_parser(prog_name)
parser.add_argument(
"queue_name",
metavar="<queue_name>",
help="Name of the queue")
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.queuing
queue_name = parsed_args.queue_name
queue = client.queue(queue_name, auto_create=False)
if not queue.exists():
raise RuntimeError("Queue(%s) does not exist." % queue_name)
columns = ("Metadata",)
data = dict(metadata=queue.metadata())
return columns, utils.get_dict_properties(data, columns)
class GetQueueStats(show.ShowOne):
"""Get queue stats."""
log = logging.getLogger(__name__ + ".GetQueueStats")
def get_parser(self, prog_name):
parser = super(GetQueueStats, self).get_parser(prog_name)
parser.add_argument(
"queue_name",
metavar="<queue_name>",
help="Name of the queue")
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.queuing
queue_name = parsed_args.queue_name
queue = client.queue(queue_name, auto_create=False)
if not queue.exists():
raise RuntimeError('Queue(%s) does not exist.' % queue_name)
columns = ("Stats",)
data = dict(stats=queue.stats)
return columns, utils.get_dict_properties(data, columns)

View File

@ -52,7 +52,8 @@ class Queue(object):
:param new_meta: A dictionary containing :param new_meta: A dictionary containing
an updated metadata object. If present an updated metadata object. If present
the queue metadata will be updated in the queue metadata will be updated in
remote server. remote server. If the new_meta is empty,
the metadata object will be cleared.
:type new_meta: `dict` :type new_meta: `dict`
:param force_reload: Whether to ignored the :param force_reload: Whether to ignored the
cached metadata and reload it from the cached metadata and reload it from the
@ -63,7 +64,9 @@ class Queue(object):
""" """
req, trans = self.client._request_and_transport() req, trans = self.client._request_and_transport()
if new_meta: # NOTE(jeffrey4l): Ensure that metadata is cleared when the new_meta
# is a empty dict.
if new_meta is not None:
core.queue_set_metadata(trans, req, self._name, new_meta) core.queue_set_metadata(trans, req, self._name, new_meta)
self._metadata = new_meta self._metadata = new_meta