diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py index 6e9f3fe64b..1e8529a77f 100644 --- a/glance/api/v2/images.py +++ b/glance/api/v2/images.py @@ -75,6 +75,14 @@ class ImagesController(object): explanation=e.msg, request=req, content_type='text/plain') except exception.Duplicate as dupex: raise webob.exc.HTTPConflict(explanation=dupex.msg) + except exception.ReservedProperty as e: + raise webob.exc.HTTPForbidden(explanation=e.msg) + except exception.ReadonlyProperty as e: + raise webob.exc.HTTPForbidden(explanation=e.msg) + except TypeError as e: + LOG.debug(utils.exception_to_str(e)) + raise webob.exc.HTTPBadRequest( + explanation=utils.exception_to_str(e)) return image diff --git a/glance/tests/unit/v2/test_images_resource.py b/glance/tests/unit/v2/test_images_resource.py index 3a7dcd846d..dcea931fc0 100644 --- a/glance/tests/unit/v2/test_images_resource.py +++ b/glance/tests/unit/v2/test_images_resource.py @@ -18,6 +18,7 @@ import os import uuid import glance_store as store +import mock from oslo.config import cfg from oslo.serialization import jsonutils import six @@ -26,6 +27,7 @@ import webob import glance.api.v2.images from glance.common import exception +from glance import domain import glance.schema from glance.tests.unit import base import glance.tests.unit.utils as unit_test_utils @@ -683,6 +685,38 @@ class TestImagesController(base.IsolatedUnitTest): request, image=image, extra_properties={}, tags=[]) + def test_create_unexpected_property(self): + request = unit_test_utils.get_fake_request() + image_properties = {'unexpected': 'unexpected'} + image = {'name': 'image-1'} + with mock.patch.object(domain.ImageFactory, 'new_image', + side_effect=TypeError): + self.assertRaises(webob.exc.HTTPBadRequest, + self.controller.create, request, image=image, + extra_properties=image_properties, tags=[]) + + def test_create_reserved_property(self): + request = unit_test_utils.get_fake_request() + image_properties = {'reserved': 'reserved'} + image = {'name': 'image-1'} + with mock.patch.object(domain.ImageFactory, 'new_image', + side_effect=exception.ReservedProperty( + property='reserved')): + self.assertRaises(webob.exc.HTTPForbidden, + self.controller.create, request, image=image, + extra_properties=image_properties, tags=[]) + + def test_create_readonly_property(self): + request = unit_test_utils.get_fake_request() + image_properties = {'readonly': 'readonly'} + image = {'name': 'image-1'} + with mock.patch.object(domain.ImageFactory, 'new_image', + side_effect=exception.ReadonlyProperty( + property='readonly')): + self.assertRaises(webob.exc.HTTPForbidden, + self.controller.create, request, image=image, + extra_properties=image_properties, tags=[]) + def test_update_no_changes(self): request = unit_test_utils.get_fake_request() output = self.controller.update(request, UUID1, changes=[])