diff --git a/doc/source/cli/command-objects/image.rst b/doc/source/cli/command-objects/image.rst index 2918452baf..92efd0a546 100644 --- a/doc/source/cli/command-objects/image.rst +++ b/doc/source/cli/command-objects/image.rst @@ -209,6 +209,9 @@ List available images [--sort [:]] [--limit ] [--marker ] + [--name ] + [--status ] + .. option:: --public @@ -248,6 +251,15 @@ List available images The last image of the previous page. Display list of images after marker. Display all images if not specified. (name or ID) +.. option:: --name + + Filter images based on name + +.. option:: --status + + Filter images based on status + + *Image version 2 only* image remove project diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 2b171410f4..c2c5c594ce 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -452,6 +452,18 @@ class ListImage(command.Lister): action=parseractions.KeyValueAction, help=_('Filter output based on property'), ) + parser.add_argument( + '--name', + metavar='', + default=None, + help=_("Filter images based on name.") + ) + parser.add_argument( + '--status', + metavar='', + default=None, + help=_("Filter images based on status.") + ) parser.add_argument( '--long', action='store_true', @@ -505,6 +517,10 @@ class ListImage(command.Lister): if parsed_args.marker: kwargs['marker'] = utils.find_resource(image_client.images, parsed_args.marker).id + if parsed_args.name: + kwargs['name'] = parsed_args.name + if parsed_args.status: + kwargs['status'] = parsed_args.status if parsed_args.long: columns = ( 'ID', diff --git a/openstackclient/tests/functional/image/v2/test_image.py b/openstackclient/tests/functional/image/v2/test_image.py index 8fadd2000f..a93fa8cbee 100644 --- a/openstackclient/tests/functional/image/v2/test_image.py +++ b/openstackclient/tests/functional/image/v2/test_image.py @@ -51,6 +51,24 @@ class ImageTests(base.TestCase): [img['Name'] for img in json_output] ) + def test_image_list_with_name_filter(self): + json_output = json.loads(self.openstack( + 'image list --name ' + self.NAME + ' -f json' + )) + self.assertIn( + self.NAME, + [img['Name'] for img in json_output] + ) + + def test_image_list_with_status_filter(self): + json_output = json.loads(self.openstack( + 'image list ' + ' --status active -f json' + )) + self.assertIn( + 'active', + [img['Status'] for img in json_output] + ) + def test_image_attributes(self): """Test set, unset, show on attributes, tags and properties""" diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py index 65764e98e0..484a2bc64b 100644 --- a/openstackclient/tests/unit/image/v2/test_image.py +++ b/openstackclient/tests/unit/image/v2/test_image.py @@ -750,6 +750,34 @@ class TestImageList(TestImage): marker=image_fakes.image_id, ) + def test_image_list_name_option(self): + arglist = [ + '--name', 'abc', + ] + verifylist = [ + ('name', 'abc'), + ] + 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( + name='abc', marker=self._image.id + ) + + def test_image_list_status_option(self): + arglist = [ + '--status', 'active', + ] + verifylist = [ + ('status', 'active'), + ] + 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( + status='active', marker=self._image.id + ) + class TestRemoveProjectImage(TestImage): diff --git a/releasenotes/notes/bug-1698742-66d9d4e6c7ad274a.yaml b/releasenotes/notes/bug-1698742-66d9d4e6c7ad274a.yaml new file mode 100644 index 0000000000..eb40a41eaf --- /dev/null +++ b/releasenotes/notes/bug-1698742-66d9d4e6c7ad274a.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Add ``--name`` and ``--status`` options to ``image list`` command + to filter images based on name and status respectively. + [Bug `1698742 `_]