diff --git a/setup.cfg b/setup.cfg index 0f0f36b1..6359f55b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,8 +42,12 @@ zaqarclient.api = openstack.queuing.v1 = queue_list = zaqarclient.queues.v1.cli:ListQueues - queue_create = zaqarclient.queues.v1.cli:CreateQueues - queue_delete = zaqarclient.queues.v1.cli:DeleteQueues + queue_create = zaqarclient.queues.v1.cli:CreateQueue + 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 = queuing = zaqarclient.queues.cli diff --git a/zaqarclient/queues/v1/cli.py b/zaqarclient/queues/v1/cli.py index 67cf0efb..e450b040 100644 --- a/zaqarclient/queues/v1/cli.py +++ b/zaqarclient/queues/v1/cli.py @@ -12,8 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. +import json import logging -import six from cliff import command from cliff import lister @@ -22,16 +22,16 @@ from cliff import show from openstackclient.common import utils -class CreateQueues(show.ShowOne): - """List available queues.""" +class CreateQueue(show.ShowOne): + """Create a queue.""" - log = logging.getLogger(__name__ + ".CreateQueues") + log = logging.getLogger(__name__ + ".CreateQueue") 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( - "name", - metavar="", + "queue_name", + metavar="", help="Name of the queue") return parser @@ -40,29 +40,34 @@ class CreateQueues(show.ShowOne): client = self.app.client_manager.queuing - name = parsed_args.name - client.queue(name) + queue_name = parsed_args.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): - """List available queues.""" +class DeleteQueue(command.Command): + """Delete a queue.""" - log = logging.getLogger(__name__ + ".DeleteQueues") + log = logging.getLogger(__name__ + ".DeleteQueue") 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( - "name", - metavar="", + "queue_name", + metavar="", 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 - client.queue(parsed_args.name).delete() + + queue_name = parsed_args.queue_name + + client.queue(queue_name).delete() class ListQueues(lister.Lister): @@ -95,6 +100,130 @@ class ListQueues(lister.Lister): kwargs["limit"] = parsed_args.limit 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="", + 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="", + help="Name of the queue") + parser.add_argument( + "queue_metadata", + metavar="", + 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="", + 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="", + 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) diff --git a/zaqarclient/queues/v1/queues.py b/zaqarclient/queues/v1/queues.py index a4d00f77..565d2fbb 100644 --- a/zaqarclient/queues/v1/queues.py +++ b/zaqarclient/queues/v1/queues.py @@ -52,7 +52,8 @@ class Queue(object): :param new_meta: A dictionary containing an updated metadata object. If present 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` :param force_reload: Whether to ignored the cached metadata and reload it from the @@ -63,7 +64,9 @@ class Queue(object): """ 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) self._metadata = new_meta