Skip to content

Commit ad2689d

Browse files
committed
Fix image owner change when accepting membership with --project
When using 'openstack image set --project <project> --accept <image>', the command incorrectly changed the image owner. The --project parameter when used with membership flags should only identify which member's status to update, not change ownership. Closes-Bug: #2136795 Change-Id: I1044b51f38000fb5339740bc40c7f8645c794402 Signed-off-by: Abhishek Kekane <akekane@redhat.com> (cherry picked from commit ed2dc69)
1 parent c836ab2 commit ad2689d

File tree

3 files changed

+125
-1
lines changed

3 files changed

+125
-1
lines changed

openstackclient/image/v2/image.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,10 @@ def take_action(self, parsed_args):
13931393
if parsed_args.visibility is not None:
13941394
kwargs['visibility'] = parsed_args.visibility
13951395

1396-
if parsed_args.project:
1396+
# Only set owner_id if --project is used WITHOUT membership flags
1397+
# When --project is used with --accept/--reject/--pending, it should
1398+
# only identify which member's status to update, not change ownership
1399+
if parsed_args.project and not parsed_args.membership:
13971400
# We already did the project lookup above
13981401
kwargs['owner_id'] = project_id
13991402

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

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,6 +1295,117 @@ def test_image_set_membership_option_pending(self):
12951295
# the 'update membership' route.
12961296
self.image_client.update_image.assert_called_with(self._image.id)
12971297

1298+
def test_image_set_membership_accept_with_project_no_owner_change(self):
1299+
"""Test that --project with --accept doesn't change image owner."""
1300+
membership = image_fakes.create_one_image_member(
1301+
attrs={
1302+
'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
1303+
'member_id': self.project.id,
1304+
}
1305+
)
1306+
self.image_client.update_member.return_value = membership
1307+
1308+
arglist = [
1309+
'--project',
1310+
self.project.name,
1311+
'--accept',
1312+
self._image.id,
1313+
]
1314+
verifylist = [
1315+
('project', self.project.name),
1316+
('membership', 'accepted'),
1317+
('image', self._image.id),
1318+
]
1319+
1320+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1321+
self.cmd.take_action(parsed_args)
1322+
1323+
self.image_client.update_member.assert_called_once_with(
1324+
image=self._image.id,
1325+
member=self.project.id,
1326+
status='accepted',
1327+
)
1328+
1329+
self.image_client.update_image.assert_called()
1330+
call_args = self.image_client.update_image.call_args
1331+
if call_args:
1332+
args, kwargs = call_args
1333+
self.assertNotIn('owner_id', kwargs)
1334+
1335+
def test_image_set_membership_reject_with_project_no_owner_change(self):
1336+
"""Test that --project with --reject doesn't change image owner."""
1337+
membership = image_fakes.create_one_image_member(
1338+
attrs={
1339+
'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
1340+
'member_id': self.project.id,
1341+
}
1342+
)
1343+
self.image_client.update_member.return_value = membership
1344+
1345+
arglist = [
1346+
'--project',
1347+
self.project.name,
1348+
'--reject',
1349+
self._image.id,
1350+
]
1351+
verifylist = [
1352+
('project', self.project.name),
1353+
('membership', 'rejected'),
1354+
('image', self._image.id),
1355+
]
1356+
1357+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1358+
self.cmd.take_action(parsed_args)
1359+
1360+
self.image_client.update_member.assert_called_once_with(
1361+
image=self._image.id,
1362+
member=self.project.id,
1363+
status='rejected',
1364+
)
1365+
1366+
self.image_client.update_image.assert_called()
1367+
call_args = self.image_client.update_image.call_args
1368+
if call_args:
1369+
args, kwargs = call_args
1370+
self.assertNotIn('owner_id', kwargs)
1371+
1372+
def test_image_set_membership_pending_with_project_no_owner_change(self):
1373+
"""Test that --project with --pending doesn't change image owner."""
1374+
membership = image_fakes.create_one_image_member(
1375+
attrs={
1376+
'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
1377+
'member_id': self.project.id,
1378+
}
1379+
)
1380+
self.image_client.update_member.return_value = membership
1381+
1382+
arglist = [
1383+
'--project',
1384+
self.project.name,
1385+
'--pending',
1386+
self._image.id,
1387+
]
1388+
verifylist = [
1389+
('project', self.project.name),
1390+
('membership', 'pending'),
1391+
('image', self._image.id),
1392+
]
1393+
1394+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1395+
self.cmd.take_action(parsed_args)
1396+
1397+
self.image_client.update_member.assert_called_once_with(
1398+
image=self._image.id,
1399+
member=self.project.id,
1400+
status='pending',
1401+
)
1402+
1403+
self.image_client.update_image.assert_called()
1404+
call_args = self.image_client.update_image.call_args
1405+
if call_args:
1406+
args, kwargs = call_args
1407+
self.assertNotIn('owner_id', kwargs)
1408+
12981409
def test_image_set_options(self):
12991410
arglist = [
13001411
'--name',
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
fixes:
3+
- |
4+
Fix a bug where using ``openstack image set --project <project>
5+
--accept <image>`` incorrectly changed the image owner to the specified
6+
project instead of only updating the member status. The ``--project``
7+
parameter when used with ``--accept``, ``--reject``, or ``--pending``
8+
should only identify which member's status to update, not change the
9+
image ownership.
10+
[Bug `2136795 <https://bugs.launchpad.net/python-openstackclient/+bug/2136795>`_]

0 commit comments

Comments
 (0)