Merge "Drop support for --sort_key and --sort_dir"
This commit is contained in:
		| @@ -131,8 +131,7 @@ class Manager(common_base.HookableMixin): | ||||
|             return common_base.ListWithMeta(items, resp) | ||||
|  | ||||
|     def _build_list_url(self, resource_type, detailed=True, search_opts=None, | ||||
|                         marker=None, limit=None, sort_key=None, sort_dir=None, | ||||
|                         sort=None, offset=None): | ||||
|                         marker=None, limit=None, sort=None, offset=None): | ||||
|  | ||||
|         if search_opts is None: | ||||
|             search_opts = {} | ||||
| @@ -151,16 +150,6 @@ class Manager(common_base.HookableMixin): | ||||
|         if sort: | ||||
|             query_params['sort'] = self._format_sort_param(sort, | ||||
|                                                            resource_type) | ||||
|         else: | ||||
|             # sort_key and sort_dir deprecated in kilo, prefer sort | ||||
|             if sort_key: | ||||
|                 query_params['sort_key'] = self._format_sort_key_param( | ||||
|                     sort_key, | ||||
|                     resource_type) | ||||
|  | ||||
|             if sort_dir: | ||||
|                 query_params['sort_dir'] = self._format_sort_dir_param( | ||||
|                     sort_dir) | ||||
|  | ||||
|         if offset: | ||||
|             query_params['offset'] = offset | ||||
| @@ -179,7 +168,7 @@ class Manager(common_base.HookableMixin): | ||||
|                  "query_string": query_string}) | ||||
|  | ||||
|     def _format_sort_param(self, sort, resource_type=None): | ||||
|         '''Formats the sort information into the sort query string parameter. | ||||
|         """Formats the sort information into the sort query string parameter. | ||||
|  | ||||
|         The input sort information can be any of the following: | ||||
|         - Comma-separated string in the form of <key[:dir]> | ||||
| @@ -195,7 +184,7 @@ class Manager(common_base.HookableMixin): | ||||
|         :returns: Formatted query string parameter or None | ||||
|         :raise ValueError: If an invalid sort direction or invalid sort key is | ||||
|                            given | ||||
|         ''' | ||||
|         """ | ||||
|         if not sort: | ||||
|             return None | ||||
|  | ||||
| @@ -205,11 +194,7 @@ class Manager(common_base.HookableMixin): | ||||
|  | ||||
|         sort_array = [] | ||||
|         for sort_item in sort: | ||||
|             if isinstance(sort_item, tuple): | ||||
|                 sort_key = sort_item[0] | ||||
|                 sort_dir = sort_item[1] | ||||
|             else: | ||||
|                 sort_key, _sep, sort_dir = sort_item.partition(':') | ||||
|             sort_key, _sep, sort_dir = sort_item.partition(':') | ||||
|             sort_key = sort_key.strip() | ||||
|             sort_key = self._format_sort_key_param(sort_key, resource_type) | ||||
|             if sort_dir: | ||||
| @@ -237,14 +222,6 @@ class Manager(common_base.HookableMixin): | ||||
|                ', '.join(valid_sort_keys)) | ||||
|         raise ValueError(msg) | ||||
|  | ||||
|     def _format_sort_dir_param(self, sort_dir): | ||||
|         if sort_dir in SORT_DIR_VALUES: | ||||
|             return sort_dir | ||||
|  | ||||
|         msg = ('sort_dir must be one of the following: %s.' | ||||
|                % ', '.join(SORT_DIR_VALUES)) | ||||
|         raise ValueError(msg) | ||||
|  | ||||
|     @contextlib.contextmanager | ||||
|     def completion_cache(self, cache_type, obj_class, mode): | ||||
|         """ | ||||
|   | ||||
| @@ -219,37 +219,11 @@ class ShellTest(utils.TestCase): | ||||
|         mock_print.assert_called_once_with(mock.ANY, key_list, | ||||
|             exclude_unavailable=True, sortby_index=0) | ||||
|  | ||||
|     def test_list_sort_valid(self): | ||||
|         self.run_command('list --sort_key=id --sort_dir=asc') | ||||
|         self.assert_called('GET', '/volumes/detail?sort_dir=asc&sort_key=id') | ||||
|  | ||||
|     def test_list_sort_key_name(self): | ||||
|         # Client 'name' key is mapped to 'display_name' | ||||
|         self.run_command('list --sort_key=name') | ||||
|         self.assert_called('GET', '/volumes/detail?sort_key=display_name') | ||||
|  | ||||
|     def test_list_sort_name(self): | ||||
|         # Client 'name' key is mapped to 'display_name' | ||||
|         self.run_command('list --sort=name') | ||||
|         self.assert_called('GET', '/volumes/detail?sort=display_name') | ||||
|  | ||||
|     def test_list_sort_key_invalid(self): | ||||
|         self.assertRaises(ValueError, | ||||
|                           self.run_command, | ||||
|                           'list --sort_key=foo --sort_dir=asc') | ||||
|  | ||||
|     def test_list_sort_dir_invalid(self): | ||||
|         self.assertRaises(ValueError, | ||||
|                           self.run_command, | ||||
|                           'list --sort_key=id --sort_dir=foo') | ||||
|  | ||||
|     def test_list_mix_sort_args(self): | ||||
|         cmds = ['list --sort name:desc --sort_key=status', | ||||
|                 'list --sort name:desc --sort_dir=asc', | ||||
|                 'list --sort name:desc --sort_key=status --sort_dir=asc'] | ||||
|         for cmd in cmds: | ||||
|             self.assertRaises(exceptions.CommandError, self.run_command, cmd) | ||||
|  | ||||
|     def test_list_sort_single_key_only(self): | ||||
|         self.run_command('list --sort=id') | ||||
|         self.assert_called('GET', '/volumes/detail?sort=id') | ||||
| @@ -277,10 +251,7 @@ class ShellTest(utils.TestCase): | ||||
|  | ||||
|     def test_list_reorder_with_sort(self): | ||||
|         # sortby_index is None if there is sort information | ||||
|         for cmd in ['list --sort_key=name', | ||||
|                     'list --sort_dir=asc', | ||||
|                     'list --sort_key=name --sort_dir=asc', | ||||
|                     'list --sort=name', | ||||
|         for cmd in ['list --sort=name', | ||||
|                     'list --sort=name:asc']: | ||||
|             with mock.patch('cinderclient.utils.print_list') as mock_print: | ||||
|                 self.run_command(cmd) | ||||
|   | ||||
| @@ -29,19 +29,6 @@ class VolumesTest(utils.TestCase): | ||||
|         cs.assert_called('GET', '/volumes/detail?limit=2&marker=1234') | ||||
|         self._assert_request_id(lst) | ||||
|  | ||||
|     def test_list_volumes_with_sort_key_dir(self): | ||||
|         lst = cs.volumes.list(sort_key='id', sort_dir='asc') | ||||
|         cs.assert_called('GET', '/volumes/detail?sort_dir=asc&sort_key=id') | ||||
|         self._assert_request_id(lst) | ||||
|  | ||||
|     def test_list_volumes_with_invalid_sort_key(self): | ||||
|         self.assertRaises(ValueError, | ||||
|                           cs.volumes.list, sort_key='invalid', sort_dir='asc') | ||||
|  | ||||
|     def test_list_volumes_with_invalid_sort_dir(self): | ||||
|         self.assertRaises(ValueError, | ||||
|                           cs.volumes.list, sort_key='id', sort_dir='invalid') | ||||
|  | ||||
|     def test__list(self): | ||||
|         # There only 2 volumes available for our tests, so we set limit to 2. | ||||
|         limit = 2 | ||||
| @@ -345,21 +332,10 @@ class FormatSortParamTestCase(utils.TestCase): | ||||
|         self.assertEqual('id:asc,status,size:desc', | ||||
|                          cs.volumes._format_sort_param(s)) | ||||
|  | ||||
|     def test_format_sort_list_of_tuples(self): | ||||
|         s = [('id', 'asc'), 'status', ('size', 'desc')] | ||||
|         self.assertEqual('id:asc,status,size:desc', | ||||
|                          cs.volumes._format_sort_param(s)) | ||||
|  | ||||
|     def test_format_sort_list_of_strings_and_tuples(self): | ||||
|         s = [('id', 'asc'), 'status', 'size:desc'] | ||||
|         self.assertEqual('id:asc,status,size:desc', | ||||
|                          cs.volumes._format_sort_param(s)) | ||||
|  | ||||
|     def test_format_sort_invalid_direction(self): | ||||
|         for s in ['id:foo', | ||||
|                   'id:asc,status,size:foo', | ||||
|                   ['id', 'status', 'size:foo'], | ||||
|                   ['id', 'status', ('size', 'foo')]]: | ||||
|                   ['id', 'status', 'size:foo']]: | ||||
|             self.assertRaises(ValueError, | ||||
|                               cs.volumes._format_sort_param, | ||||
|                               s) | ||||
|   | ||||
| @@ -1438,21 +1438,6 @@ class ShellTest(utils.TestCase): | ||||
|                                  }} | ||||
|         self.assert_called('POST', '/volume-transfers', body=expected) | ||||
|  | ||||
|     def test_list_transfer_sort_key(self): | ||||
|         self.run_command( | ||||
|             '--os-volume-api-version 3.59 transfer-list --sort=id') | ||||
|         url = ('/volume-transfers/detail?%s' % | ||||
|                parse.urlencode([('sort_key', 'id')])) | ||||
|         self.assert_called('GET', url) | ||||
|  | ||||
|     def test_list_transfer_sort_key_dir(self): | ||||
|         self.run_command( | ||||
|             '--os-volume-api-version 3.59 transfer-list --sort=id:asc') | ||||
|         url = ('/volume-transfers/detail?%s' % | ||||
|                parse.urlencode([('sort_dir', 'asc'), | ||||
|                                 ('sort_key', 'id')])) | ||||
|         self.assert_called('GET', url) | ||||
|  | ||||
|     def test_list_transfer_sorty_not_sorty(self): | ||||
|         self.run_command( | ||||
|             '--os-volume-api-version 3.59 transfer-list') | ||||
|   | ||||
| @@ -100,14 +100,6 @@ def _translate_attachments(info): | ||||
|                 'Use the show command to see which fields are available. ' | ||||
|                 'Unavailable/non-existent fields will be ignored. ' | ||||
|                 'Default=None.') | ||||
| @utils.arg('--sort_key', | ||||
|            metavar='<sort_key>', | ||||
|            default=None, | ||||
|            help=argparse.SUPPRESS) | ||||
| @utils.arg('--sort_dir', | ||||
|            metavar='<sort_dir>', | ||||
|            default=None, | ||||
|            help=argparse.SUPPRESS) | ||||
| @utils.arg('--sort', | ||||
|            metavar='<key>[:<direction>]', | ||||
|            default=None, | ||||
| @@ -147,16 +139,8 @@ def do_list(cs, args): | ||||
|         for field_title in args.fields.split(','): | ||||
|             field_titles.append(field_title) | ||||
|  | ||||
|     # --sort_key and --sort_dir deprecated in kilo and is not supported | ||||
|     # with --sort | ||||
|     if args.sort and (args.sort_key or args.sort_dir): | ||||
|         raise exceptions.CommandError( | ||||
|             'The --sort_key and --sort_dir arguments are deprecated and are ' | ||||
|             'not supported with --sort.') | ||||
|  | ||||
|     volumes = cs.volumes.list(search_opts=search_opts, marker=args.marker, | ||||
|                               limit=args.limit, sort_key=args.sort_key, | ||||
|                               sort_dir=args.sort_dir, sort=args.sort) | ||||
|                               limit=args.limit, sort=args.sort) | ||||
|     shell_utils.translate_volume_keys(volumes) | ||||
|  | ||||
|     # Create a list of servers to which the volume is attached | ||||
| @@ -178,7 +162,7 @@ def do_list(cs, args): | ||||
|         if search_opts['all_tenants']: | ||||
|             key_list.insert(1, 'Tenant ID') | ||||
|  | ||||
|     if args.sort_key or args.sort_dir or args.sort: | ||||
|     if args.sort: | ||||
|         sortby_index = None | ||||
|     else: | ||||
|         sortby_index = 0 | ||||
|   | ||||
| @@ -281,7 +281,7 @@ class VolumeManager(base.ManagerWithFind): | ||||
|         return self._get("/volumes/%s" % volume_id, "volume") | ||||
|  | ||||
|     def list(self, detailed=True, search_opts=None, marker=None, limit=None, | ||||
|              sort_key=None, sort_dir=None, sort=None): | ||||
|              sort=None): | ||||
|         """Lists all volumes. | ||||
|  | ||||
|         :param detailed: Whether to return detailed volume info. | ||||
| @@ -289,9 +289,6 @@ class VolumeManager(base.ManagerWithFind): | ||||
|         :param marker: Begin returning volumes that appear later in the volume | ||||
|                        list than that represented by this volume id. | ||||
|         :param limit: Maximum number of volumes to return. | ||||
|         :param sort_key: Key to be sorted; deprecated in kilo | ||||
|         :param sort_dir: Sort direction, should be 'desc' or 'asc'; deprecated | ||||
|                          in kilo | ||||
|         :param sort: Sort information | ||||
|         :rtype: list of :class:`Volume` | ||||
|         """ | ||||
| @@ -299,8 +296,7 @@ class VolumeManager(base.ManagerWithFind): | ||||
|         resource_type = "volumes" | ||||
|         url = self._build_list_url(resource_type, detailed=detailed, | ||||
|                                    search_opts=search_opts, marker=marker, | ||||
|                                    limit=limit, sort_key=sort_key, | ||||
|                                    sort_dir=sort_dir, sort=sort) | ||||
|                                    limit=limit, sort=sort) | ||||
|         return self._list(url, resource_type, limit=limit) | ||||
|  | ||||
|     def delete(self, volume, cascade=False): | ||||
|   | ||||
| @@ -45,7 +45,7 @@ class VolumeAttachmentManager(base.ManagerWithFind): | ||||
|  | ||||
|     @api_versions.wraps('3.27') | ||||
|     def list(self, detailed=False, search_opts=None, marker=None, limit=None, | ||||
|              sort_key=None, sort_dir=None, sort=None): | ||||
|              sort=None): | ||||
|         """List all attachments.""" | ||||
|         resource_type = "attachments" | ||||
|         url = self._build_list_url(resource_type, | ||||
| @@ -53,8 +53,7 @@ class VolumeAttachmentManager(base.ManagerWithFind): | ||||
|                                    search_opts=search_opts, | ||||
|                                    marker=marker, | ||||
|                                    limit=limit, | ||||
|                                    sort_key=sort_key, | ||||
|                                    sort_dir=sort_dir, sort=sort) | ||||
|                                    sort=sort) | ||||
|         return self._list(url, resource_type, limit=limit) | ||||
|  | ||||
|     @api_versions.wraps('3.27') | ||||
|   | ||||
| @@ -337,14 +337,6 @@ RESET_STATE_RESOURCES = {'volume': utils.find_volume, | ||||
|                 'Use the show command to see which fields are available. ' | ||||
|                 'Unavailable/non-existent fields will be ignored. ' | ||||
|                 'Default=None.') | ||||
| @utils.arg('--sort_key', | ||||
|            metavar='<sort_key>', | ||||
|            default=None, | ||||
|            help=argparse.SUPPRESS) | ||||
| @utils.arg('--sort_dir', | ||||
|            metavar='<sort_dir>', | ||||
|            default=None, | ||||
|            help=argparse.SUPPRESS) | ||||
| @utils.arg('--sort', | ||||
|            metavar='<key>[:<direction>]', | ||||
|            default=None, | ||||
| @@ -412,24 +404,15 @@ def do_list(cs, args): | ||||
|         for field_title in args.fields.split(','): | ||||
|             field_titles.append(field_title) | ||||
|  | ||||
|     # --sort_key and --sort_dir deprecated in kilo and is not supported | ||||
|     # with --sort | ||||
|     if args.sort and (args.sort_key or args.sort_dir): | ||||
|         raise exceptions.CommandError( | ||||
|             'The --sort_key and --sort_dir arguments are deprecated and are ' | ||||
|             'not supported with --sort.') | ||||
|  | ||||
|     total_count = 0 | ||||
|     if show_count: | ||||
|         search_opts['with_count'] = args.with_count | ||||
|         volumes, total_count = cs.volumes.list( | ||||
|             search_opts=search_opts, marker=args.marker, | ||||
|             limit=args.limit, sort_key=args.sort_key, | ||||
|             sort_dir=args.sort_dir, sort=args.sort) | ||||
|             limit=args.limit, sort=args.sort) | ||||
|     else: | ||||
|         volumes = cs.volumes.list(search_opts=search_opts, marker=args.marker, | ||||
|                                   limit=args.limit, sort_key=args.sort_key, | ||||
|                                   sort_dir=args.sort_dir, sort=args.sort) | ||||
|                                   limit=args.limit, sort=args.sort) | ||||
|     shell_utils.translate_volume_keys(volumes) | ||||
|  | ||||
|     # Create a list of servers to which the volume is attached | ||||
| @@ -465,7 +448,7 @@ def do_list(cs, args): | ||||
|         if search_opts['all_tenants']: | ||||
|             key_list.insert(1, 'Tenant ID') | ||||
|  | ||||
|     if args.sort_key or args.sort_dir or args.sort: | ||||
|     if args.sort: | ||||
|         sortby_index = None | ||||
|     else: | ||||
|         sortby_index = 0 | ||||
| @@ -2591,25 +2574,13 @@ def do_transfer_list(cs, args): | ||||
|     } | ||||
|  | ||||
|     sort = getattr(args, 'sort', None) | ||||
|     sort_key = None | ||||
|     sort_dir = None | ||||
|     if sort: | ||||
|         # We added this feature with sort_key and sort_dir, but that was a | ||||
|         # mistake as we've deprecated that construct a long time ago and should | ||||
|         # be removing it in favor of --sort. Too late for the service side, but | ||||
|         # to make the client experience consistent, we handle the compatibility | ||||
|         # here. | ||||
|         sort_args = sort.split(':') | ||||
|         if len(sort_args) > 2: | ||||
|             raise exceptions.CommandError( | ||||
|                 'Invalid sort parameter provided. Argument must be in the ' | ||||
|                 'form "key[:<asc|desc>]".') | ||||
|  | ||||
|         sort_key = sort_args[0] | ||||
|         if len(sort_args) == 2: | ||||
|             sort_dir = sort_args[1] | ||||
|  | ||||
|     transfers = cs.transfers.list( | ||||
|         search_opts=search_opts, sort_key=sort_key, sort_dir=sort_dir) | ||||
|     transfers = cs.transfers.list(search_opts=search_opts, sort=sort) | ||||
|     columns = ['ID', 'Volume ID', 'Name'] | ||||
|     utils.print_list(transfers, columns) | ||||
|   | ||||
| @@ -62,14 +62,12 @@ class VolumeTransferManager(volume_transfers.VolumeTransferManager): | ||||
|  | ||||
|         return self._get("/os-volume-transfer/%s" % transfer_id, "transfer") | ||||
|  | ||||
|     def list(self, detailed=True, search_opts=None, sort_key=None, | ||||
|              sort_dir=None): | ||||
|     def list(self, detailed=True, search_opts=None, sort=None): | ||||
|         """Get a list of all volume transfer. | ||||
|  | ||||
|         :param detailed: Get detailed object information. | ||||
|         :param search_opts: Filtering options. | ||||
|         :param sort_key: Optional key to sort on. | ||||
|         :param sort_dir: Optional direction to sort. | ||||
|         :param sort: Sort information | ||||
|         :rtype: list of :class:`VolumeTransfer` | ||||
|         """ | ||||
|         resource_type = 'os-volume-transfer' | ||||
| @@ -78,7 +76,7 @@ class VolumeTransferManager(volume_transfers.VolumeTransferManager): | ||||
|  | ||||
|         url = self._build_list_url(resource_type, detailed=detailed, | ||||
|                                    search_opts=search_opts, | ||||
|                                    sort_key=sort_key, sort_dir=sort_dir) | ||||
|                                    sort=sort) | ||||
|         return self._list(url, 'transfers') | ||||
|  | ||||
|     def delete(self, transfer_id): | ||||
|   | ||||
| @@ -26,3 +26,6 @@ upgrade: | ||||
|     The deprecated volume create option ``--allow-multiattach`` has now been | ||||
|     removed. Multiattach capability is now controlled using `volume-type extra | ||||
|     specs <https://docs.openstack.org/cinder/latest/admin/blockstorage-volume-multiattach.html>`_. | ||||
|   - | | ||||
|     Support for the deprecated ``--sort_key`` and ``--sort_dir`` arguments have | ||||
|     now been dropped. Use the supported ``--sort`` argument instead. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zuul
					Zuul