diff --git a/doc/source/command-objects/image.rst b/doc/source/command-objects/image.rst index 94745e06c8..61872ec404 100644 --- a/doc/source/command-objects/image.rst +++ b/doc/source/command-objects/image.rst @@ -168,6 +168,7 @@ List available images [--long] [--sort [:]] [--limit ] + [--marker ] .. option:: --public @@ -200,6 +201,11 @@ List available images Maximum number of images to display. +.. option:: --marker + + The last image (name or ID) of the previous page. Display list of images + after marker. Display all images if not specified. + image save ---------- diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 67d0e7f31d..3f1621814c 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -437,6 +437,14 @@ class ListImage(command.Lister): type=int, help="Maximum number of images to display.", ) + parser.add_argument( + '--marker', + metavar='', + default=None, + help="The last image (name or ID) of the previous page. Display " + "list of images after marker. Display all images if not " + "specified." + ) return parser def take_action(self, parsed_args): @@ -451,6 +459,9 @@ class ListImage(command.Lister): kwargs['shared'] = True if parsed_args.limit: kwargs['limit'] = parsed_args.limit + if parsed_args.marker: + kwargs['marker'] = utils.find_resource(image_client.images, + parsed_args.marker).id if parsed_args.long: columns = ( diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py index 3e31d0ad62..d399c9eda9 100644 --- a/openstackclient/tests/image/v2/test_image.py +++ b/openstackclient/tests/image/v2/test_image.py @@ -672,6 +672,27 @@ class TestImageList(TestImage): self.assertEqual(self.columns, columns) self.assertEqual(len(self.datalist), len(tuple(data))) + @mock.patch('openstackclient.common.utils.find_resource') + def test_image_list_marker_option(self, fr_mock): + # tangchen: Since image_fakes.IMAGE is a dict, it cannot offer a .id + # operation. Will fix this by using FakeImage class instead + # of IMAGE dict. + fr_mock.return_value = mock.Mock() + fr_mock.return_value.id = image_fakes.image_id + + arglist = [ + '--marker', image_fakes.image_name, + ] + verifylist = [ + ('marker', image_fakes.image_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.api_mock.image_list.assert_called_with( + marker=image_fakes.image_id, + ) + class TestRemoveProjectImage(TestImage): diff --git a/releasenotes/notes/bug-1540988-17841cfd5accf7f5.yaml b/releasenotes/notes/bug-1540988-17841cfd5accf7f5.yaml index 56b502eb5b..eabe420b7f 100644 --- a/releasenotes/notes/bug-1540988-17841cfd5accf7f5.yaml +++ b/releasenotes/notes/bug-1540988-17841cfd5accf7f5.yaml @@ -4,3 +4,6 @@ features: Add ``--limit`` option to ``image list`` to limit the number of images in output. [Bug `1540988 `_] + - | + Add ``--marker`` option to ``image list`` to handle paginate requests. + [Bug `1540988 `_]