diff options
| -rw-r--r-- | nova/api/openstack/v2/servers.py | 12 | ||||
| -rw-r--r-- | nova/tests/api/openstack/v2/test_servers.py | 39 |
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) |
