summaryrefslogtreecommitdiffstats
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
parent0e2726f452fe6991797728bca1e514943725e7a2 (diff)
added 1.0 detail test, added VersionRequestDeserializer to support Versions actions properly, started 300/multiple choice work
-rw-r--r--nova/api/openstack/__init__.py6
-rw-r--r--nova/api/openstack/versions.py92
-rw-r--r--nova/tests/api/openstack/test_versions.py51
3 files changed, 145 insertions, 4 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)
diff --git a/nova/tests/api/openstack/test_versions.py b/nova/tests/api/openstack/test_versions.py
index aaa1f4976..b2896a780 100644
--- a/nova/tests/api/openstack/test_versions.py
+++ b/nova/tests/api/openstack/test_versions.py
@@ -68,6 +68,55 @@ class VersionsTest(test.TestCase):
]
self.assertEqual(versions, expected)
+ def test_get_version_1_0_detail(self):
+ req = webob.Request.blank('/v1.0/')
+ req.accept = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+ print res.body
+ self.assertEqual(res.status_int, 200)
+ self.assertEqual(res.content_type, "application/json")
+ versions = json.loads(res.body)["versions"]
+ expected = [
+ {
+ "version" : {
+ "id" : "v1.0",
+ "status" : "CURRENT",
+ "updated" : "2011-01-21T11:33:21-06:00",
+ "links": [
+ {
+ "rel" : "self",
+ "href" : "http://servers.api.openstack.org/v1.0/"
+ },
+ {
+ "rel" : "describedby",
+ "type" : "application/pdf",
+ "href" : "http://docs.rackspacecloud.com/"
+ "servers/api/v1.0/cs-devguide-20110125.pdf"
+ },
+ {
+ "rel" : "describedby",
+ "type" : "application/vnd.sun.wadl+xml",
+ "href" : "http://docs.rackspacecloud.com/"
+ "servers/api/v1.0/application.wadl"
+ }
+ ],
+ "media-types": [
+ {
+ "base" : "application/xml",
+ "type" : "application/"
+ "vnd.openstack.compute-v1.0+xml"
+ },
+ {
+ "base" : "application/json",
+ "type" : "application/"
+ "vnd.openstack.compute-v1.0+json"
+ }
+ ]
+ }
+ }
+ ]
+ self.assertEqual(versions, expected)
+
def test_get_version_1_1_detail(self):
req = webob.Request.blank('/v1.1/')
req.accept = "application/json"
@@ -85,7 +134,7 @@ class VersionsTest(test.TestCase):
"links": [
{
"rel" : "self",
- "href" : "http://servers.api.openstack.org/v1.0/"
+ "href" : "http://servers.api.openstack.org/v1.1/"
},
{
"rel" : "describedby",