summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaveed Massjouni <naveedm9@gmail.com>2011-03-10 20:12:58 -0500
committerNaveed Massjouni <naveedm9@gmail.com>2011-03-10 20:12:58 -0500
commitc540d6d7fef1da68a42c16ac1f9a44337661bb0d (patch)
tree3b2612d9f2a7ace99c77755b1463e4aa59b6f1b8
parentacbc0f597f6183fc856f82b07392ddd4a61393f7 (diff)
Added version attribute to RequestContext class. Set the version in the
nova.context object at the middleware level. Prototyped how we can serialize ip addresses based on the version.
-rw-r--r--nova/api/openstack/auth.py3
-rw-r--r--nova/api/openstack/servers.py38
-rw-r--r--nova/context.py7
3 files changed, 33 insertions, 15 deletions
diff --git a/nova/api/openstack/auth.py b/nova/api/openstack/auth.py
index de8905f46..320443935 100644
--- a/nova/api/openstack/auth.py
+++ b/nova/api/openstack/auth.py
@@ -57,7 +57,8 @@ class AuthMiddleware(wsgi.Middleware):
return faults.Fault(webob.exc.HTTPUnauthorized())
project = self.auth.get_project(FLAGS.default_project)
- req.environ['nova.context'] = context.RequestContext(user, project)
+ req.environ['nova.context'] = context.RequestContext(user, project,
+ version=req.script_name.replace('/v', ''))
return self.application
def has_authentication(self, req):
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index dc28a0782..ec542bc92 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -39,7 +39,7 @@ LOG = logging.getLogger('server')
FLAGS = flags.FLAGS
-def _translate_detail_keys(inst):
+def _translate_detail_keys(req, inst):
""" Coerces into dictionary format, mapping everything to Rackspace-like
attributes for return"""
power_mapping = {
@@ -54,6 +54,7 @@ def _translate_detail_keys(inst):
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')
@@ -62,15 +63,7 @@ def _translate_detail_keys(inst):
inst_dict[k] = inst[v]
inst_dict['status'] = power_mapping[inst_dict['status']]
- inst_dict['addresses'] = dict(public=[], private=[])
-
- # grab single private fixed ip
- private_ips = utils.get_from_path(inst, 'fixed_ip/address')
- inst_dict['addresses']['private'] = private_ips
-
- # grab all public floating ips
- public_ips = utils.get_from_path(inst, 'fixed_ip/floating_ips/address')
- inst_dict['addresses']['public'] = public_ips
+ inst_dict['addresses'] = _addresses_generator(version)(inst)
# Return the metadata as a dictionary
metadata = {}
@@ -91,6 +84,27 @@ def _translate_keys(inst):
return dict(server=dict(id=inst['id'], name=inst['display_name']))
+def _addresses_generator(version):
+
+ def _gen_addresses_1_0(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)
+
+ def _gen_addresses_1_1(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)
+
+ dispatch_table = {
+ '1.0': _gen_addresses_1_0,
+ '1.1': _gen_addresses_1_1,
+ }
+
+ return dispatch_table[version]
+
class Controller(wsgi.Controller):
""" The Server API controller for the OpenStack API """
@@ -120,14 +134,14 @@ class Controller(wsgi.Controller):
"""
instance_list = self.compute_api.get_all(req.environ['nova.context'])
limited_list = common.limited(instance_list, req)
- res = [entity_maker(inst)['server'] for inst in limited_list]
+ res = [entity_maker(req, inst)['server'] for inst in limited_list]
return dict(servers=res)
def show(self, req, id):
""" Returns server details by server id """
try:
instance = self.compute_api.get(req.environ['nova.context'], id)
- return _translate_detail_keys(instance)
+ return _translate_detail_keys(req, instance)
except exception.NotFound:
return faults.Fault(exc.HTTPNotFound())
diff --git a/nova/context.py b/nova/context.py
index 0256bf448..677bd2e7e 100644
--- a/nova/context.py
+++ b/nova/context.py
@@ -29,7 +29,8 @@ from nova import utils
class RequestContext(object):
def __init__(self, user, project, is_admin=None, read_deleted=False,
- remote_address=None, timestamp=None, request_id=None):
+ remote_address=None, timestamp=None, request_id=None,
+ version='1.1'):
if hasattr(user, 'id'):
self._user = user
self.user_id = user.id
@@ -60,6 +61,7 @@ class RequestContext(object):
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-'
request_id = ''.join([random.choice(chars) for x in xrange(20)])
self.request_id = request_id
+ self.version = version
@property
def user(self):
@@ -93,7 +95,8 @@ class RequestContext(object):
'read_deleted': self.read_deleted,
'remote_address': self.remote_address,
'timestamp': utils.isotime(self.timestamp),
- 'request_id': self.request_id}
+ 'request_id': self.request_id,
+ 'version': self.version}
@classmethod
def from_dict(cls, values):