File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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+
269285image remove project
270286--------------------
271287
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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+
595628class RemoveProjectImage (command .Command ):
596629 _description = _ ("Disassociate project with image" )
597630
Original file line number Diff line number Diff 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+
783829class TestRemoveProjectImage (TestImage ):
784830
785831 project = identity_fakes .FakeProject .create_one_project ()
Original file line number Diff line number Diff line change 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.
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments