Skip to content

Commit dc8d9d3

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Adding CLI command for glance member-get"
2 parents 9cb8e4c + 93b2e66 commit dc8d9d3

File tree

5 files changed

+105
-1
lines changed

5 files changed

+105
-1
lines changed

doc/source/cli/data/glance.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ md-tag-show,,Describe a specific metadata definitions tag inside a namespace.
5454
md-tag-update,,Rename a metadata definitions tag inside a namespace.
5555
member-create,image add project,Create member for a given image.
5656
member-delete,image remove project,Delete image member.
57-
member-get,,Show details of an image member
57+
member-get,image member get,Show details of an image member
5858
member-list,image member list,Describe sharing permissions by image.
5959
member-update,image set --accept --reject --status,Update the status of a member for a given image.
6060
stores-delete,image delete --store,Delete image from specific store.

openstackclient/image/v2/image.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,43 @@ def take_action(self, parsed_args):
992992
image_client.remove_member(member=project_id, image=image.id)
993993

994994

995+
class ShowProjectImage(command.ShowOne):
996+
_description = _("Show a particular project associated with image")
997+
998+
def get_parser(self, prog_name):
999+
parser = super().get_parser(prog_name)
1000+
parser.add_argument(
1001+
"image",
1002+
metavar="<image>",
1003+
help=_("Image (name or ID)"),
1004+
)
1005+
parser.add_argument(
1006+
"member",
1007+
metavar="<project>",
1008+
help=_("Project to show (name or ID)"),
1009+
)
1010+
identity_common.add_project_domain_option_to_parser(parser)
1011+
return parser
1012+
1013+
def take_action(self, parsed_args):
1014+
image_client = self.app.client_manager.image
1015+
1016+
image = image_client.find_image(
1017+
parsed_args.image,
1018+
ignore_missing=False,
1019+
)
1020+
1021+
obj = image_client.get_member(
1022+
image=image.id,
1023+
member=parsed_args.member,
1024+
)
1025+
1026+
display_columns, columns = _get_member_columns(obj)
1027+
data = utils.get_item_properties(obj, columns, formatters={})
1028+
1029+
return (display_columns, data)
1030+
1031+
9951032
class SaveImage(command.Command):
9961033
_description = _("Save an image locally")
9971034

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,66 @@ def test_remove_project_image_with_options(self):
10931093
self.assertIsNone(result)
10941094

10951095

1096+
class TestShowProjectImage(TestImage):
1097+
_image = image_fakes.create_one_image()
1098+
new_member = image_fakes.create_one_image_member(
1099+
attrs={'image_id': _image.id, 'member_id': 'member1'}
1100+
)
1101+
1102+
columns = (
1103+
'created_at',
1104+
'image_id',
1105+
'member_id',
1106+
'schema',
1107+
'status',
1108+
'updated_at',
1109+
)
1110+
1111+
datalist = (
1112+
new_member.created_at,
1113+
_image.id,
1114+
new_member.member_id,
1115+
new_member.schema,
1116+
new_member.status,
1117+
new_member.updated_at,
1118+
)
1119+
1120+
def setUp(self):
1121+
super().setUp()
1122+
1123+
# This is the return value for utils.find_resource()
1124+
self.image_client.find_image.return_value = self._image
1125+
1126+
self.image_client.get_member.return_value = self.new_member
1127+
# Get the command object to test
1128+
self.cmd = _image.ShowProjectImage(self.app, None)
1129+
1130+
def test_show_project_image(self):
1131+
arglist = [
1132+
self._image.id,
1133+
'member1',
1134+
]
1135+
verifylist = [
1136+
('image', self._image.id),
1137+
('member', 'member1'),
1138+
]
1139+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1140+
1141+
columns, data = self.cmd.take_action(parsed_args)
1142+
1143+
self.image_client.find_image.assert_called_with(
1144+
self._image.id, ignore_missing=False
1145+
)
1146+
1147+
self.image_client.get_member.assert_called_with(
1148+
member='member1',
1149+
image=self._image.id,
1150+
)
1151+
1152+
self.assertEqual(self.columns, columns)
1153+
self.assertEqual(self.datalist, data)
1154+
1155+
10961156
class TestImageSet(TestImage):
10971157
project = identity_fakes.FakeProject.create_one_project()
10981158
domain = identity_fakes.FakeDomain.create_one_domain()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``image member get`` command which accepts an
5+
image_id and member_id and displays the detail of
6+
the particular meber associated to the image.

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ openstack.image.v2 =
381381
image_list = openstackclient.image.v2.image:ListImage
382382
image_member_list = openstackclient.image.v2.image:ListImageProjects
383383
image_remove_project = openstackclient.image.v2.image:RemoveProjectImage
384+
image_member_get = openstackclient.image.v2.image:ShowProjectImage
384385
image_save = openstackclient.image.v2.image:SaveImage
385386
image_show = openstackclient.image.v2.image:ShowImage
386387
image_set = openstackclient.image.v2.image:SetImage

0 commit comments

Comments
 (0)