summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Erdfelt <johannes.erdfelt@rackspace.com>2011-08-14 03:20:52 +0000
committerTarmac <>2011-08-14 03:20:52 +0000
commitaca43c9c892a0aa8e07f8191a7c712d928f702ee (patch)
treedf14d1315a1a6d196df57c35ac32c4b0b872d47e
parent551edae9b40fb0049257f4cb858d0fa63e598ca8 (diff)
parent258e169a60d3551e789022ec23d6ae040c1f981e (diff)
Fix v1.1 /servers/<id> PUT request to match API documentation by returning 200 code and the server data in the body
-rw-r--r--nova/api/openstack/servers.py19
-rw-r--r--nova/tests/api/openstack/test_servers.py29
2 files changed, 29 insertions, 19 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 736fdf6ce..42e46a94a 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -163,7 +163,7 @@ class Controller(object):
@scheduler_api.redirect_handler
def update(self, req, id, body):
- """ Updates the server name or password """
+ """Update server name then pass on to version-specific controller"""
if len(req.body) == 0:
raise exc.HTTPUnprocessableEntity()
@@ -178,17 +178,15 @@ class Controller(object):
self.helper._validate_server_name(name)
update_dict['display_name'] = name.strip()
- self._parse_update(ctxt, id, body, update_dict)
-
try:
self.compute_api.update(ctxt, id, **update_dict)
except exception.NotFound:
raise exc.HTTPNotFound()
- return exc.HTTPNoContent()
+ return self._update(ctxt, req, id, body)
- def _parse_update(self, context, id, inst_dict, update_dict):
- pass
+ def _update(self, context, req, id, inst_dict):
+ return exc.HTTPNotImplemented()
@scheduler_api.redirect_handler
def action(self, req, id, body):
@@ -568,10 +566,11 @@ class ControllerV10(Controller):
def _limit_items(self, items, req):
return common.limited(items, req)
- def _parse_update(self, context, server_id, inst_dict, update_dict):
+ def _update(self, context, req, id, inst_dict):
if 'adminPass' in inst_dict['server']:
- self.compute_api.set_admin_password(context, server_id,
+ self.compute_api.set_admin_password(context, id,
inst_dict['server']['adminPass'])
+ return exc.HTTPNoContent()
def _action_resize(self, input_dict, req, id):
""" Resizes a given instance to the flavor size requested """
@@ -693,6 +692,10 @@ class ControllerV11(Controller):
LOG.info(msg)
raise exc.HTTPBadRequest(explanation=msg)
+ def _update(self, context, req, id, inst_dict):
+ instance = self.compute_api.routing_get(context, id)
+ return self._build_view(req, instance, is_detail=True)
+
def _action_resize(self, input_dict, req, id):
""" Resizes a given instance to the flavor size requested """
try:
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 290f6e990..1a4288ae7 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -134,8 +134,8 @@ def return_security_group(context, instance_id, security_group_id):
pass
-def instance_update(context, instance_id, kwargs):
- return stub_instance(instance_id)
+def instance_update(context, instance_id, values):
+ return stub_instance(instance_id, name=values.get('display_name'))
def instance_addresses(context, instance_id):
@@ -145,7 +145,7 @@ def instance_addresses(context, instance_id):
def stub_instance(id, user_id='fake', project_id='fake', private_address=None,
public_addresses=None, host=None, power_state=0,
reservation_id="", uuid=FAKE_UUID, image_ref="10",
- flavor_id="1", interfaces=None):
+ flavor_id="1", interfaces=None, name=None):
metadata = []
metadata.append(InstanceMetadata(key='seq', value=id))
@@ -161,7 +161,7 @@ def stub_instance(id, user_id='fake', project_id='fake', private_address=None,
host = str(host)
# ReservationID isn't sent back, hack it in there.
- server_name = "server%s" % id
+ server_name = name or "server%s" % id
if reservation_id != "":
server_name = "reservation_%s" % (reservation_id, )
@@ -1880,13 +1880,17 @@ class ServersTest(test.TestCase):
self.assertEqual(res.status_int, 400)
def test_update_server_name_v1_1(self):
+ self.stubs.Set(nova.db.api, 'instance_get',
+ return_server_with_attributes(name='server_test'))
req = webob.Request.blank('/v1.1/servers/1')
req.method = 'PUT'
req.content_type = 'application/json'
- req.body = json.dumps({'server': {'name': 'new-name'}})
+ req.body = json.dumps({'server': {'name': 'server_test'}})
res = req.get_response(fakes.wsgi_app())
- self.assertEqual(res.status_int, 204)
- self.assertEqual(res.body, '')
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], 1)
+ self.assertEqual(res_dict['server']['name'], 'server_test')
def test_update_server_adminPass_ignored_v1_1(self):
inst_dict = dict(name='server_test', adminPass='bacon')
@@ -1897,16 +1901,19 @@ class ServersTest(test.TestCase):
self.assertEqual(params, filtered_dict)
return filtered_dict
- self.stubs.Set(nova.db.api, 'instance_update',
- server_update)
+ self.stubs.Set(nova.db.api, 'instance_update', server_update)
+ self.stubs.Set(nova.db.api, 'instance_get',
+ return_server_with_attributes(name='server_test'))
req = webob.Request.blank('/v1.1/servers/1')
req.method = 'PUT'
req.content_type = "application/json"
req.body = self.body
res = req.get_response(fakes.wsgi_app())
- self.assertEqual(res.status_int, 204)
- self.assertEqual(res.body, '')
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], 1)
+ self.assertEqual(res_dict['server']['name'], 'server_test')
def test_create_backup_schedules(self):
req = webob.Request.blank('/v1.0/servers/1/backup_schedule')