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
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
# License for the specific language governing permissions and limitations
# under the License.
-import sys
-
from oslo.config import cfg
import webob
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
'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
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
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,