summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaveed Massjouni <naveedm9@gmail.com>2011-03-17 16:02:37 -0400
committerNaveed Massjouni <naveedm9@gmail.com>2011-03-17 16:02:37 -0400
commite138e0836922ee0608feefbff5e4e5d03ad14197 (patch)
tree7f84385070b7855d4de2f637a97ef8cf3e3eb99e
parent1bfb97e470876f8683c559a19cd14cc3b375b1c2 (diff)
Now returns a 400 for a create server request with invalid hrefs for
imageRef/flavorRef values. Also added tests.
-rw-r--r--nova/api/openstack/common.py12
-rw-r--r--nova/api/openstack/servers.py5
-rw-r--r--nova/tests/api/openstack/test_servers.py64
3 files changed, 37 insertions, 44 deletions
diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py
index 74ac21024..b224cbfb4 100644
--- a/nova/api/openstack/common.py
+++ b/nova/api/openstack/common.py
@@ -15,9 +15,10 @@
# License for the specific language governing permissions and limitations
# under the License.
-import webob.exc
-
+import re
from nova import exception
+from webob import exc
+import webob.exc
def limited(items, request, max_limit=1000):
@@ -74,3 +75,10 @@ def get_image_id_from_image_hash(image_service, context, image_hash):
if abs(hash(image_id)) == int(image_hash):
return image_id
raise exception.NotFound(image_hash)
+
+
+def get_id_from_href(href):
+ m = re.match(r'http.+/.+/(\d)+$', href)
+ if not m:
+ raise exc.HTTPBadRequest(_('could not parse id from href'))
+ return int(m.group(1))
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index f03225b55..6f25d10bd 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -512,7 +512,6 @@ class Controller(wsgi.Controller):
return kernel_id, ramdisk_id
-
class ControllerV10(Controller):
def _image_id_from_req_data(self, data):
return data['server']['imageId']
@@ -532,11 +531,11 @@ class ControllerV10(Controller):
class ControllerV11(Controller):
def _image_id_from_req_data(self, data):
href = data['server']['imageRef']
- return href.split('/')[-1]
+ return common.get_id_from_href(href)
def _flavor_id_from_req_data(self, data):
href = data['server']['flavorRef']
- return href.split('/')[-1]
+ return common.get_id_from_href(href)
def _get_view_builder(self, req):
base_url = req.application_url
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 846af5c3a..6e78db9da 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -239,7 +239,7 @@ class ServersTest(test.TestCase):
servers = json.loads(res.body)['servers']
self.assertEqual([s['id'] for s in servers], [1, 2])
- def _test_create_instance_helper(self):
+ def _setup_for_create_instance(self):
"""Shared implementation for tests below that create instance"""
def instance_create(context, inst):
return {'id': '1', 'display_name': 'server_test'}
@@ -276,6 +276,9 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.api.openstack.common,
"get_image_id_from_image_hash", image_id_from_hash)
+ def _test_create_instance_helper(self):
+ self._setup_for_create_instance()
+
body = dict(server=dict(
name='server_test', imageId=3, flavorId=2,
metadata={'hello': 'world', 'open': 'stack'},
@@ -296,41 +299,15 @@ class ServersTest(test.TestCase):
self.assertEqual(3, server['imageId'])
self.assertEqual(res.status_int, 200)
- def test_create_instance_v11(self):
- def instance_create(context, inst):
- return {'id': '1', 'display_name': 'server_test'}
-
- def server_update(context, id, params):
- return instance_create(context, id)
-
- def fake_method(*args, **kwargs):
- pass
-
- def project_get_network(context, user_id):
- return dict(id='1', host='localhost')
-
- def queue_get_for(context, *args):
- return 'network_topic'
-
- def kernel_ramdisk_mapping(*args, **kwargs):
- return (1, 1)
+ def test_create_instance(self):
+ self._test_create_instance_helper()
- def image_id_from_hash(*args, **kwargs):
- return 2
+ def test_create_instance_no_key_pair(self):
+ fakes.stub_out_key_pair_funcs(self.stubs, have_key_pair=False)
+ self._test_create_instance_helper()
- self.stubs.Set(nova.db.api, 'project_get_network', project_get_network)
- self.stubs.Set(nova.db.api, 'instance_create', instance_create)
- self.stubs.Set(nova.rpc, 'cast', fake_method)
- self.stubs.Set(nova.rpc, 'call', fake_method)
- self.stubs.Set(nova.db.api, 'instance_update',
- server_update)
- self.stubs.Set(nova.db.api, 'queue_get_for', queue_get_for)
- self.stubs.Set(nova.network.manager.VlanManager, 'allocate_fixed_ip',
- fake_method)
- self.stubs.Set(nova.api.openstack.servers.Controller,
- "_get_kernel_ramdisk_from_image", kernel_ramdisk_mapping)
- self.stubs.Set(nova.api.openstack.common,
- "get_image_id_from_image_hash", image_id_from_hash)
+ def test_create_instance_v11(self):
+ self._setup_for_create_instance()
imageRef = 'http://localhost/v1.1/images/2'
flavorRef = 'http://localhost/v1.1/flavors/3'
@@ -354,12 +331,21 @@ class ServersTest(test.TestCase):
self.assertEqual(imageRef, server['imageRef'])
self.assertEqual(res.status_int, 200)
- def test_create_instance(self):
- self._test_create_instance_helper()
+ def test_create_instance_v11_bad_href(self):
+ self._setup_for_create_instance()
- def test_create_instance_no_key_pair(self):
- fakes.stub_out_key_pair_funcs(self.stubs, have_key_pair=False)
- self._test_create_instance_helper()
+ imageRef = 'http://localhost/v1.1/images/asdf'
+ flavorRef = 'http://localhost/v1.1/flavors/3'
+ body = dict(server=dict(
+ name='server_test', imageRef=imageRef, flavorRef=flavorRef,
+ metadata={'hello': 'world', 'open': 'stack'},
+ personality={}))
+ req = webob.Request.blank('/v1.1/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 400)
def test_update_no_body(self):
req = webob.Request.blank('/v1.0/servers/1')