Skip to content

Commit 972a345

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add support to list image members"
2 parents 5ed81c5 + 7957768 commit 972a345

6 files changed

Lines changed: 101 additions & 0 deletions

File tree

doc/source/cli/command-objects/image.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,22 @@ List available images
266266
267267
*Image version 2 only*
268268
269+
image member list
270+
-----------------
271+
272+
List projects associated with image
273+
274+
.. program:: image member list
275+
.. code:: bash
276+
277+
openstack image member list
278+
<image>
279+
280+
.. _image_member_list-image:
281+
.. describe:: <image>
282+
283+
Image(s) to view members for (name or ID)
284+
269285
image remove project
270286
--------------------
271287

doc/source/cli/commands.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ referring to both Compute and Volume quotas.
104104
* ``hypervisor stats``: (**Compute**) hypervisor statistics over all compute nodes
105105
* ``identity provider``: (**Identity**) a source of users and authentication
106106
* ``image``: (**Image**) a disk image
107+
* ``image member``: (**Image**) a project that is a member of an Image
107108
* ``ip availability``: (**Network**) - details of IP usage of a network
108109
* ``ip fixed``: (**Compute**, **Network**) - an internal IP address assigned to a server
109110
* ``ip floating``: (**Compute**, **Network**) - a public IP address that can be mapped to a server

openstackclient/image/v2/image.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,39 @@ def take_action(self, parsed_args):
591591
)
592592

593593

594+
class ListImageProjects(command.Lister):
595+
_description = _("List projects associated with image")
596+
597+
def get_parser(self, prog_name):
598+
parser = super(ListImageProjects, self).get_parser(prog_name)
599+
parser.add_argument(
600+
"image",
601+
metavar="<image>",
602+
help=_("Image (name or ID)"),
603+
)
604+
common.add_project_domain_option_to_parser(parser)
605+
return parser
606+
607+
def take_action(self, parsed_args):
608+
image_client = self.app.client_manager.image
609+
columns = (
610+
"Image ID",
611+
"Member ID",
612+
"Status"
613+
)
614+
615+
image_id = utils.find_resource(
616+
image_client.images,
617+
parsed_args.image).id
618+
619+
data = image_client.image_members.list(image_id)
620+
621+
return (columns,
622+
(utils.get_item_properties(
623+
s, columns,
624+
) for s in data))
625+
626+
594627
class RemoveProjectImage(command.Command):
595628
_description = _("Disassociate project with image")
596629

openstackclient/tests/unit/image/v2/test_image.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,52 @@ def test_image_list_status_option(self):
780780
)
781781

782782

783+
class TestListImageProjects(TestImage):
784+
785+
project = identity_fakes.FakeProject.create_one_project()
786+
_image = image_fakes.FakeImage.create_one_image()
787+
member = image_fakes.FakeImage.create_one_image_member(
788+
attrs={'image_id': _image.id,
789+
'member_id': project.id}
790+
)
791+
792+
columns = (
793+
"Image ID",
794+
"Member ID",
795+
"Status"
796+
)
797+
798+
datalist = ((
799+
_image.id,
800+
member.member_id,
801+
member.status,
802+
))
803+
804+
def setUp(self):
805+
super(TestListImageProjects, self).setUp()
806+
807+
self.images_mock.get.return_value = self._image
808+
self.image_members_mock.list.return_value = self.datalist
809+
810+
self.cmd = image.ListImageProjects(self.app, None)
811+
812+
def test_image_member_list(self):
813+
arglist = [
814+
self._image.id
815+
]
816+
verifylist = [
817+
('image', self._image.id)
818+
]
819+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
820+
821+
columns, data = self.cmd.take_action(parsed_args)
822+
823+
self.image_members_mock.list.assert_called_with(self._image.id)
824+
825+
self.assertEqual(self.columns, columns)
826+
self.assertEqual(len(self.datalist), len(tuple(data)))
827+
828+
783829
class TestRemoveProjectImage(TestImage):
784830

785831
project = identity_fakes.FakeProject.create_one_project()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- The OpenStack client now has the ability to list all members of an image
4+
in order to faciliate management of member projects for images.

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ openstack.image.v2 =
353353
image_create = openstackclient.image.v2.image:CreateImage
354354
image_delete = openstackclient.image.v2.image:DeleteImage
355355
image_list = openstackclient.image.v2.image:ListImage
356+
image_member_list = openstackclient.image.v2.image:ListImageProjects
356357
image_remove_project = openstackclient.image.v2.image:RemoveProjectImage
357358
image_save = openstackclient.image.v2.image:SaveImage
358359
image_show = openstackclient.image.v2.image:ShowImage

0 commit comments

Comments
 (0)