Validate maximum limit for quota
Currently, when updating quota using limit larger than 2**31 -1, there will be a DBError. The maximum limit needs to be validated. And the maximum value is defined by SQL integer type INT, which is a general value: http://dev.mysql.com/doc/refman/5.0/en/integer-types.html http://www.postgresql.org/docs/9.1/static/datatype-numeric.html Change-Id: Idf890c57342378d0a71f6b18eb42425d463b13ef Closes-bug: #1433052
This commit is contained in:
parent
6969f270c5
commit
19c01509ca
|
@ -20,6 +20,7 @@ import webob
|
||||||
from nova.api.openstack import extensions
|
from nova.api.openstack import extensions
|
||||||
from nova.api.openstack import wsgi
|
from nova.api.openstack import wsgi
|
||||||
import nova.context
|
import nova.context
|
||||||
|
from nova import db
|
||||||
from nova import exception
|
from nova import exception
|
||||||
from nova.i18n import _
|
from nova.i18n import _
|
||||||
from nova import objects
|
from nova import objects
|
||||||
|
@ -65,11 +66,16 @@ class QuotaSetsController(wsgi.Controller):
|
||||||
return dict(quota_set=result)
|
return dict(quota_set=result)
|
||||||
|
|
||||||
def _validate_quota_limit(self, resource, limit, minimum, maximum):
|
def _validate_quota_limit(self, resource, limit, minimum, maximum):
|
||||||
# NOTE: -1 is a flag value for unlimited
|
# NOTE: -1 is a flag value for unlimited, maximum value is limited
|
||||||
if limit < -1:
|
# by SQL standard integer type `INT` which is `0x7FFFFFFF`, it's a
|
||||||
|
# general value for SQL, using a hardcoded value here is not a
|
||||||
|
# `nice` way, but it seems like the only way for now:
|
||||||
|
# http://dev.mysql.com/doc/refman/5.0/en/integer-types.html
|
||||||
|
# http://www.postgresql.org/docs/9.1/static/datatype-numeric.html
|
||||||
|
if limit < -1 or limit > db.MAX_INT:
|
||||||
msg = (_("Quota limit %(limit)s for %(resource)s "
|
msg = (_("Quota limit %(limit)s for %(resource)s "
|
||||||
"must be -1 or greater.") %
|
"must be in the range of -1 and %(max)s.") %
|
||||||
{'limit': limit, 'resource': resource})
|
{'limit': limit, 'resource': resource, 'max': db.MAX_INT})
|
||||||
raise webob.exc.HTTPBadRequest(explanation=msg)
|
raise webob.exc.HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
def conv_inf(value):
|
def conv_inf(value):
|
||||||
|
|
|
@ -15,12 +15,14 @@
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from nova.api.validation import parameter_types
|
from nova.api.validation import parameter_types
|
||||||
|
from nova import db
|
||||||
|
|
||||||
common_quota = {
|
common_quota = {
|
||||||
'type': ['integer', 'string'],
|
'type': ['integer', 'string'],
|
||||||
'pattern': '^-?[0-9]+$',
|
'pattern': '^-?[0-9]+$',
|
||||||
# -1 is a flag value for unlimited
|
# -1 is a flag value for unlimited
|
||||||
'minimum': -1
|
'minimum': -1,
|
||||||
|
'maximum': db.MAX_INT
|
||||||
}
|
}
|
||||||
|
|
||||||
quota_resources = {
|
quota_resources = {
|
||||||
|
|
|
@ -22,6 +22,7 @@ import webob
|
||||||
from nova.api.openstack.compute.contrib import quotas as quotas_v2
|
from nova.api.openstack.compute.contrib import quotas as quotas_v2
|
||||||
from nova.api.openstack.compute.plugins.v3 import quota_sets as quotas_v21
|
from nova.api.openstack.compute.plugins.v3 import quota_sets as quotas_v21
|
||||||
from nova.api.openstack import extensions
|
from nova.api.openstack import extensions
|
||||||
|
from nova import db
|
||||||
from nova import exception
|
from nova import exception
|
||||||
from nova import quota
|
from nova import quota
|
||||||
from nova import test
|
from nova import test
|
||||||
|
@ -167,6 +168,11 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
|
||||||
self.controller._validate_quota_limit,
|
self.controller._validate_quota_limit,
|
||||||
resource, 50, -1, -1)
|
resource, 50, -1, -1)
|
||||||
|
|
||||||
|
# Invalid - limit is larger than 0x7FFFFFFF
|
||||||
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
|
self.controller._validate_quota_limit,
|
||||||
|
resource, db.MAX_INT + 1, -1, -1)
|
||||||
|
|
||||||
def test_quotas_defaults(self):
|
def test_quotas_defaults(self):
|
||||||
uri = '/v2/fake_tenant/os-quota-sets/fake_tenant/defaults'
|
uri = '/v2/fake_tenant/os-quota-sets/fake_tenant/defaults'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue