From ccabf7a4dfff068bc5b37e769b7fb9d1b21cbf72 Mon Sep 17 00:00:00 2001 From: Brant Knudson Date: Fri, 1 Mar 2013 16:27:20 -0600 Subject: delete deleted image 500 bug Fixes bug 1138666 When you delete an image that you just deleted, you get a 500 Internal Server Error. In this case, the problem isn't an internal server error but the "unauthorized" response from the image service is not expected. This can be recreated with devstack: 1) delete an image 2) delete the same image Here's an example: $ nova image-list +--------------------------------------+---------------------------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+---------------------------------+--------+--------+ | caa6c969-0f32-466b-8e8e-a7e0ac835470 | cirros-0.3.1-x86_64-uec | ACTIVE | | | 8af603da-b69f-49c6-8e52-25632eccb31c | cirros-0.3.1-x86_64-uec-kernel | ACTIVE | | | fe67d4e1-baca-4968-8638-2314373b620b | cirros-0.3.1-x86_64-uec-ramdisk | ACTIVE | | +--------------------------------------+---------------------------------+--------+--------+ $ nova image-delete caa6c969-0f32-466b-8e8e-a7e0ac835470 $ nova image-delete caa6c969-0f32-466b-8e8e-a7e0ac835470 ERROR: The server has either erred or is incapable of performing the requested operation. (HTTP 500) (Request-ID: req-1254f8a5-8dda-444a-a077-2072ab3baa6a) If you delete a deleted image, the server should respond with '403 Forbidden' because the image still exists and no user is allowed to delete a deleted image. The fix is to catch the exception from the image service and convert it to a wsgi exception for '403 Forbidden'. Change-Id: I2f14687d5468b67389f5dd6ab338ceb54e8a29bb --- nova/api/openstack/compute/images.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'nova/api') diff --git a/nova/api/openstack/compute/images.py b/nova/api/openstack/compute/images.py index 82db21c9e..3d54da0b5 100644 --- a/nova/api/openstack/compute/images.py +++ b/nova/api/openstack/compute/images.py @@ -159,6 +159,11 @@ class Controller(wsgi.Controller): except exception.ImageNotFound: explanation = _("Image not found.") raise webob.exc.HTTPNotFound(explanation=explanation) + except exception.ImageNotAuthorized: + # The image service raises this exception on delete if glanceclient + # raises HTTPForbidden. + explanation = _("You are not allowed to delete the image.") + raise webob.exc.HTTPForbidden(explanation=explanation) return webob.exc.HTTPNoContent() @wsgi.serializers(xml=MinimalImagesTemplate) -- cgit