summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-10-09 16:06:52 +0000
committerGerrit Code Review <review@openstack.org>2014-10-09 16:06:52 +0000
commit6833ca9e4235cb99e550ef272dbeed1227754655 (patch)
treeb20dbd81079192a075a7ea72877a5f1440e4aa6f
parentad34b836fb6d8e2ba067e8c14512abc4ec0b4969 (diff)
parentace6197bbaaba7d53c05ff6eb2c39a642cfc463d (diff)
downloadglance-6833ca9e4235cb99e550ef272dbeed1227754655.tar.gz
Merge "g-api raises 500 error while uploading image" into proposed/juno
-rw-r--r--glance/api/v1/upload_utils.py9
-rw-r--r--glance/api/v2/image_data.py8
-rw-r--r--glance/tests/unit/v1/test_api.py39
-rw-r--r--glance/tests/unit/v1/test_upload_utils.py7
-rw-r--r--glance/tests/unit/v2/test_image_data_resource.py10
5 files changed, 73 insertions, 0 deletions
diff --git a/glance/api/v1/upload_utils.py b/glance/api/v1/upload_utils.py
index 2e22dae3d..763d6cb9d 100644
--- a/glance/api/v1/upload_utils.py
+++ b/glance/api/v1/upload_utils.py
@@ -173,6 +173,15 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
request=req,
content_type='text/plain')
+ except store_api.StoreAddDisabled:
+ msg = _("Error in store configuration. Adding images to store "
+ "is disabled.")
+ LOG.exception(msg)
+ safe_kill(req, image_id, 'saving')
+ notifier.error('image.upload', msg)
+ raise webob.exc.HTTPGone(explanation=msg, request=req,
+ content_type='text/plain')
+
except exception.Duplicate as e:
msg = u"Attempt to upload duplicate image: %s" % e
LOG.debug(msg)
diff --git a/glance/api/v2/image_data.py b/glance/api/v2/image_data.py
index 04cfe3481..dc38ffcea 100644
--- a/glance/api/v2/image_data.py
+++ b/glance/api/v2/image_data.py
@@ -98,6 +98,14 @@ class ImageDataController(object):
raise webob.exc.HTTPBadRequest(explanation=
utils.exception_to_str(e))
+ except glance_store.StoreAddDisabled:
+ msg = _("Error in store configuration. Adding images to store "
+ "is disabled.")
+ LOG.exception(msg)
+ self._restore(image_repo, image)
+ raise webob.exc.HTTPGone(explanation=msg, request=req,
+ content_type='text/plain')
+
except exception.InvalidImageStatusTransition as e:
msg = utils.exception_to_str(e)
LOG.debug(msg)
diff --git a/glance/tests/unit/v1/test_api.py b/glance/tests/unit/v1/test_api.py
index d5a47ec36..8d2d68951 100644
--- a/glance/tests/unit/v1/test_api.py
+++ b/glance/tests/unit/v1/test_api.py
@@ -1534,6 +1534,45 @@ class TestGlanceAPI(base.IsolatedUnitTest):
"Got headers: %r" % res.headers)
self.assertEqual("active", res.headers['x-image-meta-status'])
+ def test_upload_image_raises_store_disabled(self):
+ """Test that uploading an image file returns HTTTP 410 response"""
+ # create image
+ fs = store.get_store_from_scheme('file')
+ fixture_headers = {'x-image-meta-store': 'file',
+ 'x-image-meta-disk-format': 'vhd',
+ 'x-image-meta-container-format': 'ovf',
+ 'x-image-meta-name': 'fake image #3',
+ 'x-image-meta-property-key1': 'value1'}
+
+ req = webob.Request.blank("/images")
+ req.method = 'POST'
+ for k, v in six.iteritems(fixture_headers):
+ req.headers[k] = v
+
+ res = req.get_response(self.api)
+ self.assertEqual(201, res.status_int)
+ res_body = jsonutils.loads(res.body)['image']
+
+ self.assertIn('id', res_body)
+
+ image_id = res_body['id']
+ self.assertIn('/images/%s' % image_id, res.headers['location'])
+
+ # Verify the status is queued
+ self.assertIn('status', res_body)
+ self.assertEqual('queued', res_body['status'])
+
+ # Now upload the image file
+ with mock.patch.object(fs, 'add') as mock_fsstore_add:
+ mock_fsstore_add.side_effect = store.StoreAddDisabled
+ req = webob.Request.blank("/images/%s" % image_id)
+ req.method = 'PUT'
+ req.headers['Content-Type'] = 'application/octet-stream'
+ req.body = "chunk00000remainder"
+ res = req.get_response(self.api)
+ self.assertEqual(410, res.status_int)
+ self._verify_image_status(image_id, 'killed')
+
def _get_image_status(self, image_id):
req = webob.Request.blank("/images/%s" % image_id)
req.method = 'HEAD'
diff --git a/glance/tests/unit/v1/test_upload_utils.py b/glance/tests/unit/v1/test_upload_utils.py
index 9b0b0b185..a50fbf88d 100644
--- a/glance/tests/unit/v1/test_upload_utils.py
+++ b/glance/tests/unit/v1/test_upload_utils.py
@@ -195,6 +195,13 @@ class TestUploadUtils(base.StoreClearingUnitTest):
mock_safe_kill.assert_called_with(req, image_meta['id'],
'saving')
+ def test_upload_data_to_store_raises_store_disabled(self):
+ """Test StoreDisabled exception is raised while uploading data"""
+ self._test_upload_data_to_store_exception_with_notify(
+ glance_store.StoreAddDisabled,
+ webob.exc.HTTPGone,
+ image_killed=True)
+
def test_upload_data_to_store_duplicate(self):
"""See note in glance.api.v1.upload_utils on why we don't want image to
be deleted in this case.
diff --git a/glance/tests/unit/v2/test_image_data_resource.py b/glance/tests/unit/v2/test_image_data_resource.py
index d88ba17c6..a055ab0f7 100644
--- a/glance/tests/unit/v2/test_image_data_resource.py
+++ b/glance/tests/unit/v2/test_image_data_resource.py
@@ -276,6 +276,16 @@ class TestImagesController(base.StoreClearingUnitTest):
self.controller.upload,
request, unit_test_utils.UUID2, 'YY', 2)
+ def test_upload_storage_store_disabled(self):
+ """Test that uploading an image file raises StoreDisabled exception"""
+ request = unit_test_utils.get_fake_request(user=unit_test_utils.USER3)
+ image = FakeImage()
+ image.set_data = Raise(glance_store.StoreAddDisabled)
+ self.image_repo.result = image
+ self.assertRaises(webob.exc.HTTPGone,
+ self.controller.upload,
+ request, unit_test_utils.UUID2, 'YY', 2)
+
def _test_upload_download_prepare_notification(self):
request = unit_test_utils.get_fake_request()
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', 4)