Skip to content

Commit 7957768

Browse files
committed
Add support to list image members
The OpenStack client presently has support to add or remove members from an image, but no way to list image members. This patch addreses this issue. Change-Id: Ie85c5de23c6beb21fd6b4c04c83ddf2a116606ef
1 parent 6361e5e commit 7957768

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
@@ -592,6 +592,39 @@ def take_action(self, parsed_args):
592592
)
593593

594594

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

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)