summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>2013-03-04 22:55:34 -0500
committerMauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>2013-03-05 08:00:54 -0500
commit6b3bba9141c7fdc4b00025f7e6ee8d980e41ec9a (patch)
tree4b4e83c52e34c6797f72f39bd042b28a49cb43e9
parent71047567ee25bacf664f9b6387d9a5c53c63622e (diff)
Fix 'to integer' conversion of max and min count values
Until now when you used values non-integer to max_count and/or min_count the coercion worked like: min_count = int(2.5) so min_count received 2 instead of raise bad request. Convert to string before coerce to int solves the problem since int coercion cannot convert from a string which is not a perfect int. Change-Id: Ifaa9910e13614554d1769e71e8eba9587ec5a13b
-rw-r--r--nova/api/openstack/compute/servers.py4
-rw-r--r--nova/tests/api/openstack/compute/test_servers.py46
2 files changed, 48 insertions, 2 deletions
diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py
index 05aa7b238..aec082bad 100644
--- a/nova/api/openstack/compute/servers.py
+++ b/nova/api/openstack/compute/servers.py
@@ -830,7 +830,7 @@ class Controller(wsgi.Controller):
max_count = server_dict.get('max_count', min_count)
try:
- min_count = int(min_count)
+ min_count = int(str(min_count))
except ValueError:
msg = _('min_count must be an integer value')
raise exc.HTTPBadRequest(explanation=msg)
@@ -839,7 +839,7 @@ class Controller(wsgi.Controller):
raise exc.HTTPBadRequest(explanation=msg)
try:
- max_count = int(max_count)
+ max_count = int(str(max_count))
except ValueError:
msg = _('max_count must be an integer value')
raise exc.HTTPBadRequest(explanation=msg)
diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py
index 92a8fc316..638ef79b0 100644
--- a/nova/tests/api/openstack/compute/test_servers.py
+++ b/nova/tests/api/openstack/compute/test_servers.py
@@ -2042,6 +2042,52 @@ class ServersControllerCreateTest(test.TestCase):
self.assertRaises(webob.exc.HTTPBadRequest,
self._test_create_extra, params, no_image=True)
+ def test_create_multiple_instance_with_non_integer_max_count(self):
+ self.ext_mgr.extensions = {'os-multiple-create': 'fake'}
+ image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6'
+ flavor_ref = 'http://localhost/123/flavors/3'
+ body = {
+ 'server': {
+ 'max_count': 2.5,
+ 'name': 'server_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'metadata': {'hello': 'world',
+ 'open': 'stack'},
+ 'personality': []
+ }
+ }
+
+ req = fakes.HTTPRequest.blank('/v2/fake/servers')
+ req.method = 'POST'
+ req.body = jsonutils.dumps(body)
+ req.headers["content-type"] = "application/json"
+ self.assertRaises(webob.exc.HTTPBadRequest,
+ self.controller.create, req, body)
+
+ def test_create_multiple_instance_with_non_integer_min_count(self):
+ self.ext_mgr.extensions = {'os-multiple-create': 'fake'}
+ image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6'
+ flavor_ref = 'http://localhost/123/flavors/3'
+ body = {
+ 'server': {
+ 'min_count': 2.5,
+ 'name': 'server_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'metadata': {'hello': 'world',
+ 'open': 'stack'},
+ 'personality': []
+ }
+ }
+
+ req = fakes.HTTPRequest.blank('/v2/fake/servers')
+ req.method = 'POST'
+ req.body = jsonutils.dumps(body)
+ req.headers["content-type"] = "application/json"
+ self.assertRaises(webob.exc.HTTPBadRequest,
+ self.controller.create, req, body)
+
def test_create_instance_image_ref_is_bookmark(self):
image_uuid = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6'
image_href = 'http://localhost/fake/images/%s' % image_uuid