summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-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)