diff options
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/api/openstack/servers.py | 65 | ||||
| -rw-r--r-- | nova/api/openstack/v1_0/servers.py | 6 | ||||
| -rw-r--r-- | nova/api/openstack/v1_1/__init__.py | 0 | ||||
| -rw-r--r-- | nova/api/openstack/v1_1/servers.py | 8 | ||||
| -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.py | 76 | ||||
| -rw-r--r-- | nova/tests/api/openstack/test_servers.py | 6 |
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') |
