summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorWilliam Wolf <throughnothing@gmail.com>2011-07-25 14:10:08 -0400
committerWilliam Wolf <throughnothing@gmail.com>2011-07-25 14:10:08 -0400
commit99bc14f16bce9f125715fbe436b7fc0969b62420 (patch)
tree13f387f6978d57c09e9fd9bfbb96f24ab2e19dc2 /nova/api
parent0e2726f452fe6991797728bca1e514943725e7a2 (diff)
added 1.0 detail test, added VersionRequestDeserializer to support Versions actions properly, started 300/multiple choice work
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/__init__.py6
-rw-r--r--nova/api/openstack/versions.py92
2 files changed, 95 insertions, 3 deletions
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py
index e87d7c754..fb6f5515e 100644
--- a/nova/api/openstack/__init__.py
+++ b/nova/api/openstack/__init__.py
@@ -40,6 +40,7 @@ from nova.api.openstack import servers
from nova.api.openstack import server_metadata
from nova.api.openstack import shared_ip_groups
from nova.api.openstack import users
+from nova.api.openstack import versions
from nova.api.openstack import wsgi
from nova.api.openstack import zones
@@ -115,6 +116,10 @@ class APIRouter(base_wsgi.Router):
'select': 'POST',
'boot': 'POST'})
+ mapper.connect("versions", "/",
+ controller=versions.create_resource(version),
+ action="index")
+
mapper.resource("console", "consoles",
controller=consoles.create_resource(),
parent_resource=dict(member_name='server',
@@ -164,6 +169,7 @@ class APIRouterV11(APIRouter):
def _setup_routes(self, mapper):
super(APIRouterV11, self)._setup_routes(mapper, '1.1')
+
mapper.resource("image_meta", "meta",
controller=image_metadata.create_resource(),
parent_resource=dict(member_name='image',
diff --git a/nova/api/openstack/versions.py b/nova/api/openstack/versions.py
index df7a94b7e..445a14372 100644
--- a/nova/api/openstack/versions.py
+++ b/nova/api/openstack/versions.py
@@ -28,6 +28,13 @@ ATOM_XMLNS = "http://www.w3.org/2005/Atom"
class Versions(wsgi.Resource):
+ @classmethod
+ def factory(cls, global_config, **local_config):
+ """Paste factory."""
+ def _factory(app):
+ return cls(app, **local_config)
+ return _factory
+
def __init__(self):
metadata = {
"attributes": {
@@ -45,7 +52,7 @@ class Versions(wsgi.Resource):
supported_content_types = ('application/json',
'application/xml',
'application/atom+xml')
- deserializer = wsgi.RequestDeserializer(
+ deserializer = VersionsRequestDeserializer(
supported_content_types=supported_content_types)
wsgi.Resource.__init__(self, None, serializer=serializer,
@@ -53,6 +60,14 @@ class Versions(wsgi.Resource):
def dispatch(self, request, *args):
"""Respond to a request for all OpenStack API versions."""
+ if request.path == '/':
+ # List Versions
+ return self._versions_list(request)
+ else:
+ # Versions Multiple Choice
+ return self._versions_multi_choice(request)
+
+ def _versions_list(self, request):
version_objs = [
{
"id": "v1.1",
@@ -72,6 +87,47 @@ class Versions(wsgi.Resource):
versions = [builder.build(version) for version in version_objs]
return dict(versions=versions)
+ def _versions_multi_choice(self, request):
+ version_objs = [
+ {
+ "id": "v1.1",
+ "status": "CURRENT",
+ #TODO(wwolf) get correct value for these
+ "updated": "2011-07-18T11:30:00Z",
+ },
+ {
+ "id": "v1.0",
+ "status": "DEPRECATED",
+ #TODO(wwolf) get correct value for these
+ "updated": "2010-10-09T11:30:00Z",
+ },
+ ]
+
+ builder = nova.api.openstack.views.versions.get_view_builder(request)
+ versions = [builder.build(version) for version in version_objs]
+ return dict(versions=versions)
+
+
+class VersionV10(object):
+ def index(self, req):
+ return "test index 1.0"
+
+
+class VersionV11(object):
+ def index(self, req):
+ return "test index 1.1"
+
+class VersionsRequestDeserializer(wsgi.RequestDeserializer):
+ def get_action_args(self, request_environment):
+ """Parse dictionary created by routes library."""
+
+ args = {}
+ if request_environment['PATH_INFO'] == '/':
+ args['action'] = 'index'
+ else:
+ args['action'] = 'multi'
+
+ return args
class VersionsXMLSerializer(wsgi.XMLDictSerializer):
def _versions_to_xml(self, versions):
@@ -96,7 +152,13 @@ class VersionsXMLSerializer(wsgi.XMLDictSerializer):
return version_node
- def default(self, data):
+ def index(self, data):
+ self._xml_doc = minidom.Document()
+ node = self._versions_to_xml(data['versions'])
+
+ return self.to_xml_string(node)
+
+ def multi(self, data):
self._xml_doc = minidom.Document()
node = self._versions_to_xml(data['versions'])
@@ -190,10 +252,34 @@ class VersionsAtomSerializer(wsgi.XMLDictSerializer):
entry.appendChild(content)
root.appendChild(entry)
- def default(self, data):
+ def index(self, data):
self._xml_doc = minidom.Document()
node = self._xml_doc.createElementNS(self.xmlns, 'feed')
self._create_meta(node, data['versions'])
self._create_version_entries(node, data['versions'])
return self.to_xml_string(node)
+
+ def multi(self, data):
+ self._xml_doc = minidom.Document()
+ node = self._xml_doc.createElementNS(self.xmlns, 'feed')
+ self._create_meta(node, data['versions'])
+ self._create_version_entries(node, data['versions'])
+
+ return self.to_xml_string(node)
+
+
+def create_resource(version='1.0'):
+ controller = {
+ '1.0': VersionV10,
+ '1.1': VersionV11,
+ }[version]()
+
+ body_serializers = {
+ 'application/xml': VersionsXMLSerializer(),
+ 'application/atom+xml': VersionsAtomSerializer(),
+ }
+
+ serializer = wsgi.ResponseSerializer(body_serializers)
+
+ return wsgi.Resource(controller, serializer=serializer)