From c01529fa538d28af3a9f0f7cdc1a96a9df5ed221 Mon Sep 17 00:00:00 2001 From: liyingjun Date: Thu, 7 Aug 2014 06:13:25 +0800 Subject: [PATCH] Add missing all-tenants option to transfer-list cinder transfer-list is missing the --all-tenants option, which makes it inconsistent with 'cinder list'. Without this fix, when running as admin horizon will need to make multiple queries to cinder (one for each tenant present in the volume list) in order to display the transfers that exist for the volumes being shown. Change-Id: Ic4d72a54c450876ff24c64efd83678062c93a24e Closes-bug: 1351084 --- cinderclient/tests/v1/test_shell.py | 8 ++++++++ cinderclient/tests/v2/test_shell.py | 8 ++++++++ cinderclient/v1/shell.py | 21 ++++++++++++++++++++- cinderclient/v1/volume_transfers.py | 26 ++++++++++++++++++++++---- cinderclient/v2/shell.py | 19 ++++++++++++++++++- cinderclient/v2/volume_transfers.py | 26 ++++++++++++++++++++++---- 6 files changed, 98 insertions(+), 10 deletions(-) diff --git a/cinderclient/tests/v1/test_shell.py b/cinderclient/tests/v1/test_shell.py index 031c338d8..0b735ebf1 100644 --- a/cinderclient/tests/v1/test_shell.py +++ b/cinderclient/tests/v1/test_shell.py @@ -400,3 +400,11 @@ class ShellTest(utils.TestCase): def test_snapshot_delete_multiple(self): self.run_command('snapshot-delete 1234 5678') self.assert_called('DELETE', '/snapshots/5678') + + def test_list_transfer(self): + self.run_command('transfer-list') + self.assert_called('GET', '/os-volume-transfer/detail') + + def test_list_transfer_all_tenants(self): + self.run_command('transfer-list --all-tenants=1') + self.assert_called('GET', '/os-volume-transfer/detail?all_tenants=1') diff --git a/cinderclient/tests/v2/test_shell.py b/cinderclient/tests/v2/test_shell.py index 92f6aaa6e..331dce857 100644 --- a/cinderclient/tests/v2/test_shell.py +++ b/cinderclient/tests/v2/test_shell.py @@ -641,3 +641,11 @@ class ShellTest(utils.TestCase): def test_get_pools_detail(self): self.run_command('get-pools --detail') self.assert_called('GET', '/scheduler-stats/get_pools?detail=True') + + def test_list_transfer(self): + self.run_command('transfer-list') + self.assert_called('GET', '/os-volume-transfer/detail') + + def test_list_transfer_all_tenants(self): + self.run_command('transfer-list --all-tenants=1') + self.assert_called('GET', '/os-volume-transfer/detail?all_tenants=1') diff --git a/cinderclient/v1/shell.py b/cinderclient/v1/shell.py index bd442b976..5ba9958f7 100644 --- a/cinderclient/v1/shell.py +++ b/cinderclient/v1/shell.py @@ -979,10 +979,29 @@ def do_transfer_accept(cs, args): utils.print_dict(info) +@utils.arg( + '--all-tenants', + dest='all_tenants', + metavar='<0|1>', + nargs='?', + type=int, + const=1, + default=0, + help='Shows details for all tenants. Admin only.') +@utils.arg( + '--all_tenants', + nargs='?', + type=int, + const=1, + help=argparse.SUPPRESS) @utils.service_type('volume') def do_transfer_list(cs, args): """Lists all transfers.""" - transfers = cs.transfers.list() + all_tenants = int(os.environ.get("ALL_TENANTS", args.all_tenants)) + search_opts = { + 'all_tenants': all_tenants, + } + transfers = cs.transfers.list(search_opts=search_opts) columns = ['ID', 'Volume ID', 'Name'] utils.print_list(transfers, columns) diff --git a/cinderclient/v1/volume_transfers.py b/cinderclient/v1/volume_transfers.py index 00daf3ec5..23317d2cd 100644 --- a/cinderclient/v1/volume_transfers.py +++ b/cinderclient/v1/volume_transfers.py @@ -17,6 +17,11 @@ Volume transfer interface (1.1 extension). """ +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode +import six from cinderclient import base @@ -69,10 +74,23 @@ class VolumeTransferManager(base.ManagerWithFind): :rtype: list of :class:`VolumeTransfer` """ - if detailed is True: - return self._list("/os-volume-transfer/detail", "transfers") - else: - return self._list("/os-volume-transfer", "transfers") + if search_opts is None: + search_opts = {} + + qparams = {} + + for opt, val in six.iteritems(search_opts): + if val: + qparams[opt] = val + + query_string = "?%s" % urlencode(qparams) if qparams else "" + + detail = "" + if detailed: + detail = "/detail" + + return self._list("/os-volume-transfer%s%s" % (detail, query_string), + "transfers") def delete(self, transfer_id): """Delete a volume transfer. diff --git a/cinderclient/v2/shell.py b/cinderclient/v2/shell.py index c656248b8..77d99a5ed 100644 --- a/cinderclient/v2/shell.py +++ b/cinderclient/v2/shell.py @@ -1270,10 +1270,27 @@ def do_transfer_accept(cs, args): utils.print_dict(info) +@utils.arg('--all-tenants', + dest='all_tenants', + metavar='<0|1>', + nargs='?', + type=int, + const=1, + default=0, + help='Shows details for all tenants. Admin only.') +@utils.arg('--all_tenants', + nargs='?', + type=int, + const=1, + help=argparse.SUPPRESS) @utils.service_type('volumev2') def do_transfer_list(cs, args): """Lists all transfers.""" - transfers = cs.transfers.list() + all_tenants = int(os.environ.get("ALL_TENANTS", args.all_tenants)) + search_opts = { + 'all_tenants': all_tenants, + } + transfers = cs.transfers.list(search_opts=search_opts) columns = ['ID', 'Volume ID', 'Name'] utils.print_list(transfers, columns) diff --git a/cinderclient/v2/volume_transfers.py b/cinderclient/v2/volume_transfers.py index 00daf3ec5..23317d2cd 100644 --- a/cinderclient/v2/volume_transfers.py +++ b/cinderclient/v2/volume_transfers.py @@ -17,6 +17,11 @@ Volume transfer interface (1.1 extension). """ +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode +import six from cinderclient import base @@ -69,10 +74,23 @@ class VolumeTransferManager(base.ManagerWithFind): :rtype: list of :class:`VolumeTransfer` """ - if detailed is True: - return self._list("/os-volume-transfer/detail", "transfers") - else: - return self._list("/os-volume-transfer", "transfers") + if search_opts is None: + search_opts = {} + + qparams = {} + + for opt, val in six.iteritems(search_opts): + if val: + qparams[opt] = val + + query_string = "?%s" % urlencode(qparams) if qparams else "" + + detail = "" + if detailed: + detail = "/detail" + + return self._list("/os-volume-transfer%s%s" % (detail, query_string), + "transfers") def delete(self, transfer_id): """Delete a volume transfer.