diff --git a/swiftclient/service.py b/swiftclient/service.py index 99c833e0..7d6f6bef 100644 --- a/swiftclient/service.py +++ b/swiftclient/service.py @@ -883,7 +883,7 @@ class SwiftService(object): @staticmethod def _list_container_job(conn, container, options, result_queue): - marker = '' + marker = options.get('marker', '') error = None try: while True: diff --git a/swiftclient/shell.py b/swiftclient/shell.py index 2c5bca82..c1b893d0 100755 --- a/swiftclient/shell.py +++ b/swiftclient/shell.py @@ -203,7 +203,7 @@ def st_delete(parser, args, output_manager): output_manager.error(err.value) -st_download_options = '''[--all] [--marker] [--prefix <prefix>] +st_download_options = '''[--all] [--marker <marker>] [--prefix <prefix>] [--output <out_file>] [--output-dir <out_directory>] [--object-threads <threads>] [--container-threads <threads>] [--no-download] @@ -225,7 +225,7 @@ Positional arguments: Optional arguments: -a, --all Indicates that you really want to download everything in the account. - -m, --marker Marker to use when starting a container or account + -m, --marker <marker> Marker to use when starting a container or account download. -p, --prefix <prefix> Only download items beginning with <prefix> -r, --remove-prefix An optional flag for --prefix <prefix>, use this diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index e9310aa7..30947807 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -687,6 +687,41 @@ class TestServiceList(_TestServiceBase): self.assertEqual(expected_r_long, self._get_queue(mock_q)) self.assertIsNone(self._get_queue(mock_q)) + def test_list_container_marker(self): + mock_q = Queue() + mock_conn = self._get_mock_connection() + + get_container_returns = [ + (None, [{'name': 'b'}, {'name': 'c'}]), + (None, []) + ] + mock_get_cont = Mock(side_effect=get_container_returns) + mock_conn.get_container = mock_get_cont + + expected_r = self._get_expected({ + 'action': 'list_container_part', + 'container': 'test_c', + 'success': True, + 'listing': [{'name': 'b'}, {'name': 'c'}], + 'marker': 'b' + }) + + _opts = self.opts.copy() + _opts['marker'] = 'b' + SwiftService._list_container_job(mock_conn, 'test_c', _opts, mock_q) + + # This does not test if the marker is propagated, because we always + # get the final call to the get_container with the final item 'c', + # even if marker wasn't set. This test just makes sure the whole + # stack works in a sane way. + mock_kw = mock_get_cont.call_args[1] + self.assertEqual(mock_kw['marker'], 'c') + + # This tests that the lower levels get the marker delivered. + self.assertEqual(expected_r, self._get_queue(mock_q)) + + self.assertIsNone(self._get_queue(mock_q)) + def test_list_container_exception(self): mock_q = Queue() mock_conn = self._get_mock_connection()