summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaiwei Xu <xu-haiwei@mxw.nes.nec.co.jp>2013-02-12 01:37:27 +0000
committerHaiwei Xu <xu-haiwei@mxw.nes.nec.co.jp>2013-02-13 10:32:48 +0000
commit2c1bb9efd9287381f16979899bf25022822bf95b (patch)
tree6b59fd6cd6382c5c20c93a322caf4d54aad669eb
parentd980805880c681881504e269e03130e4452630ab (diff)
downloadnova-2c1bb9efd9287381f16979899bf25022822bf95b.tar.gz
nova-2c1bb9efd9287381f16979899bf25022822bf95b.tar.xz
nova-2c1bb9efd9287381f16979899bf25022822bf95b.zip
Check the length of flavor name in "flavor-create"
Fixes bug 1102280 The length of flavor name is defined 255 charaters in database. But flavor name can be more than 255 characters when a flavor is created. This patch adds the length check of flavor name. Change-Id: If9db879e5f6340594b215b057a29d03c6fef1503
-rw-r--r--nova/api/openstack/compute/servers.py17
-rw-r--r--nova/compute/instance_types.py3
-rw-r--r--nova/tests/test_instance_types.py11
-rw-r--r--nova/tests/test_utils.py15
-rw-r--r--nova/utils.py22
5 files changed, 56 insertions, 12 deletions
diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py
index 5858ad640..c10c6e1b3 100644
--- a/nova/api/openstack/compute/servers.py
+++ b/nova/api/openstack/compute/servers.py
@@ -563,18 +563,11 @@ class Controller(wsgi.Controller):
return instance
def _check_string_length(self, value, name, max_length=None):
- if not isinstance(value, basestring):
- msg = _("%s is not a string or unicode") % name
- raise exc.HTTPBadRequest(explanation=msg)
-
- if not value.strip():
- msg = _("%s is an empty string") % name
- raise exc.HTTPBadRequest(explanation=msg)
-
- if max_length and len(value) > max_length:
- msg = _("%(name)s can be at most %(max_length)s "
- "characters.") % locals()
- raise exc.HTTPBadRequest(explanation=msg)
+ try:
+ utils.check_string_length(value, name, min_length=1,
+ max_length=max_length)
+ except exception.InvalidInput as e:
+ raise exc.HTTPBadRequest(explanation=str(e))
def _validate_server_name(self, value):
self._check_string_length(value, 'Server name', max_length=255)
diff --git a/nova/compute/instance_types.py b/nova/compute/instance_types.py
index 045a24d4d..4cc5d5d4e 100644
--- a/nova/compute/instance_types.py
+++ b/nova/compute/instance_types.py
@@ -86,6 +86,9 @@ def create(name, memory, vcpus, root_gb, ephemeral_gb=None, flavorid=None,
'rxtx_factor': rxtx_factor,
}
+ # ensure name do not exceed 255 characters
+ utils.check_string_length(name, 'name', min_length=1, max_length=255)
+
# ensure name does not contain any special characters
invalid_name = INVALID_NAME_REGEX.search(name)
if invalid_name:
diff --git a/nova/tests/test_instance_types.py b/nova/tests/test_instance_types.py
index 0829df2c6..6ae28a1c9 100644
--- a/nova/tests/test_instance_types.py
+++ b/nova/tests/test_instance_types.py
@@ -142,6 +142,17 @@ class InstanceTypeTestCase(test.TestCase):
self.assertRaises(exception.InvalidInput, instance_types.create,
name, 256, 1, 120, 100, flavorid)
+ def test_instance_type_create_with_long_flavor_name(self):
+ # Flavor name with 255 characters or less is valid.
+ name = 'a' * 255
+ inst_type = instance_types.create(name, 64, 1, 120, flavorid=11)
+ self.assertEqual(inst_type['name'], name)
+
+ # Flavor name which is more than 255 characters will cause error.
+ name = 'a' * 256
+ self.assertRaises(exception.InvalidInput, instance_types.create,
+ name, 64, 1, 120, flavorid=11)
+
def test_add_instance_type_access(self):
user_id = 'fake'
project_id = 'fake'
diff --git a/nova/tests/test_utils.py b/nova/tests/test_utils.py
index aaa826a70..8fb173385 100644
--- a/nova/tests/test_utils.py
+++ b/nova/tests/test_utils.py
@@ -964,3 +964,18 @@ class GetCallArgsTestCase(test.TestCase):
self.assertEqual(3, callargs['red'])
self.assertTrue('blue' in callargs)
self.assertEqual(None, callargs['blue'])
+
+
+class StringLengthTestCase(test.TestCase):
+ def test_check_string_length(self):
+ self.assertIsNone(utils.check_string_length(
+ 'test', 'name', max_length=255))
+ self.assertRaises(exception.InvalidInput,
+ utils.check_string_length,
+ 11, 'name', max_length=255)
+ self.assertRaises(exception.InvalidInput,
+ utils.check_string_length,
+ '', 'name', min_length=1)
+ self.assertRaises(exception.InvalidInput,
+ utils.check_string_length,
+ 'a' * 256, 'name', max_length=255)
diff --git a/nova/utils.py b/nova/utils.py
index 7ad810504..57f9433df 100644
--- a/nova/utils.py
+++ b/nova/utils.py
@@ -1341,3 +1341,25 @@ class ExceptionHelper(object):
except rpc_common.ClientException, e:
raise (e._exc_info[1], None, e._exc_info[2])
return wrapper
+
+
+def check_string_length(value, name, min_length=0, max_length=None):
+ """Check the length of specified string
+ :param value: the value of the string
+ :param name: the name of the string
+ :param min_length: the min_length of the string
+ :param max_length: the max_length of the string
+ """
+ if not isinstance(value, basestring):
+ msg = _("%s is not a string or unicode") % name
+ raise exception.InvalidInput(message=msg)
+
+ if len(value) < min_length:
+ msg = _("%(name)s has less than %(min_length)s "
+ "characters.") % locals()
+ raise exception.InvalidInput(message=msg)
+
+ if max_length and len(value) > max_length:
+ msg = _("%(name)s has more than %(max_length)s "
+ "characters.") % locals()
+ raise exception.InvalidInput(message=msg)