From 9edbab8c90bb74ba12892d0c77c8e8a99d4868fe Mon Sep 17 00:00:00 2001 From: Adam Harwell Date: Wed, 13 Jun 2018 15:22:17 -0700 Subject: [PATCH] Add ability to filter image list by tag Change-Id: I2e222d3e69df9d8d7cd472663caaee31bedd848c --- doc/source/cli/command-objects/image.rst | 7 +++++ openstackclient/image/v2/image.py | 8 +++++ .../tests/functional/image/v2/test_image.py | 29 ++++++++++++++----- .../tests/unit/image/v2/test_image.py | 14 +++++++++ ...e-tag-filter-support-5cb039416b07caab.yaml | 4 +++ 5 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 releasenotes/notes/add-image-tag-filter-support-5cb039416b07caab.yaml diff --git a/doc/source/cli/command-objects/image.rst b/doc/source/cli/command-objects/image.rst index f0b5bfaad..a09a8d9ff 100644 --- a/doc/source/cli/command-objects/image.rst +++ b/doc/source/cli/command-objects/image.rst @@ -209,6 +209,7 @@ List available images [--property ] [--name ] [--status ] + [--tag ] [--long] [--sort [:]] [--limit ] @@ -244,6 +245,12 @@ List available images *Image version 2 only* +.. option:: --tag + + Filter images based on tag + + *Image version 2 only* + .. option:: --long List additional fields in output diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 4a51062fe..4c7c815f2 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -464,6 +464,12 @@ class ListImage(command.Lister): default=None, help=_("Filter images based on status.") ) + parser.add_argument( + '--tag', + metavar='', + default=None, + help=_('Filter images based on tag.'), + ) parser.add_argument( '--long', action='store_true', @@ -521,6 +527,8 @@ class ListImage(command.Lister): kwargs['name'] = parsed_args.name if parsed_args.status: kwargs['status'] = parsed_args.status + if parsed_args.tag: + kwargs['tag'] = parsed_args.tag 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 278ba5b94..3037b903c 100644 --- a/openstackclient/tests/functional/image/v2/test_image.py +++ b/openstackclient/tests/functional/image/v2/test_image.py @@ -28,10 +28,11 @@ class ImageTests(base.TestCase): @classmethod def setUpClass(cls): super(ImageTests, cls).setUpClass() + cls.image_tag = 'my_tag' json_output = json.loads(cls.openstack( '--os-image-api-version 2 ' - 'image create -f json ' + - cls.NAME + 'image create -f json --tag {tag} {name}'.format( + tag=cls.image_tag, name=cls.NAME) )) cls.image_id = json_output["id"] cls.assertOutput(cls.NAME, json_output['name']) @@ -81,6 +82,16 @@ class ImageTests(base.TestCase): [img['Status'] for img in json_output] ) + def test_image_list_with_tag_filter(self): + json_output = json.loads(self.openstack( + 'image list --tag ' + self.image_tag + ' --long -f json' + )) + for taglist in [img['Tags'].split(', ') for img in json_output]: + self.assertIn( + self.image_tag, + taglist + ) + def test_image_attributes(self): """Test set, unset, show on attributes, tags and properties""" @@ -142,6 +153,10 @@ class ImageTests(base.TestCase): ) # Test tags + self.assertNotIn( + '01', + json_output["tags"].split(', ') + ) self.openstack( 'image set ' + '--tag 01 ' + @@ -151,9 +166,9 @@ class ImageTests(base.TestCase): 'image show -f json ' + self.NAME )) - self.assertEqual( + self.assertIn( '01', - json_output["tags"], + json_output["tags"].split(', ') ) self.openstack( @@ -165,9 +180,9 @@ class ImageTests(base.TestCase): 'image show -f json ' + self.NAME )) - self.assertEqual( - '', - json_output["tags"], + self.assertNotIn( + '01', + json_output["tags"].split(', ') ) def test_image_set_rename(self): diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py index 301cd0377..b769d1f65 100644 --- a/openstackclient/tests/unit/image/v2/test_image.py +++ b/openstackclient/tests/unit/image/v2/test_image.py @@ -779,6 +779,20 @@ class TestImageList(TestImage): status='active', marker=self._image.id ) + def test_image_list_tag_option(self): + arglist = [ + '--tag', 'abc', + ] + verifylist = [ + ('tag', '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( + tag='abc', marker=self._image.id + ) + class TestListImageProjects(TestImage): diff --git a/releasenotes/notes/add-image-tag-filter-support-5cb039416b07caab.yaml b/releasenotes/notes/add-image-tag-filter-support-5cb039416b07caab.yaml new file mode 100644 index 000000000..1c9ece84c --- /dev/null +++ b/releasenotes/notes/add-image-tag-filter-support-5cb039416b07caab.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Add ``--tag`` option to ``image list`` command to filter by tag.