summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-06-15 15:28:39 -0400
committerBrian Waldon <brian.waldon@rackspace.com>2011-06-15 15:28:39 -0400
commite35878070ce594d3c9db2f433dcf3f3f1441a497 (patch)
tree0370a76444f214407334d66b6c39cff8e9041b80
parent57932d53e7cc5389b7d53fd8875a684f70e2eb67 (diff)
downloadnova-e35878070ce594d3c9db2f433dcf3f3f1441a497.tar.gz
nova-e35878070ce594d3c9db2f433dcf3f3f1441a497.tar.xz
nova-e35878070ce594d3c9db2f433dcf3f3f1441a497.zip
adding server existence check to server metadata resource
-rw-r--r--nova/api/openstack/server_metadata.py15
-rw-r--r--nova/tests/api/openstack/test_server_metadata.py50
2 files changed, 64 insertions, 1 deletions
diff --git a/nova/api/openstack/server_metadata.py b/nova/api/openstack/server_metadata.py
index 57666f6b7..ec9e10496 100644
--- a/nova/api/openstack/server_metadata.py
+++ b/nova/api/openstack/server_metadata.py
@@ -18,9 +18,10 @@
from webob import exc
from nova import compute
-from nova import quota
from nova.api.openstack import faults
from nova.api.openstack import wsgi
+from nova import exception
+from nova import quota
class Controller(object):
@@ -42,14 +43,23 @@ class Controller(object):
expl = _('No Request Body')
raise exc.HTTPBadRequest(explanation=expl)
+ def _check_server_exists(self, context, server_id):
+ try:
+ self.compute_api.routing_get(context, server_id)
+ except exception.InstanceNotFound:
+ msg = _('Server does not exist')
+ raise exc.HTTPNotFound(explanation=msg)
+
def index(self, req, server_id):
""" Returns the list of metadata for a given instance """
context = req.environ['nova.context']
+ self._check_server_exists(context, server_id)
return self._get_metadata(context, server_id)
def create(self, req, server_id, body):
self._check_body(body)
context = req.environ['nova.context']
+ self._check_server_exists(context, server_id)
metadata = body.get('metadata')
try:
self.compute_api.update_or_create_instance_metadata(context,
@@ -62,6 +72,7 @@ class Controller(object):
def update(self, req, server_id, id, body):
self._check_body(body)
context = req.environ['nova.context']
+ self._check_server_exists(context, server_id)
if not id in body:
expl = _('Request body and URI mismatch')
raise exc.HTTPBadRequest(explanation=expl)
@@ -80,6 +91,7 @@ class Controller(object):
def show(self, req, server_id, id):
""" Return a single metadata item """
context = req.environ['nova.context']
+ self._check_server_exists(context, server_id)
data = self._get_metadata(context, server_id)
if id in data['metadata']:
return {id: data['metadata'][id]}
@@ -89,6 +101,7 @@ class Controller(object):
def delete(self, req, server_id, id):
""" Deletes an existing metadata """
context = req.environ['nova.context']
+ self._check_server_exists(context, server_id)
self.compute_api.delete_instance_metadata(context, server_id, id)
def _handle_quota_error(self, error):
diff --git a/nova/tests/api/openstack/test_server_metadata.py b/nova/tests/api/openstack/test_server_metadata.py
index b583d40fe..b484ad6a1 100644
--- a/nova/tests/api/openstack/test_server_metadata.py
+++ b/nova/tests/api/openstack/test_server_metadata.py
@@ -21,6 +21,7 @@ import unittest
import webob
+from nova import exception
from nova import flags
from nova.api import openstack
from nova.tests.api.openstack import fakes
@@ -66,6 +67,12 @@ def stub_max_server_metadata():
metadata['metadata']['key%i' % num] = "blah"
return metadata
+def return_server(context, server_id):
+ return {'id': server_id}
+
+def return_server_nonexistant(context, server_id):
+ raise exception.InstanceNotFound()
+
class ServerMetaDataTest(unittest.TestCase):
@@ -76,6 +83,7 @@ class ServerMetaDataTest(unittest.TestCase):
fakes.FakeAuthDatabase.data = {}
fakes.stub_out_auth(self.stubs)
fakes.stub_out_key_pair_funcs(self.stubs)
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
def tearDown(self):
self.stubs.UnsetAll()
@@ -92,6 +100,13 @@ class ServerMetaDataTest(unittest.TestCase):
self.assertEqual('application/json', res.headers['Content-Type'])
self.assertEqual('value1', res_dict['metadata']['key1'])
+ def test_index_nonexistant_server(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
+ req = webob.Request.blank('/v1.1/servers/1/meta')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+
def test_index_no_data(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_empty_server_metadata)
@@ -114,6 +129,13 @@ class ServerMetaDataTest(unittest.TestCase):
self.assertEqual('application/json', res.headers['Content-Type'])
self.assertEqual('value5', res_dict['key5'])
+ def test_show_nonexistant_server(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
+ req = webob.Request.blank('/v1.1/servers/1/meta/key5')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+
def test_show_meta_not_found(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_empty_server_metadata)
@@ -132,6 +154,14 @@ class ServerMetaDataTest(unittest.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(200, res.status_int)
+ def test_delete_nonexistant_server(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
+ req = webob.Request.blank('/v1.1/servers/1/meta/key5')
+ req.environ['api.version'] = '1.1'
+ req.method = 'DELETE'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+
def test_create(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
return_create_instance_metadata)
@@ -156,6 +186,16 @@ class ServerMetaDataTest(unittest.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(400, res.status_int)
+ def test_create_nonexistant_server(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
+ req = webob.Request.blank('/v1.1/servers/100/meta')
+ req.environ['api.version'] = '1.1'
+ req.method = 'POST'
+ req.body = '{"metadata": {"key1": "value1"}}'
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+
def test_update_item(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
return_create_instance_metadata)
@@ -170,6 +210,16 @@ class ServerMetaDataTest(unittest.TestCase):
res_dict = json.loads(res.body)
self.assertEqual('value1', res_dict['key1'])
+ def test_update_item_nonexistant_server(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
+ req = webob.Request.blank('/v1.1/servers/asdf/100/key1')
+ req.environ['api.version'] = '1.1'
+ req.method = 'PUT'
+ req.body = '{"key1": "value1"}'
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+
def test_update_item_empty_body(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create',
return_create_instance_metadata)