summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/servers.py13
-rw-r--r--nova/api/openstack/views/servers.py42
-rw-r--r--nova/tests/api/openstack/test_servers.py32
3 files changed, 72 insertions, 15 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index ea8321e8d..7bb7250ba 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -27,7 +27,8 @@ from nova import wsgi
from nova import utils
from nova.api.openstack import common
from nova.api.openstack import faults
-from nova.api.openstack.views.servers import get_view_builder
+from nova.api.openstack.views import servers as servers_views
+from nova.api.openstack.views import addresses as addresses_views
from nova.auth import manager as auth_manager
from nova.compute import instance_types
from nova.compute import power_state
@@ -55,8 +56,8 @@ class Controller(wsgi.Controller):
def ips(self, req, id):
try:
instance = self.compute_api.get(req.environ['nova.context'], id)
- builder = get_view_builder(req)
- return builder._build_addresses(instance)
+ builder = addresses_views.get_view_builder(req)
+ return builder.build(instance)
except exception.NotFound:
return faults.Fault(exc.HTTPNotFound())
@@ -75,7 +76,7 @@ class Controller(wsgi.Controller):
"""
instance_list = self.compute_api.get_all(req.environ['nova.context'])
limited_list = common.limited(instance_list, req)
- builder = get_view_builder(req)
+ builder = servers_views.get_view_builder(req)
servers = [builder.build(inst, is_detail)['server']
for inst in limited_list]
return dict(servers=servers)
@@ -84,7 +85,7 @@ class Controller(wsgi.Controller):
""" Returns server details by server id """
try:
instance = self.compute_api.get(req.environ['nova.context'], id)
- builder = get_view_builder(req)
+ builder = servers_views.get_view_builder(req)
return builder.build(instance, is_detail=True)
except exception.NotFound:
return faults.Fault(exc.HTTPNotFound())
@@ -137,7 +138,7 @@ class Controller(wsgi.Controller):
metadata=metadata,
onset_files=env.get('onset_files', []))
- builder = get_view_builder(req)
+ builder = servers_views.get_view_builder(req)
server = builder.build(instances[0], is_detail=False)
password = "%s%s" % (server['server']['name'][:4],
utils.generate_password(12))
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
index 3ccfd8dba..950662747 100644
--- a/nova/api/openstack/views/servers.py
+++ b/nova/api/openstack/views/servers.py
@@ -1,6 +1,8 @@
import hashlib
from nova.compute import power_state
from nova.api.openstack.views import addresses as addresses_view
+from nova.api.openstack.views import flavors as flavors_view
+from nova.api.openstack.views import images as images_view
from nova import utils
@@ -12,7 +14,9 @@ def get_view_builder(req):
version = req.environ['nova.context'].version
addresses_builder = addresses_view.get_view_builder(req)
if version == '1.1':
- return ViewBuilder_1_1(addresses_builder)
+ flavor_builder = flavors_view.get_view_builder(req)
+ image_builder = images_view.get_view_builder(req)
+ return ViewBuilder_1_1(addresses_builder, flavor_builder, image_builder)
else:
return ViewBuilder_1_0(addresses_builder)
@@ -48,8 +52,10 @@ class ViewBuilder(object):
power_state.FAILED: 'error'}
inst_dict = {}
- mapped_keys = dict(status='state', imageId='image_id',
- flavorId='instance_type', name='display_name', id='id')
+ #mapped_keys = dict(status='state', imageId='image_id',
+ # flavorId='instance_type', name='display_name', id='id')
+
+ mapped_keys = dict(status='state', name='display_name', id='id')
for k, v in mapped_keys.iteritems():
inst_dict[k] = inst[v]
@@ -67,13 +73,39 @@ class ViewBuilder(object):
if inst['host']:
inst_dict['hostId'] = hashlib.sha224(inst['host']).hexdigest()
+ inst_dict = self._decorate_response(inst_dict, inst)
+
return dict(server=inst_dict)
+ def _build_image_data(self, response, inst):
+ raise NotImplementedError()
+
class ViewBuilder_1_0(ViewBuilder):
- pass
+ def _decorate_response(self, response, inst):
+ response["imageId"] = inst["image_id"]
+ response["flavorId"] = inst["instance_type"]
+ return response
class ViewBuilder_1_1(ViewBuilder):
- pass
+ def __init__(self, addresses_builder, flavor_builder, image_builder):
+ ViewBuilder.__init__(self, addresses_builder)
+ self.flavor_builder = flavor_builder
+ self.image_builder = image_builder
+
+ def _decorate_response(self, response, inst):
+ response = self._build_image_ref(response, inst)
+ response = self._build_flavor_ref(response, inst)
+ return response
+
+ def _build_image_ref(self, response, inst):
+ image_id = inst["image_id"]
+ response["imageRef"] = self.image_builder.generate_href(image_id)
+ return response
+
+ def _build_flavor_ref(self, response, inst):
+ flavor_id = inst["instance_type"]
+ response["flavorRef"]= self.flavor_builder.generate_href(flavor_id)
+ return response
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index b2446f194..b42cecfbb 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -79,7 +79,7 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None):
"admin_pass": "",
"user_id": user_id,
"project_id": "",
- "image_id": 10,
+ "image_id": "10",
"kernel_id": "",
"ramdisk_id": "",
"launch_index": 0,
@@ -92,7 +92,7 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None):
"local_gb": 0,
"hostname": "",
"host": None,
- "instance_type": "",
+ "instance_type": "1",
"user_data": "",
"reservation_id": "",
"mac_address": "",
@@ -353,7 +353,7 @@ class ServersTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status, '404 Not Found')
- def test_get_all_server_details(self):
+ def test_get_all_server_details_v1_0(self):
req = webob.Request.blank('/v1.0/servers/detail')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -363,7 +363,31 @@ class ServersTest(test.TestCase):
self.assertEqual(s['id'], i)
self.assertEqual(s['hostId'], '')
self.assertEqual(s['name'], 'server%d' % i)
- self.assertEqual(s['imageId'], 10)
+ self.assertEqual(s['imageId'], '10')
+ self.assertEqual(s['flavorId'], '1')
+ self.assertEqual(s['metadata']['seq'], i)
+ i += 1
+
+ def test_get_all_server_details_v1_1(self):
+ class FakeRequestContext(object):
+ def __init__(self, user, project, *args, **kwargs):
+ self.user_id = 1
+ self.project_id = 1
+ self.version = '1.1'
+ self.is_admin = True
+
+ self.stubs.Set(context, 'RequestContext', FakeRequestContext)
+ req = webob.Request.blank('/v1.1/servers/detail')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+
+ i = 0
+ for s in res_dict['servers']:
+ self.assertEqual(s['id'], i)
+ self.assertEqual(s['hostId'], '')
+ self.assertEqual(s['name'], 'server%d' % i)
+ self.assertEqual(s['imageRef'], 'http://localhost/v1.1/images/10')
+ self.assertEqual(s['flavorRef'], 'http://localhost/v1.1/flavors/1')
self.assertEqual(s['metadata']['seq'], i)
i += 1