Skip to content

Commit b9c5094

Browse files
lihaijingDavidRabel-b1
authored andcommitted
Fix 'project purge' deletes ALL images problem
Closes-Bug: #1717130 Change-Id: I33c6fc7897dfee85d1c197a1267bde4abfa5bbd9 (cherry picked from commit 254dbf3)
1 parent fcf928e commit b9c5094

5 files changed

Lines changed: 28 additions & 13 deletions

File tree

openstackclient/common/project_purge.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,14 @@ def delete_resources(self, dry_run, project_id):
9595
# images
9696
try:
9797
image_client = self.app.client_manager.image
98-
data = image_client.images.list(owner=project_id)
98+
api_version = int(image_client.version)
99+
if api_version == 1:
100+
data = image_client.images.list(owner=project_id)
101+
elif api_version == 2:
102+
kwargs = {'filters': {'owner': project_id}}
103+
data = image_client.images.list(**kwargs)
104+
else:
105+
raise NotImplementedError
99106
self.delete_objects(
100107
image_client.images.delete, data, 'image', dry_run)
101108
except Exception:

openstackclient/tests/unit/common/test_project_purge.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ def test_project_purge_with_project(self):
118118
self.projects_mock.delete.assert_called_once_with(self.project.id)
119119
self.servers_mock.list.assert_called_once_with(
120120
search_opts={'tenant_id': self.project.id})
121-
self.images_mock.list.assert_called_once_with(
122-
owner=self.project.id)
121+
kwargs = {'filters': {'owner': self.project.id}}
122+
self.images_mock.list.assert_called_once_with(**kwargs)
123123
volume_search_opts = {'project_id': self.project.id}
124124
self.volumes_mock.list.assert_called_once_with(
125125
search_opts=volume_search_opts)
@@ -153,8 +153,8 @@ def test_project_purge_with_dry_run(self):
153153
self.projects_mock.delete.assert_not_called()
154154
self.servers_mock.list.assert_called_once_with(
155155
search_opts={'tenant_id': self.project.id})
156-
self.images_mock.list.assert_called_once_with(
157-
owner=self.project.id)
156+
kwargs = {'filters': {'owner': self.project.id}}
157+
self.images_mock.list.assert_called_once_with(**kwargs)
158158
volume_search_opts = {'project_id': self.project.id}
159159
self.volumes_mock.list.assert_called_once_with(
160160
search_opts=volume_search_opts)
@@ -188,8 +188,8 @@ def test_project_purge_with_keep_project(self):
188188
self.projects_mock.delete.assert_not_called()
189189
self.servers_mock.list.assert_called_once_with(
190190
search_opts={'tenant_id': self.project.id})
191-
self.images_mock.list.assert_called_once_with(
192-
owner=self.project.id)
191+
kwargs = {'filters': {'owner': self.project.id}}
192+
self.images_mock.list.assert_called_once_with(**kwargs)
193193
volume_search_opts = {'project_id': self.project.id}
194194
self.volumes_mock.list.assert_called_once_with(
195195
search_opts=volume_search_opts)
@@ -224,8 +224,8 @@ def test_project_purge_with_auth_project(self):
224224
self.projects_mock.delete.assert_called_once_with(self.project.id)
225225
self.servers_mock.list.assert_called_once_with(
226226
search_opts={'tenant_id': self.project.id})
227-
self.images_mock.list.assert_called_once_with(
228-
owner=self.project.id)
227+
kwargs = {'filters': {'owner': self.project.id}}
228+
self.images_mock.list.assert_called_once_with(**kwargs)
229229
volume_search_opts = {'project_id': self.project.id}
230230
self.volumes_mock.list.assert_called_once_with(
231231
search_opts=volume_search_opts)
@@ -260,8 +260,8 @@ def test_project_purge_with_exception(self, mock_error):
260260
self.projects_mock.delete.assert_called_once_with(self.project.id)
261261
self.servers_mock.list.assert_called_once_with(
262262
search_opts={'tenant_id': self.project.id})
263-
self.images_mock.list.assert_called_once_with(
264-
owner=self.project.id)
263+
kwargs = {'filters': {'owner': self.project.id}}
264+
self.images_mock.list.assert_called_once_with(**kwargs)
265265
volume_search_opts = {'project_id': self.project.id}
266266
self.volumes_mock.list.assert_called_once_with(
267267
search_opts=volume_search_opts)
@@ -296,8 +296,8 @@ def test_project_purge_with_force_delete_backup(self):
296296
self.projects_mock.delete.assert_called_once_with(self.project.id)
297297
self.servers_mock.list.assert_called_once_with(
298298
search_opts={'tenant_id': self.project.id})
299-
self.images_mock.list.assert_called_once_with(
300-
owner=self.project.id)
299+
kwargs = {'filters': {'owner': self.project.id}}
300+
self.images_mock.list.assert_called_once_with(**kwargs)
301301
volume_search_opts = {'project_id': self.project.id}
302302
self.volumes_mock.list.assert_called_once_with(
303303
search_opts=volume_search_opts)

openstackclient/tests/unit/image/v1/fakes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def __init__(self, **kwargs):
6363
self.images.resource_class = fakes.FakeResource(None, {})
6464
self.auth_token = kwargs['token']
6565
self.management_url = kwargs['endpoint']
66+
self.version = 1.0
6667

6768

6869
class TestImagev1(utils.TestCommand):

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ def __init__(self, **kwargs):
156156
self.image_tags.resource_class = fakes.FakeResource(None, {})
157157
self.auth_token = kwargs['token']
158158
self.management_url = kwargs['endpoint']
159+
self.version = 2.0
159160

160161

161162
class TestImagev2(utils.TestCommand):
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
fixes:
3+
- |
4+
Fix the ``project purge`` command to correctly delete only images owned by the
5+
specified project ID when run by an administrative user.
6+
[Bug `1717130 <https://bugs.launchpad.net/python-openstackclient/+bug/1717130>`_]

0 commit comments

Comments
 (0)