From aa2c9628dbd94871936fa6e10107e46691c038e4 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Sat, 3 Nov 2012 18:41:53 -0700 Subject: [PATCH] Add nvp queue support to client This patch adds the nvp_qos_queue commands to the client Implements blueprint nvp-qos-extension-client Change-Id: Ic6d2a13ecb82e7e68b52b3143befb2f34b5e759f --- quantumclient/quantum/v2_0/nvp_qos_queue.py | 90 +++++++++++++++++++ quantumclient/shell.py | 8 ++ quantumclient/tests/unit/test_cli20.py | 2 +- .../tests/unit/test_cli20_nvp_queue.py | 80 +++++++++++++++++ quantumclient/v2_0/client.py | 31 +++++++ 5 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 quantumclient/quantum/v2_0/nvp_qos_queue.py create mode 100644 quantumclient/tests/unit/test_cli20_nvp_queue.py diff --git a/quantumclient/quantum/v2_0/nvp_qos_queue.py b/quantumclient/quantum/v2_0/nvp_qos_queue.py new file mode 100644 index 000000000..040ce161c --- /dev/null +++ b/quantumclient/quantum/v2_0/nvp_qos_queue.py @@ -0,0 +1,90 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2013 Nicira Inc. +# All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging + +from quantumclient.quantum import v2_0 as quantumv20 + + +class ListQoSQueue(quantumv20.ListCommand): + """List queues that belong to a given tenant.""" + + resource = 'qos_queue' + log = logging.getLogger(__name__ + '.ListQoSQueue') + _formatters = {} + list_columns = ['id', 'name', 'min', 'max', + 'qos_marking', 'dscp', 'default'] + + +class ShowQoSQueue(quantumv20.ShowCommand): + """Show information of a given queue.""" + + resource = 'qos_queue' + log = logging.getLogger(__name__ + '.ShowQoSQueue') + allow_names = True + + +class CreateQoSQueue(quantumv20.CreateCommand): + """Create a queue.""" + + resource = 'qos_queue' + log = logging.getLogger(__name__ + '.CreateQoSQueue') + + def add_known_arguments(self, parser): + parser.add_argument( + 'name', metavar='NAME', + help='Name of queue') + parser.add_argument( + '--min', + help='min-rate'), + parser.add_argument( + '--max', + help='max-rate'), + parser.add_argument( + '--qos-marking', + help='qos marking untrusted/trusted'), + parser.add_argument( + '--default', + default=False, + help=('If true all ports created with be the size of this queue' + ' if queue is not specified')), + parser.add_argument( + '--dscp', + help='Differentiated Services Code Point'), + + def args2body(self, parsed_args): + params = {'name': parsed_args.name, + 'default': parsed_args.default} + if parsed_args.min: + params['min'] = parsed_args.min + if parsed_args.max: + params['max'] = parsed_args.max + if parsed_args.qos_marking: + params['qos_marking'] = parsed_args.qos_marking + if parsed_args.dscp: + params['dscp'] = parsed_args.dscp + if parsed_args.tenant_id: + params['tenant_id'] = parsed_args.tenant_id + return {'qos_queue': params} + + +class DeleteQoSQueue(quantumv20.DeleteCommand): + """Delete a given queue.""" + + log = logging.getLogger(__name__ + '.DeleteQoSQueue') + resource = 'qos_queue' + allow_names = True diff --git a/quantumclient/shell.py b/quantumclient/shell.py index e9bbb24ca..8b8ba69d1 100644 --- a/quantumclient/shell.py +++ b/quantumclient/shell.py @@ -191,6 +191,14 @@ COMMAND_V2 = { 'lb-healthmonitor-disassociate': utils.import_class( 'quantumclient.quantum.v2_0.lb.healthmonitor' '.DisassociateHealthMonitor'), + 'queue-create': utils.import_class( + 'quantumclient.quantum.v2_0.nvp_qos_queue.CreateQoSQueue'), + 'queue-delete': utils.import_class( + 'quantumclient.quantum.v2_0.nvp_qos_queue.DeleteQoSQueue'), + 'queue-show': utils.import_class( + 'quantumclient.quantum.v2_0.nvp_qos_queue.ShowQoSQueue'), + 'queue-list': utils.import_class( + 'quantumclient.quantum.v2_0.nvp_qos_queue.ListQoSQueue'), } COMMANDS = {'2.0': COMMAND_V2} diff --git a/quantumclient/tests/unit/test_cli20.py b/quantumclient/tests/unit/test_cli20.py index 1a97eb1b4..1c1dfcad7 100644 --- a/quantumclient/tests/unit/test_cli20.py +++ b/quantumclient/tests/unit/test_cli20.py @@ -141,7 +141,7 @@ class CLITestV20Base(testtools.TestCase): self.mox.StubOutWithMock(self.client.httpclient, "request") cmd.get_client().MultipleTimes().AndReturn(self.client) non_admin_status_resources = ['subnet', 'floatingip', 'security_group', - 'security_group_rule'] + 'security_group_rule', 'qos_queue'] if (resource in non_admin_status_resources): body = {resource: {}, } else: diff --git a/quantumclient/tests/unit/test_cli20_nvp_queue.py b/quantumclient/tests/unit/test_cli20_nvp_queue.py new file mode 100644 index 000000000..96ed11a0d --- /dev/null +++ b/quantumclient/tests/unit/test_cli20_nvp_queue.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2013 Nicira Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import sys + +from quantumclient.quantum.v2_0 import nvp_qos_queue as qos +from quantumclient.tests.unit import test_cli20 + + +class CLITestV20NvpQosQueue(test_cli20.CLITestV20Base): + def test_create_qos_queue(self): + """Create a qos queue.""" + resource = 'qos_queue' + cmd = qos.CreateQoSQueue( + test_cli20.MyApp(sys.stdout), None) + myid = 'myid' + name = 'my_queue' + default = False + args = ['--default', default, name] + position_names = ['name', 'default'] + position_values = [name, default] + self._test_create_resource(resource, cmd, name, myid, args, + position_names, position_values) + + def test_create_qos_queue_all_values(self): + """Create a qos queue.""" + resource = 'qos_queue' + cmd = qos.CreateQoSQueue( + test_cli20.MyApp(sys.stdout), None) + myid = 'myid' + name = 'my_queue' + default = False + min = '10' + max = '40' + qos_marking = 'untrusted' + dscp = '0' + args = ['--default', default, '--min', min, '--max', max, + '--qos-marking', qos_marking, '--dscp', dscp, name] + position_names = ['name', 'default', 'min', 'max', 'qos_marking', + 'dscp'] + position_values = [name, default, min, max, qos_marking, dscp] + self._test_create_resource(resource, cmd, name, myid, args, + position_names, position_values) + + def test_list_qos_queue(self): + resources = "qos_queues" + cmd = qos.ListQoSQueue( + test_cli20.MyApp(sys.stdout), None) + self._test_list_resources(resources, cmd, True) + + def test_show_qos_queue_id(self): + resource = 'qos_queue' + cmd = qos.ShowQoSQueue( + test_cli20.MyApp(sys.stdout), None) + args = ['--fields', 'id', self.test_id] + self._test_show_resource(resource, cmd, self.test_id, + args, ['id']) + + def test_delete_qos_queue(self): + resource = 'qos_queue' + cmd = qos.DeleteQoSQueue( + test_cli20.MyApp(sys.stdout), None) + myid = 'myid' + args = [myid] + self._test_delete_resource(resource, cmd, myid, args) diff --git a/quantumclient/v2_0/client.py b/quantumclient/v2_0/client.py index 202e1a7f2..f6d09be83 100644 --- a/quantumclient/v2_0/client.py +++ b/quantumclient/v2_0/client.py @@ -170,6 +170,8 @@ class Client(object): associate_pool_health_monitors_path = "/lb/pools/%s/health_monitors" disassociate_pool_health_monitors_path = ( "/lb/pools/%(pool)s/health_monitors/%(health_monitor)s") + qos_queues_path = "/qos-queues" + qos_queue_path = "/qos-queues/%s" # API has no way to report plurals, so we have to hard code them EXTED_PLURALS = {'routers': 'router', @@ -673,6 +675,35 @@ class Client(object): {'pool': pool, 'health_monitor': health_monitor}) return self.delete(path) + @APIParamsCall + def create_qos_queue(self, body=None): + """ + Creates a new queue + """ + return self.post(self.qos_queues_path, body=body) + + @APIParamsCall + def list_qos_queues(self, **_params): + """ + Fetches a list of all queues for a tenant + """ + return self.get(self.qos_queues_path, params=_params) + + @APIParamsCall + def show_qos_queue(self, queue, **_params): + """ + Fetches information of a certain queue + """ + return self.get(self.qos_queue_path % (queue), + params=_params) + + @APIParamsCall + def delete_qos_queue(self, queue): + """ + Deletes the specified queue + """ + return self.delete(self.qos_queue_path % (queue)) + def __init__(self, **kwargs): """ Initialize a new client for the Quantum v2.0 API. """ super(Client, self).__init__()