diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index 91c2a221d4ec..44e0bcf5a479 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -1105,6 +1105,8 @@ class ServersController(wsgi.Controller): 'createImage', id) except exception.Invalid as err: raise exc.HTTPBadRequest(explanation=err.format_message()) + except exception.OverQuota as e: + raise exc.HTTPForbidden(explanation=e.format_message()) # build location of newly-created image entity image_id = str(image['id']) diff --git a/nova/tests/unit/api/openstack/compute/test_server_actions.py b/nova/tests/unit/api/openstack/compute/test_server_actions.py index 5d09bd13faa0..f97c51bf9efa 100644 --- a/nova/tests/unit/api/openstack/compute/test_server_actions.py +++ b/nova/tests/unit/api/openstack/compute/test_server_actions.py @@ -913,7 +913,8 @@ class ServerActionsControllerTestV21(test.TestCase): self.controller._action_create_image, self.req, FAKE_UUID, body=body) - def _do_test_create_volume_backed_image(self, extra_properties): + def _do_test_create_volume_backed_image( + self, extra_properties, mock_vol_create_side_effect=None): def _fake_id(x): return '%s-%s-%s-%s' % (x * 8, x * 4, x * 4, x * 12) @@ -976,6 +977,9 @@ class ServerActionsControllerTestV21(test.TestCase): return_value=snapshot), ) as (mock_quiesce, mock_vol_get, mock_vol_create): + if mock_vol_create_side_effect: + mock_vol_create.side_effect = mock_vol_create_side_effect + response = self.controller._action_create_image(self.req, FAKE_UUID, body=body) @@ -1014,6 +1018,13 @@ class ServerActionsControllerTestV21(test.TestCase): self._do_test_create_volume_backed_image(dict(ImageType='Gold', ImageVersion='2.0')) + def test_create_volume_backed_image_cinder_over_quota(self): + self.assertRaises( + webob.exc.HTTPForbidden, + self._do_test_create_volume_backed_image, {}, + mock_vol_create_side_effect=exception.OverQuota( + overs='snapshot')) + def _test_create_volume_backed_image_with_metadata_from_volume( self, extra_metadata=None):