From 1a973235f0ab797c539b30f27723ebab7a905287 Mon Sep 17 00:00:00 2001 From: Dimitri Mazmanov Date: Wed, 11 May 2016 14:03:06 +0200 Subject: [PATCH] Add tenant_id parameter to limits. Cinder API allows specifying tenant_id to get tenant specific resource usage. This was missing in the client. This fix should allow fetching tenant specific resource usage directly from the client. Added tenant argument to the limits CLI. Closes-Bug: #1580562 Change-Id: I3fbd6341f6d018a79e7c343107ac974b6fbb9239 --- cinderclient/tests/unit/v2/test_limits.py | 11 +++++++++-- cinderclient/v3/limits.py | 12 ++++++++++-- cinderclient/v3/shell.py | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/cinderclient/tests/unit/v2/test_limits.py b/cinderclient/tests/unit/v2/test_limits.py index 6c143bf..1bc900f 100644 --- a/cinderclient/tests/unit/v2/test_limits.py +++ b/cinderclient/tests/unit/v2/test_limits.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import ddt import mock from cinderclient.tests.unit import utils @@ -155,8 +156,10 @@ class TestAbsoluteLimit(utils.TestCase): self.assertEqual("", repr(l1)) +@ddt.ddt class TestLimitsManager(utils.TestCase): - def test_get(self): + @ddt.data(None, 'test') + def test_get(self, tenant_id): api = mock.Mock() api.client.get.return_value = ( None, @@ -165,7 +168,11 @@ class TestLimitsManager(utils.TestCase): l1 = limits.AbsoluteLimit("name1", "value1") limitsManager = limits.LimitsManager(api) - lim = limitsManager.get() + lim = limitsManager.get(tenant_id) + query_str = '' + if tenant_id: + query_str = '?tenant_id=%s' % tenant_id + api.client.get.assert_called_once_with('/limits%s' % query_str) self.assertIsInstance(lim, limits.Limits) for l in lim.absolute: diff --git a/cinderclient/v3/limits.py b/cinderclient/v3/limits.py index 512a58d..fa4585e 100644 --- a/cinderclient/v3/limits.py +++ b/cinderclient/v3/limits.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from six.moves.urllib import parse + from cinderclient import base @@ -83,9 +85,15 @@ class LimitsManager(base.Manager): resource_class = Limits - def get(self): + def get(self, tenant_id=None): """Get a specific extension. :rtype: :class:`Limits` """ - return self._get("/limits", "limits") + opts = {} + if tenant_id: + opts['tenant_id'] = tenant_id + + query_string = "?%s" % parse.urlencode(opts) if opts else "" + + return self._get("/limits%s" % query_string, "limits") diff --git a/cinderclient/v3/shell.py b/cinderclient/v3/shell.py index ebd71e6..3532daa 100644 --- a/cinderclient/v3/shell.py +++ b/cinderclient/v3/shell.py @@ -1214,18 +1214,28 @@ def do_quota_class_update(cs, args): _quota_update(cs.quota_classes, args.class_name, args) +@utils.arg('tenant', + metavar='', + nargs='?', + default=None, + help='Display information for a single tenant (Admin only).') @utils.service_type('volumev3') def do_absolute_limits(cs, args): """Lists absolute limits for a user.""" - limits = cs.limits.get().absolute + limits = cs.limits.get(args.tenant).absolute columns = ['Name', 'Value'] utils.print_list(limits, columns) +@utils.arg('tenant', + metavar='', + nargs='?', + default=None, + help='Display information for a single tenant (Admin only).') @utils.service_type('volumev3') def do_rate_limits(cs, args): """Lists rate limits for a user.""" - limits = cs.limits.get().rate + limits = cs.limits.get(args.tenant).rate columns = ['Verb', 'URI', 'Value', 'Remain', 'Unit', 'Next_Available'] utils.print_list(limits, columns)