summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Erdfelt <johannes.erdfelt@rackspace.com>2011-12-20 20:34:15 +0000
committerJohannes Erdfelt <johannes.erdfelt@rackspace.com>2011-12-20 21:00:31 +0000
commit81559a88884fdde14d6ca6bd788c0e37ca3d56cf (patch)
treef7ac0482d49beb441eec1f1ddab155932b14a481
parent5895a74c8b90f9b5436d0961d3b2b319f64bc826 (diff)
downloadnova-81559a88884fdde14d6ca6bd788c0e37ca3d56cf.tar.gz
nova-81559a88884fdde14d6ca6bd788c0e37ca3d56cf.tar.xz
nova-81559a88884fdde14d6ca6bd788c0e37ca3d56cf.zip
Set Location header in server create and rebuild actions
The API documentation states that the Location header should be filled with the URL of the server. This change implemnts this for both the create and rebuild actions. Change-Id: Ic0372aeaea58c9288065e2cfc222ca9257d35c87
-rw-r--r--nova/api/openstack/v2/servers.py12
-rw-r--r--nova/tests/api/openstack/v2/test_servers.py39
2 files changed, 51 insertions, 0 deletions
diff --git a/nova/api/openstack/v2/servers.py b/nova/api/openstack/v2/servers.py
index 049a17ef6..e2d84b688 100644
--- a/nova/api/openstack/v2/servers.py
+++ b/nova/api/openstack/v2/servers.py
@@ -876,13 +876,25 @@ class Controller(wsgi.Controller):
class HeadersSerializer(wsgi.ResponseHeadersSerializer):
+ def _add_server_location(self, response, data):
+ link = filter(lambda l: l['rel'] == 'self', data['server']['links'])
+ if link:
+ response.headers['Location'] = link[0]['href']
+
def create(self, response, data):
+ if 'server' in data:
+ self._add_server_location(response, data)
response.status_int = 202
def delete(self, response, data):
response.status_int = 204
def action(self, response, data):
+ # FIXME(jerdfelt): This is kind of a hack. Unfortunately the original
+ # action requested isn't available to us, so we need to look at the
+ # response to see if it looks like a rebuild response.
+ if data.get('server', {}).get('status') == 'REBUILD':
+ self._add_server_location(response, data)
response.status_int = 202
diff --git a/nova/tests/api/openstack/v2/test_servers.py b/nova/tests/api/openstack/v2/test_servers.py
index 23621fd7f..a792a8998 100644
--- a/nova/tests/api/openstack/v2/test_servers.py
+++ b/nova/tests/api/openstack/v2/test_servers.py
@@ -3813,3 +3813,42 @@ class ServerXMLSerializationTest(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
+
+
+class ServerHeadersSerializationTest(test.TestCase):
+ def test_create_location(self):
+ selfhref = 'http://localhost/v2/fake/servers/%s' % FAKE_UUID
+ bookhref = 'http://localhost/fake/servers/%s' % FAKE_UUID
+
+ serializer = servers.HeadersSerializer()
+ response = webob.Response()
+ server = {
+ 'links': [{
+ 'rel': 'self',
+ 'href': selfhref,
+ }, {
+ 'rel': 'bookmark',
+ 'href': bookhref,
+ }],
+ }
+ serializer.create(response, {'server': server})
+ self.assertEqual(response.headers['Location'], selfhref)
+
+ def test_rebuild_location(self):
+ selfhref = 'http://localhost/v2/fake/servers/%s' % FAKE_UUID
+ bookhref = 'http://localhost/fake/servers/%s' % FAKE_UUID
+
+ serializer = servers.HeadersSerializer()
+ response = webob.Response()
+ server = {
+ 'status': 'REBUILD',
+ 'links': [{
+ 'rel': 'self',
+ 'href': selfhref,
+ }, {
+ 'rel': 'bookmark',
+ 'href': bookhref,
+ }],
+ }
+ serializer.action(response, {'server': server})
+ self.assertEqual(response.headers['Location'], selfhref)