Revision f13aab5d
b/snf-cyclades-app/synnefo/api/images.py | ||
---|---|---|
206 | 206 |
|
207 | 207 |
log.info('delete_image %s', image_id) |
208 | 208 |
with image_backend(request.user_uniq) as backend: |
209 |
backend.delete(image_id)
|
|
209 |
backend.unregister(image_id)
|
|
210 | 210 |
log.info('User %s deleted image %s', request.user_uniq, image_id) |
211 | 211 |
return HttpResponse(status=204) |
212 | 212 |
|
b/snf-cyclades-app/synnefo/api/test/images.py | ||
---|---|---|
187 | 187 |
def test_delete_image(self, mimage): |
188 | 188 |
response = self.delete("/api/v1.1/images/42", "user") |
189 | 189 |
self.assertEqual(response.status_code, 204) |
190 |
mimage.return_value.delete.assert_called_once_with('42') |
|
190 |
mimage.return_value.unregister.assert_called_once_with('42') |
|
191 |
mimage.return_value._delete.assert_not_called('42') |
|
191 | 192 |
|
192 | 193 |
|
193 | 194 |
@patch('synnefo.api.util.ImageBackend') |
b/snf-cyclades-app/synnefo/plankton/backend.py | ||
---|---|---|
297 | 297 |
self.backend.close() |
298 | 298 |
|
299 | 299 |
@handle_backend_exceptions |
300 |
def delete(self, image_id): |
|
300 |
def _delete(self, image_id): |
|
301 |
"""Delete an Image. |
|
302 |
|
|
303 |
This method will delete the Image from the Storage backend. |
|
304 |
|
|
305 |
""" |
|
301 | 306 |
image = self.get_image(image_id) |
302 | 307 |
account, container, object = split_location(image['location']) |
303 | 308 |
self.backend.delete_object(self.user, account, container, object) |
... | ... | |
511 | 516 |
|
512 | 517 |
self._update_meta(location, meta) |
513 | 518 |
return self.get_image(image_id) |
519 |
|
|
520 |
@handle_backend_exceptions |
|
521 |
def unregister(self, image_id): |
|
522 |
"""Unregister an image.""" |
|
523 |
image = self.get_image(image_id) |
|
524 |
assert image, "Image not found" |
|
525 |
|
|
526 |
location = image["location"] |
|
527 |
# Unregister the image by removing all metadata from domain |
|
528 |
# 'PLANKTON_DOMAIN' |
|
529 |
meta = self._get_meta(location) |
|
530 |
for k in meta.keys(): |
|
531 |
meta[k] = "" |
|
532 |
self._update_meta(location, meta, False) |
b/snf-cyclades-app/synnefo/plankton/tests.py | ||
---|---|---|
291 | 291 |
def test_get_image(self, backend): |
292 | 292 |
response = self.get("/plankton/images/123") |
293 | 293 |
self.assertEqual(response.status_code, 501) |
294 |
|
|
295 |
@assert_backend_closed |
|
296 |
def test_delete_image(self, backend): |
|
297 |
response = self.delete("/plankton/images/123") |
|
298 |
self.assertEqual(response.status_code, 204) |
|
299 |
backend.return_value.unregister.assert_called_once_with('123') |
|
300 |
backend.return_value._delete.assert_not_called() |
b/snf-cyclades-app/synnefo/plankton/urls.py | ||
---|---|---|
47 | 47 |
|
48 | 48 |
|
49 | 49 |
def demux_image(request, image_id): |
50 |
if request.method == 'GET':
|
|
50 |
if request.method == "GET":
|
|
51 | 51 |
return views.get_image(request, image_id) |
52 |
elif request.method == 'HEAD':
|
|
52 |
elif request.method == "HEAD":
|
|
53 | 53 |
return views.get_image_meta(request, image_id) |
54 |
elif request.method == 'PUT':
|
|
54 |
elif request.method == "PUT":
|
|
55 | 55 |
return views.update_image(request, image_id) |
56 |
elif request.method == "DELETE": |
|
57 |
return views.delete_image(request, image_id) |
|
56 | 58 |
else: |
57 |
return HttpResponseNotAllowed(['GET', 'HEAD', 'PUT'])
|
|
59 |
return HttpResponseNotAllowed(["GET", "HEAD", "PUT", "DELETE"])
|
|
58 | 60 |
|
59 | 61 |
|
60 | 62 |
def demux_image_members(request, image_id): |
b/snf-cyclades-app/synnefo/plankton/views.py | ||
---|---|---|
155 | 155 |
return _create_image_response(image) |
156 | 156 |
|
157 | 157 |
|
158 |
@plankton_method("DELETE") |
|
159 |
def delete_image(request, image_id): |
|
160 |
"""Delete an Image. |
|
161 |
|
|
162 |
This API call is not described in the Openstack Glance API. |
|
163 |
|
|
164 |
Implementation notes: |
|
165 |
* The implementation does not delete the Image from the storage |
|
166 |
backend. Instead it unregisters the image by removing all the |
|
167 |
metadata from the plankton metadata domain. |
|
168 |
|
|
169 |
""" |
|
170 |
log.info("delete_image '%s'" % image_id) |
|
171 |
userid = request.user_uniq |
|
172 |
request.backend.unregister(image_id) |
|
173 |
log.info("User '%s' deleted image '%s'" % (userid, image_id)) |
|
174 |
return HttpResponse(status=204) |
|
175 |
|
|
176 |
|
|
158 | 177 |
@plankton_method('PUT') |
159 | 178 |
def add_image_member(request, image_id, member): |
160 | 179 |
"""Add a member to an image |
Also available in: Unified diff