summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CA/openssl.cnf.tmpl2
-rw-r--r--nova/api/openstack/__init__.py9
-rw-r--r--nova/api/openstack/extensions.py32
-rw-r--r--nova/flags.py2
-rw-r--r--nova/tests/api/openstack/extensions/widgets.py27
-rw-r--r--nova/tests/api/openstack/test_extensions.py19
6 files changed, 85 insertions, 6 deletions
diff --git a/CA/openssl.cnf.tmpl b/CA/openssl.cnf.tmpl
index dd81f1c2b..cf8bac828 100644
--- a/CA/openssl.cnf.tmpl
+++ b/CA/openssl.cnf.tmpl
@@ -43,7 +43,7 @@ policy = policy_match
[ policy_match ]
countryName = match
-stateOrProvinceName = match
+stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py
index 28e2a1691..8f6076511 100644
--- a/nova/api/openstack/__init__.py
+++ b/nova/api/openstack/__init__.py
@@ -69,7 +69,7 @@ class APIRouter(wsgi.Router):
"""Simple paste factory, :class:`nova.wsgi.Router` doesn't have one"""
return cls()
- def __init__(self, ext_manager=None):
+ def __init__(self, ext_mgr=None):
mapper = routes.Mapper()
server_members = {'action': 'POST'}
@@ -112,9 +112,10 @@ class APIRouter(wsgi.Router):
collection={'detail': 'GET'},
controller=shared_ip_groups.Controller())
- if ext_manager is None:
- ext_manager = extensions.ExtensionManager()
- for resource in ext_manager.get_resources():
+ if ext_mgr is None:
+ ext_mgr = extensions.ExtensionManager(FLAGS.osapi_extensions_path)
+ for resource in ext_mgr.get_resources():
+ print resource
resource.add_routes(mapper)
super(APIRouter, self).__init__(mapper)
diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py
index 1c539c500..24846d9cd 100644
--- a/nova/api/openstack/extensions.py
+++ b/nova/api/openstack/extensions.py
@@ -15,15 +15,45 @@
# License for the specific language governing permissions and limitations
# under the License.
+import imp
+import os
+import sys
+
+
class ExtensionManager(object):
+ def __init__(self, path):
+
+ self.path = path
+ self.extensions = []
+ self._load_extensions()
+
def get_resources(self):
"""
returns a list of ExtensionResource objects
"""
- return []
+ resources = []
+ for ext in self.extensions:
+ resources.append(ext.get_resources())
+ return resources
+
+ def _load_extensions(self):
+ if not os.path.exists(self.path):
+ return
+
+ for f in os.listdir(self.path):
+ mod_name, file_ext = os.path.splitext(os.path.split(f)[-1])
+ ext_path = os.path.join(self.path, f)
+ if file_ext.lower() == '.py':
+ mod = imp.load_source(mod_name, ext_path)
+ self.extensions.append(getattr(mod, 'get_extension')())
+
class ExtensionResource(object):
+ """
+ Example ExtensionResource object. All ExtensionResource objects should
+ adhere to this interface.
+ """
def add_routes(self, mapper):
pass
diff --git a/nova/flags.py b/nova/flags.py
index 9123e9ac7..63e4cb5b6 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -298,6 +298,8 @@ DEFINE_string('ec2_dmz_host', '$my_ip', 'internal ip of api server')
DEFINE_integer('ec2_port', 8773, 'cloud controller port')
DEFINE_string('ec2_scheme', 'http', 'prefix for ec2')
DEFINE_string('ec2_path', '/services/Cloud', 'suffix for ec2')
+DEFINE_string('osapi_extensions_path', '/var/lib/nova/extensions',
+ 'default directory for nova extensions')
DEFINE_string('osapi_host', '$my_ip', 'ip of api server')
DEFINE_string('osapi_scheme', 'http', 'prefix for openstack')
DEFINE_integer('osapi_port', 8774, 'OpenStack API port')
diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py
new file mode 100644
index 000000000..bc0947223
--- /dev/null
+++ b/nova/tests/api/openstack/extensions/widgets.py
@@ -0,0 +1,27 @@
+from nova import wsgi
+
+class WidgetController(wsgi.Controller):
+
+ def index(self, req):
+ return "Buy more widgets!"
+
+class WidgetExtensionResource(object):
+
+ def __init__(self):
+ pass
+
+ def add_routes(self, mapper):
+ mapper.resource('widget', 'widgets', controller=WidgetController())
+
+
+class WidgetExtension(object):
+
+ def __init__(self):
+ pass
+
+ def get_resources(self):
+ return WidgetExtensionResource()
+
+
+def get_extension():
+ return WidgetExtension()
diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py
index f5332c84a..ff41d6d99 100644
--- a/nova/tests/api/openstack/test_extensions.py
+++ b/nova/tests/api/openstack/test_extensions.py
@@ -16,12 +16,16 @@
# under the License.
import unittest
+import os.path
import webob
+from nova import flags
from nova.api import openstack
import nova.wsgi
+FLAGS = flags.FLAGS
+
class StubController(nova.wsgi.Controller):
def __init__(self, body):
@@ -81,3 +85,18 @@ class ExtensionTest(unittest.TestCase):
self.assertEqual(response_body, response.body)
+class ExtensionManagerTest(unittest.TestCase):
+
+ def setUp(self):
+ FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__),
+ "extensions")
+
+ def test_get_resources(self):
+ router = openstack.APIRouter()
+ request = webob.Request.blank("/widgets")
+ response = request.get_response(router)
+ self.assertEqual(200, response.status_int)
+ self.assertEqual("Buy more widgets!", response.body)
+
+
+