Utilize LimitingReader for staging data

ImageSizeLimitExceeded exception block is unreachable in stage
call because glance is using sotre_backend.add (filesystem.add
in this case) and it will raise 'exceptions.StorageFull()' [1]
if image file is too large (errno.EFBIG).

Used LimitingReader to enforce the image size limitation which
will raise ImageSizeLimitExceeded if image size is larger that
config option 'image_size_cap'.

[1] https://github.com/openstack/glance_store/blob/master/glance_store/_drivers/filesystem.py#L691

Change-Id: I50821111ac4c782966ed1ccd48e92f8dd4100e62
Closes-Bug: #1732830
This commit is contained in:
Abhishek Kekane 2017-11-20 03:44:23 +00:00 committed by Brian Rosmaita
parent 044f6f8488
commit d48c8419ee
2 changed files with 15 additions and 1 deletions

View File

@ -299,7 +299,9 @@ class ImageDataController(object):
image.status = 'uploading'
image_repo.save(image, from_state='queued')
try:
staging_store.add(image_id, data, 0)
staging_store.add(
image_id, utils.LimitingReader(
utils.CooperativeReader(data), CONF.image_size_cap), 0)
except glance_store.Duplicate as e:
msg = _("The image %s has data on staging") % image_id
raise webob.exc.HTTPConflict(explanation=msg)

View File

@ -479,6 +479,18 @@ class TestImagesController(base.StoreClearingUnitTest):
self.assertRaises(webob.exc.HTTPNotFound, self.controller.stage,
request, str(uuid.uuid4()), 'ABC', 3)
@mock.patch.object(filesystem.Store, 'add')
def test_image_stage_raises_image_size_exceeded(self, mock_store_add):
mock_store_add.side_effect = exception.ImageSizeLimitExceeded()
image_id = str(uuid.uuid4())
request = unit_test_utils.get_fake_request()
image = FakeImage(image_id=image_id)
self.image_repo.result = image
with mock.patch.object(self.controller, "_unstage"):
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
self.controller.stage,
request, image_id, 'YYYYYYY', 7)
class TestImageDataDeserializer(test_utils.BaseTestCase):