summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/servers.py65
-rw-r--r--nova/api/openstack/v1_0/servers.py6
-rw-r--r--nova/api/openstack/v1_1/__init__.py0
-rw-r--r--nova/api/openstack/v1_1/servers.py8
-rw-r--r--nova/api/openstack/views/__init__.py (renamed from nova/api/openstack/v1_0/__init__.py)0
-rw-r--r--nova/api/openstack/views/servers.py76
-rw-r--r--nova/tests/api/openstack/test_servers.py6
7 files changed, 90 insertions, 71 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 0d36546d7..ea8321e8d 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -27,8 +27,7 @@ from nova import wsgi
from nova import utils
from nova.api.openstack import common
from nova.api.openstack import faults
-from nova.api.openstack.v1_0 import servers as v1_0
-from nova.api.openstack.v1_1 import servers as v1_1
+from nova.api.openstack.views.servers import get_view_builder
from nova.auth import manager as auth_manager
from nova.compute import instance_types
from nova.compute import power_state
@@ -56,7 +55,8 @@ class Controller(wsgi.Controller):
def ips(self, req, id):
try:
instance = self.compute_api.get(req.environ['nova.context'], id)
- return _get_addresses_builder(req)(instance)
+ builder = get_view_builder(req)
+ return builder._build_addresses(instance)
except exception.NotFound:
return faults.Fault(exc.HTTPNotFound())
@@ -75,15 +75,17 @@ class Controller(wsgi.Controller):
"""
instance_list = self.compute_api.get_all(req.environ['nova.context'])
limited_list = common.limited(instance_list, req)
- res = [_build_server(req, inst, is_detail)['server']
+ builder = get_view_builder(req)
+ servers = [builder.build(inst, is_detail)['server']
for inst in limited_list]
- return dict(servers=res)
+ return dict(servers=servers)
def show(self, req, id):
""" Returns server details by server id """
try:
instance = self.compute_api.get(req.environ['nova.context'], id)
- return _build_server(req, instance, is_detail=True)
+ builder = get_view_builder(req)
+ return builder.build(instance, is_detail=True)
except exception.NotFound:
return faults.Fault(exc.HTTPNotFound())
@@ -135,7 +137,8 @@ class Controller(wsgi.Controller):
metadata=metadata,
onset_files=env.get('onset_files', []))
- server = _build_server(req, instances[0], is_detail=False)
+ builder = get_view_builder(req)
+ server = builder.build(instances[0], is_detail=False)
password = "%s%s" % (server['server']['name'][:4],
utils.generate_password(12))
server['server']['adminPass'] = password
@@ -434,52 +437,4 @@ class Controller(wsgi.Controller):
return kernel_id, ramdisk_id
-def _build_server(req, inst, is_detail):
- """ Coerces into dictionary format, mapping everything to Rackspace-like
- attributes for return"""
- if not is_detail:
- return dict(server=dict(id=inst['id'], name=inst['display_name']))
-
- power_mapping = {
- None: 'build',
- power_state.NOSTATE: 'build',
- power_state.RUNNING: 'active',
- power_state.BLOCKED: 'active',
- power_state.SUSPENDED: 'suspended',
- power_state.PAUSED: 'paused',
- power_state.SHUTDOWN: 'active',
- power_state.SHUTOFF: 'active',
- power_state.CRASHED: 'error',
- power_state.FAILED: 'error'}
- inst_dict = {}
- version = req.environ['nova.context'].version
-
- mapped_keys = dict(status='state', imageId='image_id',
- flavorId='instance_type', name='display_name', id='id')
-
- for k, v in mapped_keys.iteritems():
- inst_dict[k] = inst[v]
-
- inst_dict['status'] = power_mapping[inst_dict['status']]
- inst_dict['addresses'] = _get_addresses_builder(req)(inst)
-
- # Return the metadata as a dictionary
- metadata = {}
- for item in inst['metadata']:
- metadata[item['key']] = item['value']
- inst_dict['metadata'] = metadata
-
- inst_dict['hostId'] = ''
- if inst['host']:
- inst_dict['hostId'] = hashlib.sha224(inst['host']).hexdigest()
-
- return dict(server=inst_dict)
-
-
-def _get_addresses_builder(req):
- version = req.environ['nova.context'].version
- if version == '1.1':
- return v1_1.build_addresses
- else:
- return v1_0.build_addresses
diff --git a/nova/api/openstack/v1_0/servers.py b/nova/api/openstack/v1_0/servers.py
deleted file mode 100644
index d332b1378..000000000
--- a/nova/api/openstack/v1_0/servers.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from nova import utils
-
-def build_addresses(inst):
- private_ips = utils.get_from_path(inst, 'fixed_ip/address')
- public_ips = utils.get_from_path(inst, 'fixed_ip/floating_ips/address')
- return dict(public=public_ips, private=private_ips)
diff --git a/nova/api/openstack/v1_1/__init__.py b/nova/api/openstack/v1_1/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/nova/api/openstack/v1_1/__init__.py
+++ /dev/null
diff --git a/nova/api/openstack/v1_1/servers.py b/nova/api/openstack/v1_1/servers.py
deleted file mode 100644
index 012fc3e5c..000000000
--- a/nova/api/openstack/v1_1/servers.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from nova import utils
-
-def build_addresses(inst):
- private_ips = utils.get_from_path(inst, 'fixed_ip/address')
- private_ips = [dict(version=4, addr=a) for a in private_ips]
- public_ips = utils.get_from_path(inst, 'fixed_ip/floating_ips/address')
- public_ips = [dict(version=4, addr=a) for a in public_ips]
- return dict(public=public_ips, private=private_ips)
diff --git a/nova/api/openstack/v1_0/__init__.py b/nova/api/openstack/views/__init__.py
index e69de29bb..e69de29bb 100644
--- a/nova/api/openstack/v1_0/__init__.py
+++ b/nova/api/openstack/views/__init__.py
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
new file mode 100644
index 000000000..120cae4d4
--- /dev/null
+++ b/nova/api/openstack/views/servers.py
@@ -0,0 +1,76 @@
+import hashlib
+from nova.compute import power_state
+from nova import utils
+
+def get_view_builder(req):
+ '''
+ A factory method that returns the correct builder based on the version of
+ the api requested.
+ '''
+ version = req.environ['nova.context'].version
+ if version == '1.1':
+ return DataViewBuilder_1_1()
+ else:
+ return DataViewBuilder_1_0()
+
+
+class DataViewBuilder(object):
+ ''' Models a server response as a python dictionary. '''
+
+ def build(self, inst, is_detail):
+ """ Coerces into dictionary format, mapping everything to Rackspace-like
+ attributes for return"""
+
+ if not is_detail:
+ return dict(server=dict(id=inst['id'], name=inst['display_name']))
+
+ power_mapping = {
+ None: 'build',
+ power_state.NOSTATE: 'build',
+ power_state.RUNNING: 'active',
+ power_state.BLOCKED: 'active',
+ power_state.SUSPENDED: 'suspended',
+ power_state.PAUSED: 'paused',
+ power_state.SHUTDOWN: 'active',
+ power_state.SHUTOFF: 'active',
+ power_state.CRASHED: 'error',
+ power_state.FAILED: 'error'}
+ inst_dict = {}
+
+ mapped_keys = dict(status='state', imageId='image_id',
+ flavorId='instance_type', name='display_name', id='id')
+
+ for k, v in mapped_keys.iteritems():
+ inst_dict[k] = inst[v]
+
+ inst_dict['status'] = power_mapping[inst_dict['status']]
+ inst_dict['addresses'] = self._build_addresses(inst)
+
+ # Return the metadata as a dictionary
+ metadata = {}
+ for item in inst['metadata']:
+ metadata[item['key']] = item['value']
+ inst_dict['metadata'] = metadata
+
+ inst_dict['hostId'] = ''
+ if inst['host']:
+ inst_dict['hostId'] = hashlib.sha224(inst['host']).hexdigest()
+
+ return dict(server=inst_dict)
+
+
+class DataViewBuilder_1_0(DataViewBuilder):
+ def _build_addresses(self, inst):
+ private_ips = utils.get_from_path(inst, 'fixed_ip/address')
+ public_ips = utils.get_from_path(inst, 'fixed_ip/floating_ips/address')
+ return dict(public=public_ips, private=private_ips)
+
+
+class DataViewBuilder_1_1(DataViewBuilder):
+ def _build_addresses(self, inst):
+ private_ips = utils.get_from_path(inst, 'fixed_ip/address')
+ private_ips = [dict(version=4, addr=a) for a in private_ips]
+ public_ips = utils.get_from_path(inst, 'fixed_ip/floating_ips/address')
+ public_ips = [dict(version=4, addr=a) for a in public_ips]
+ return dict(public=public_ips, private=private_ips)
+
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index a2bd875a4..b2446f194 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -195,9 +195,11 @@ class ServersTest(test.TestCase):
self.assertEqual(res_dict['server']['name'], 'server1')
addresses = res_dict['server']['addresses']
self.assertEqual(len(addresses["public"]), len(public))
- self.assertEqual(addresses["public"][0], {"version": 4, "addr": public[0]})
+ self.assertEqual(addresses["public"][0],
+ {"version": 4, "addr": public[0]})
self.assertEqual(len(addresses["private"]), 1)
- self.assertEqual(addresses["private"][0], {"version": 4, "addr": private})
+ self.assertEqual(addresses["private"][0],
+ {"version": 4, "addr": private})
def test_get_server_list(self):
req = webob.Request.blank('/v1.0/servers')