from pecan import request
from neutron.api import extensions
+from neutron.api.views import versions as versions_view
+
+_VERSION_INFO = {}
+
+
+def _load_version_info(version_info):
+ assert version_info['id'] not in _VERSION_INFO
+ _VERSION_INFO[version_info['id']] = version_info
+
+
+def _get_version_info():
+ return _VERSION_INFO.values()
def expose(*args, **kwargs):
class RootController(object):
- @expose()
- def _lookup(self, version, *remainder):
- if version == 'v2.0':
- return V2Controller(), remainder
-
@expose(generic=True)
def index(self):
- #TODO(kevinbenton): return a version list
- return dict(message='A neutron server')
-
-
-class V2Controller(object):
-
- @expose()
- def _lookup(self, endpoint, *remainder):
- if endpoint == 'extensions':
- return ExtensionsController(), remainder
- return CollectionsController(endpoint), remainder
+ builder = versions_view.get_view_builder(pecan.request)
+ versions = [builder.build(version) for version in _get_version_info()]
+ return dict(versions=versions)
class ExtensionsController(object):
return {'extensions': exts}
+class V2Controller(object):
+
+ # Same data structure as neutron.api.versions.Versions for API backward
+ # compatibility
+ version_info = {
+ 'id': 'v2.0',
+ 'status': 'CURRENT'
+ }
+ _load_version_info(version_info)
+
+ extensions = ExtensionsController()
+
+ @expose()
+ def _lookup(self, endpoint, *remainder):
+ return CollectionsController(endpoint), remainder
+
+
+# This controller cannot be specified directly as a member of RootController
+# as its path is not a valid python identifier
+pecan.route(RootController, 'v2.0', V2Controller())
+
+
class ExtensionController(object):
def __init__(self, alias):
import mock
from oslo_config import cfg
+from oslo_serialization import jsonutils
from oslo_utils import uuidutils
from pecan import request
from pecan import set_config
from neutron.common import exceptions as n_exc
from neutron import context
from neutron import manager
+from neutron.newapi.controllers import root as controllers
from neutron.tests.unit import testlib_api
def test_policy_enforcement(self):
# TODO(kevinbenton): this test should do something
pass
+
+
+class TestRootController(PecanFunctionalTest):
+ """Test version listing on root URI."""
+
+ def test_get(self):
+ response = self.app.get('/')
+ self.assertEqual(response.status_int, 200)
+ json_body = jsonutils.loads(response.body)
+ versions = json_body.get('versions')
+ self.assertEqual(1, len(versions))
+ for (attr, value) in controllers.V2Controller.version_info.items():
+ self.assertIn(attr, versions[0])
+ self.assertEqual(value, versions[0][attr])