From: Elena Ezhova Date: Mon, 25 Aug 2014 14:44:32 +0000 (+0400) Subject: Fix quota limit range validator X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=3ca85460a178a18dea60399fd369ed84b17721dc;p=openstack-build%2Fneutron-build.git Fix quota limit range validator In Quota model limit is defined with Integer type which in case of MySQL and PostgreSQL is always stored in 4 bytes. At the same time, the current validator checks that the value does not exceed sys.maxsize which depends on whether the system is 32-bit or 64-bit based. In SQLite Integer can be stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value. Nevertheless, assume that it can not exceed 4 bytes for consistency. Limited the upper bound of the validator with 2**31 - 1. Added a unit test. Closes-Bug: #1338479 Change-Id: Icefa2fc228e4255a022d586cab4590607953d1ee --- diff --git a/neutron/common/constants.py b/neutron/common/constants.py index 158e34245..59066903b 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 4fa9bf280..19fa85dbf 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 262fb0441..d330b5f67 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,