diff --git a/neutron/common/constants.py b/neutron/common/constants.py index 158e34245ee..59066903b11 100644 --- a/neutron/common/constants.py +++ b/neutron/common/constants.py @@ -152,3 +152,8 @@ DEVICE_NAME_MAX_LEN = 15 TAP_DEVICE_PREFIX = 'tap' ATTRIBUTES_TO_UPDATE = 'attributes_to_update' + +# Maximum value integer can take in MySQL and PostgreSQL +# In SQLite integer can be stored in 1, 2, 3, 4, 6, or 8 bytes, +# but here it will be limited by this value for consistency. +DB_INTEGER_MAX_VALUE = 2 ** 31 - 1 diff --git a/neutron/extensions/quotasv2.py b/neutron/extensions/quotasv2.py index 4fa9bf28056..19fa85dbff2 100644 --- a/neutron/extensions/quotasv2.py +++ b/neutron/extensions/quotasv2.py @@ -13,8 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import sys - from oslo.config import cfg import webob @@ -22,6 +20,7 @@ from neutron.api import extensions from neutron.api.v2 import attributes from neutron.api.v2 import base from neutron.api.v2 import resource +from neutron.common import constants as const from neutron.common import exceptions as n_exc from neutron import manager from neutron.openstack.common import importutils @@ -55,7 +54,7 @@ class QuotaSetsController(wsgi.Controller): 'allow_post': False, 'allow_put': True, 'convert_to': attributes.convert_to_int, - 'validate': {'type:range': [-1, sys.maxsize]}, + 'validate': {'type:range': [-1, const.DB_INTEGER_MAX_VALUE]}, 'is_visible': True} self._update_extended_attributes = False diff --git a/neutron/tests/unit/test_quota_ext.py b/neutron/tests/unit/test_quota_ext.py index 262fb044115..d330b5f67d9 100644 --- a/neutron/tests/unit/test_quota_ext.py +++ b/neutron/tests/unit/test_quota_ext.py @@ -18,11 +18,13 @@ import sys import mock from oslo.config import cfg import testtools +from webob import exc import webtest from neutron.api import extensions from neutron.api.v2 import attributes from neutron.common import config +from neutron.common import constants from neutron.common import exceptions from neutron import context from neutron.db import quota_db @@ -188,6 +190,16 @@ class QuotaExtensionDbTestCase(QuotaExtensionTestCase): expect_errors=True) self.assertEqual(400, res.status_int) + def test_update_quotas_with_out_of_range_integer_returns_400(self): + tenant_id = 'tenant_id1' + env = {'neutron.context': context.Context('', tenant_id, + is_admin=True)} + quotas = {'quota': {'network': constants.DB_INTEGER_MAX_VALUE + 1}} + res = self.api.put(_get_path('quotas', id=tenant_id, fmt=self.fmt), + self.serialize(quotas), extra_environ=env, + expect_errors=True) + self.assertEqual(exc.HTTPBadRequest.code, res.status_int) + def test_update_quotas_to_unlimited(self): tenant_id = 'tenant_id1' env = {'neutron.context': context.Context('', tenant_id,