Skip to content

Commit

Permalink
Respond with 410 after upload if image was deleted
Browse files Browse the repository at this point in the history
When updating the image after upload, we should return an
HTTPGone instead of a 500 error if the image cannot
be found.
This will provide more information to nova when this occurs
during snapshotting.

Fixes bug #1217838

Change-Id: I6e9875a9ff95ed3e9c38685785473138327ad4a1
  • Loading branch information
sridevikoushik31 committed Sep 17, 2013
1 parent 4164949 commit 26a47e7
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
16 changes: 13 additions & 3 deletions glance/api/v2/image_data.py
Expand Up @@ -50,9 +50,19 @@ def upload(self, req, image_id, data, size):
try:
image = image_repo.get(image_id)
image.status = 'saving'
image_repo.save(image)
image.set_data(data, size)
image_repo.save(image)
try:
image_repo.save(image)
image.set_data(data, size)
image_repo.save(image)
except exception.NotFound as e:
msg = (_("Image %s could not be found after upload."
"The image may have been deleted during the upload: %s")
% (image_id, e))
LOG.warn(msg)
raise webob.exc.HTTPGone(explanation=msg,
request=req,
content_type='text/plain')

except ValueError as e:
LOG.debug("Cannot save data for image %s: %s", image_id, e)
raise webob.exc.HTTPBadRequest(explanation=unicode(e))
Expand Down
13 changes: 12 additions & 1 deletion glance/tests/unit/v2/test_image_data_resource.py
Expand Up @@ -164,7 +164,18 @@ def test_upload_invalid(self):
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.upload,
request, unit_test_utils.UUID1, 'YYYY', 4)

def test_upload_non_existent_image(self):
def test_upload_non_existent_image_during_save(self):
def fake_save(self):
raise exception.NotFound()

request = unit_test_utils.get_fake_request()
image = FakeImage('abcd', locations=['http://example.com/image'])
self.image_repo.result = image
self.image_repo.save = fake_save
self.assertRaises(webob.exc.HTTPGone, self.controller.upload,
request, uuidutils.generate_uuid(), 'ABC', 3)

def test_upload_non_existent_image_before_save(self):
request = unit_test_utils.get_fake_request()
self.image_repo.result = exception.NotFound()
self.assertRaises(webob.exc.HTTPNotFound, self.controller.upload,
Expand Down

0 comments on commit 26a47e7

Please sign in to comment.