summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/servers.py11
-rw-r--r--nova/api/openstack/views/servers.py56
-rw-r--r--nova/tests/api/openstack/test_servers.py58
3 files changed, 111 insertions, 14 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index e3141934b..de35aca8d 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -47,11 +47,15 @@ class Controller(wsgi.Controller):
""" The Server API controller for the OpenStack API """
_serialization_metadata = {
- 'application/xml': {
+ "application/xml": {
"attributes": {
"server": ["id", "imageId", "name", "flavorId", "hostId",
"status", "progress", "adminPass", "flavorRef",
- "imageRef"]}}}
+ "imageRef"],
+ "link": ["rel", "type", "href"],
+ },
+ },
+ }
def __init__(self):
self.compute_api = compute.API()
@@ -513,6 +517,7 @@ class Controller(wsgi.Controller):
return kernel_id, ramdisk_id
+
class ControllerV10(Controller):
def _image_id_from_req_data(self, data):
return data['server']['imageId']
@@ -546,7 +551,7 @@ class ControllerV11(Controller):
base_url)
addresses_builder = nova.api.openstack.views.addresses.ViewBuilderV11()
return nova.api.openstack.views.servers.ViewBuilderV11(
- addresses_builder, flavor_builder, image_builder)
+ addresses_builder, flavor_builder, image_builder, base_url)
def _get_addresses_view_builder(self, req):
return nova.api.openstack.views.addresses.ViewBuilderV11(req)
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
index 8d47ac757..477f3caa0 100644
--- a/nova/api/openstack/views/servers.py
+++ b/nova/api/openstack/views/servers.py
@@ -39,12 +39,16 @@ class ViewBuilder(object):
Rackspace-like attributes for return
"""
if is_detail:
- return self._build_detail(inst)
+ server = self._build_detail(inst)
else:
- return self._build_simple(inst)
+ server = self._build_simple(inst)
+
+ self._build_extra(server, inst)
+
+ return dict(server=server)
def _build_simple(self, inst):
- return dict(server=dict(id=inst['id'], name=inst['display_name']))
+ return dict(id=inst['id'], name=inst['display_name'])
def _build_detail(self, inst):
power_mapping = {
@@ -79,7 +83,7 @@ class ViewBuilder(object):
self._build_image(inst_dict, inst)
self._build_flavor(inst_dict, inst)
- return dict(server=inst_dict)
+ return inst_dict
def _build_image(self, response, inst):
raise NotImplementedError()
@@ -87,6 +91,9 @@ class ViewBuilder(object):
def _build_flavor(self, response, inst):
raise NotImplementedError()
+ def _build_extra(self, response, inst):
+ pass
+
class ViewBuilderV10(ViewBuilder):
def _build_image(self, response, inst):
@@ -99,19 +106,50 @@ class ViewBuilderV10(ViewBuilder):
class ViewBuilderV11(ViewBuilder):
- def __init__(self, addresses_builder, flavor_builder, image_builder):
+ def __init__(self, addresses_builder, flavor_builder, image_builder,
+ base_url):
ViewBuilder.__init__(self, addresses_builder)
self.flavor_builder = flavor_builder
self.image_builder = image_builder
+ self.base_url = base_url
def _build_image(self, response, inst):
- if inst.get('image_id') == None:
+ image_id = inst.get("image_id", None)
+ if image_id == None:
return
- image_id = inst["image_id"]
response["imageRef"] = self.image_builder.generate_href(image_id)
def _build_flavor(self, response, inst):
- if inst.get('instance_type') == None:
+ flavor_id = inst.get("instance_type", None)
+ if flavor_id == None:
return
- flavor_id = inst["instance_type"]
response["flavorRef"] = self.flavor_builder.generate_href(flavor_id)
+
+ def _build_extra(self, response, inst):
+ self._build_links(response, inst)
+
+ def _build_links(self, response, inst):
+ href = self.generate_href(inst["id"])
+
+ links = [
+ {
+ "rel": "self",
+ "href": href,
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/json",
+ "href": href,
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/xml",
+ "href": href,
+ },
+ ]
+
+ response["links"] = links
+
+ def generate_href(self, server_id):
+ """Create an url that refers to a specific server id."""
+ return "%s/servers/%s" % (self.base_url, server_id)
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 6e78db9da..17689d405 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -164,6 +164,32 @@ class ServersTest(test.TestCase):
self.assertEqual(res_dict['server']['id'], 1)
self.assertEqual(res_dict['server']['name'], 'server1')
+ def test_get_server_by_id_v11(self):
+ req = webob.Request.blank('/v1.1/servers/1')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], 1)
+ self.assertEqual(res_dict['server']['name'], 'server1')
+
+ expected_links = [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/servers/1",
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/json",
+ "href": "http://localhost/v1.1/servers/1",
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/xml",
+ "href": "http://localhost/v1.1/servers/1",
+ },
+ ]
+
+ self.assertEqual(res_dict['server']['links'], expected_links)
+
def test_get_server_by_id_with_addresses(self):
private = "192.168.0.3"
public = ["1.2.3.4"]
@@ -186,7 +212,6 @@ class ServersTest(test.TestCase):
new_return_server = return_server_with_addresses(private, public)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
req = webob.Request.blank('/v1.1/servers/1')
- req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
self.assertEqual(res_dict['server']['id'], 1)
@@ -211,6 +236,36 @@ class ServersTest(test.TestCase):
self.assertEqual(s.get('imageId', None), None)
i += 1
+ def test_get_server_list_v11(self):
+ req = webob.Request.blank('/v1.1/servers')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+
+ for i,s in enumerate(res_dict['servers']):
+ self.assertEqual(s['id'], i)
+ self.assertEqual(s['name'], 'server%d' % i)
+ self.assertEqual(s.get('imageId', None), None)
+
+ expected_links = [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/servers/%d" % (i,),
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/json",
+ "href": "http://localhost/v1.1/servers/%d" % (i,),
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/xml",
+ "href": "http://localhost/v1.1/servers/%d" % (i,),
+ },
+ ]
+
+ self.assertEqual(s['links'], expected_links)
+
+
def test_get_servers_with_limit(self):
req = webob.Request.blank('/v1.0/servers?limit=3')
res = req.get_response(fakes.wsgi_app())
@@ -419,7 +474,6 @@ class ServersTest(test.TestCase):
def test_get_all_server_details_v1_1(self):
req = webob.Request.blank('/v1.1/servers/detail')
- req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)