summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2010-11-02 17:39:51 -0700
committerVishvananda Ishaya <vishvananda@gmail.com>2010-11-02 17:39:51 -0700
commitff967253b28d54ff33176191f6424cb19c444812 (patch)
tree1dcc2876e568aa7d3d4165c5f45719d23edfd5d8
parent1119f7e0eeffc0bc2f918b0c5fb8eb87cd3e3784 (diff)
parent583d1b1c4d039f1f9751c8a2cc0cf59bb77551e0 (diff)
merged
-rwxr-xr-xbin/nova-api9
-rw-r--r--doc/source/api.rst108
-rw-r--r--doc/source/compute.rst8
-rw-r--r--doc/source/development.guide.rst3
-rw-r--r--doc/source/glance.rst27
-rw-r--r--doc/source/network.rst11
-rw-r--r--doc/source/nova.rst107
-rw-r--r--doc/source/objectstore.rst62
-rw-r--r--doc/source/scheduler.rst11
-rw-r--r--nova/api/__init__.py34
-rw-r--r--nova/image/service.py34
-rw-r--r--nova/tests/api/__init__.py2
-rw-r--r--nova/tests/api/openstack/fakes.py4
-rw-r--r--nova/tests/api/openstack/test_auth.py18
-rw-r--r--nova/tests/api/openstack/test_flavors.py2
-rw-r--r--nova/tests/api/openstack/test_images.py4
-rw-r--r--nova/tests/api/openstack/test_servers.py28
-rw-r--r--nova/tests/api_unittest.py6
-rw-r--r--nova/tests/fake_flags.py1
-rw-r--r--nova/wsgi.py25
20 files changed, 398 insertions, 106 deletions
diff --git a/bin/nova-api b/bin/nova-api
index 20f1bd74f..a9002ae2d 100755
--- a/bin/nova-api
+++ b/bin/nova-api
@@ -37,13 +37,18 @@ from nova import utils
from nova import server
FLAGS = flags.FLAGS
-flags.DEFINE_integer('api_port', 8773, 'API port')
+flags.DEFINE_integer('osapi_port', 8774, 'OpenStack API port')
+flags.DEFINE_integer('ec2api_port', 8773, 'EC2 API port')
def main(_args):
from nova import api
from nova import wsgi
- wsgi.run_server(api.API(), FLAGS.api_port)
+ server = wsgi.Server()
+ server.start(api.API('os'), FLAGS.osapi_port)
+ server.start(api.API('ec2'), FLAGS.ec2api_port)
+ server.wait()
+
if __name__ == '__main__':
utils.default_flagfile()
diff --git a/doc/source/api.rst b/doc/source/api.rst
index 3f1c69a15..0908d9e57 100644
--- a/doc/source/api.rst
+++ b/doc/source/api.rst
@@ -161,3 +161,111 @@ The :mod:`metadatarequesthandler` Module
:members:
:undoc-members:
:show-inheritance:
+
+Tests
+-----
+
+The :mod:`api_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`api_integration` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api_integration
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`cloud_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.cloud_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`api.fakes` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.fakes
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`api.test_wsgi` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.test_wsgi
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_api` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_api
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_auth` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_auth
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_faults` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_faults
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_flavors` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_flavors
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_images` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_images
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_ratelimiting` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_ratelimiting
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_servers` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_servers
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`test_sharedipgroups` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.api.openstack.test_sharedipgroups
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
diff --git a/doc/source/compute.rst b/doc/source/compute.rst
index e9e37ebf8..ff6aeab92 100644
--- a/doc/source/compute.rst
+++ b/doc/source/compute.rst
@@ -135,7 +135,6 @@ The :mod:`monitor` Module
Tests
-----
-
The :mod:`compute_unittest` Module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -144,3 +143,10 @@ The :mod:`compute_unittest` Module
:undoc-members:
:show-inheritance:
+The :mod:`virt_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.virt_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/doc/source/development.guide.rst b/doc/source/development.guide.rst
index 45ebe2f10..e4af2da56 100644
--- a/doc/source/development.guide.rst
+++ b/doc/source/development.guide.rst
@@ -42,6 +42,9 @@ Contents
scheduler
fakes
nova
+ cloudpipe
+ objectstore
+ glance
Indices and tables
diff --git a/doc/source/glance.rst b/doc/source/glance.rst
new file mode 100644
index 000000000..3d0f4ebec
--- /dev/null
+++ b/doc/source/glance.rst
@@ -0,0 +1,27 @@
+..
+ Copyright 2010 United States Government as represented by the
+ Administrator of the National Aeronautics and Space Administration.
+ All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+Glance Integration Programming Guide
+====================================
+
+The :mod:`image.service` Module
+-------------------------------
+
+.. automodule:: nova.image.service
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/doc/source/network.rst b/doc/source/network.rst
index b044c6413..cbff22d3f 100644
--- a/doc/source/network.rst
+++ b/doc/source/network.rst
@@ -43,6 +43,17 @@ The :mod:`LinuxNet` driver
:undoc-members:
:show-inheritance:
+Tests
+-----
+
+The :mod:`network_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.network_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
legacy docs
-----------
diff --git a/doc/source/nova.rst b/doc/source/nova.rst
index 59fd56c85..3963992ae 100644
--- a/doc/source/nova.rst
+++ b/doc/source/nova.rst
@@ -34,14 +34,6 @@ The :mod:`context` Module
:undoc-members:
:show-inheritance:
-The :mod:`crypto` Module
-------------------------
-
-.. automodule:: nova.crypto
- :members:
- :undoc-members:
- :show-inheritance:
-
The :mod:`exception` Module
---------------------------
@@ -58,14 +50,6 @@ The :mod:`flags` Module
:undoc-members:
:show-inheritance:
-The :mod:`manager` Module
--------------------------
-
-.. automodule:: nova.manager
- :members:
- :undoc-members:
- :show-inheritance:
-
The :mod:`process` Module
-------------------------
@@ -98,14 +82,6 @@ The :mod:`server` Module
:undoc-members:
:show-inheritance:
-The :mod:`service` Module
--------------------------
-
-.. automodule:: nova.service
- :members:
- :undoc-members:
- :show-inheritance:
-
The :mod:`test` Module
----------------------
@@ -145,3 +121,86 @@ The :mod:`wsgi` Module
:members:
:undoc-members:
:show-inheritance:
+
+Tests
+-----
+
+The :mod:`declare_flags` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.declare_flags
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`fake_flags` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.fake_flags
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`flags_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.flags_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`process_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.process_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`quota_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.quota_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`real_flags` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.real_flags
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`rpc_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.rpc_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`runtime_flags` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.runtime_flags
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`twistd_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.twistd_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`validator_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.validator_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/doc/source/objectstore.rst b/doc/source/objectstore.rst
new file mode 100644
index 000000000..4087b5dd0
--- /dev/null
+++ b/doc/source/objectstore.rst
@@ -0,0 +1,62 @@
+..
+ Copyright 2010 United States Government as represented by the
+ Administrator of the National Aeronautics and Space Administration.
+ All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+Objectstore Programming Guide
+=============================
+
+The :mod:`handler` Module
+-------------------------
+
+.. automodule:: nova.objectstore.handler
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`bucket` Module
+------------------------
+
+.. automodule:: nova.objectstore.bucket
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`stored` Module
+------------------------
+
+.. automodule:: nova.objectstore.stored
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+The :mod:`image` Module
+-----------------------
+
+.. automodule:: nova.objectstore.image
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Tests
+-----
+
+The :mod:`objectstore_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.objectstore_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/doc/source/scheduler.rst b/doc/source/scheduler.rst
index e809b0c54..df820c2f2 100644
--- a/doc/source/scheduler.rst
+++ b/doc/source/scheduler.rst
@@ -49,3 +49,14 @@ The :mod:`simple` Module
:members:
:undoc-members:
:show-inheritance:
+
+Tests
+-----
+
+The :mod:`scheduler_unittest` Module
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: nova.tests.scheduler_unittest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/nova/api/__init__.py b/nova/api/__init__.py
index 27b8199db..f693225d9 100644
--- a/nova/api/__init__.py
+++ b/nova/api/__init__.py
@@ -41,37 +41,31 @@ flags.DEFINE_string('osapi_subdomain', 'api',
'subdomain running the OpenStack API')
flags.DEFINE_string('ec2api_subdomain', 'ec2',
'subdomain running the EC2 API')
-flags.DEFINE_string('FAKE_subdomain', None,
- 'set to api or ec2 to fake the subdomain of the host '
- 'for testing')
FLAGS = flags.FLAGS
class API(wsgi.Router):
"""Routes top-level requests to the appropriate controller."""
- def __init__(self):
- osapidomain = {'sub_domain': [FLAGS.osapi_subdomain]}
- ec2domain = {'sub_domain': [FLAGS.ec2api_subdomain]}
- # If someone wants to pretend they're hitting the OSAPI subdomain
- # on their local box, they can set FAKE_subdomain to 'api', which
- # removes subdomain restrictions from the OpenStack API routes below.
- if FLAGS.FAKE_subdomain == 'api':
- osapidomain = {}
- elif FLAGS.FAKE_subdomain == 'ec2':
- ec2domain = {}
+ def __init__(self, default_api):
+ osapi_subdomain = {'sub_domain': [FLAGS.osapi_subdomain]}
+ ec2api_subdomain = {'sub_domain': [FLAGS.ec2api_subdomain]}
+ if default_api == 'os':
+ osapi_subdomain = {}
+ elif default_api == 'ec2':
+ ec2api_subdomain = {}
mapper = routes.Mapper()
mapper.sub_domains = True
+
mapper.connect("/", controller=self.osapi_versions,
- conditions=osapidomain)
+ conditions=osapi_subdomain)
mapper.connect("/v1.0/{path_info:.*}", controller=openstack.API(),
- conditions=osapidomain)
+ conditions=osapi_subdomain)
mapper.connect("/", controller=self.ec2api_versions,
- conditions=ec2domain)
+ conditions=ec2api_subdomain)
mapper.connect("/services/{path_info:.*}", controller=ec2.API(),
- conditions=ec2domain)
- mapper.connect("/cloudpipe/{path_info:.*}", controller=cloudpipe.API())
+ conditions=ec2api_subdomain)
mrh = metadatarequesthandler.MetadataRequestHandler()
for s in ['/latest',
'/2009-04-04',
@@ -84,7 +78,9 @@ class API(wsgi.Router):
'/2007-01-19',
'/1.0']:
mapper.connect('%s/{path_info:.*}' % s, controller=mrh,
- conditions=ec2domain)
+ conditions=ec2api_subdomain)
+
+ mapper.connect("/cloudpipe/{path_info:.*}", controller=cloudpipe.API())
super(API, self).__init__(mapper)
@webob.dec.wsgify
diff --git a/nova/image/service.py b/nova/image/service.py
index 37cadddcc..52ddd4e0f 100644
--- a/nova/image/service.py
+++ b/nova/image/service.py
@@ -45,13 +45,9 @@ class BaseImageService(object):
Returns a sequence of mappings of id and name information about
images.
- :retval a sequence of mappings with the following signature:
-
- [
- {'id': opaque id of image,
- 'name': name of image
- }, ...
- ]
+ :rtype: array
+ :retval: a sequence of mappings with the following signature
+ {'id': opaque id of image, 'name': name of image}
"""
raise NotImplementedError
@@ -60,19 +56,17 @@ class BaseImageService(object):
"""
Returns a sequence of mappings of detailed information about images.
- :retval a sequence of mappings with the following signature:
-
- [
- {'id': opaque id of image,
- 'name': name of image,
- 'created_at': creation timestamp,
- 'updated_at': modification timestamp,
- 'deleted_at': deletion timestamp or None,
- 'deleted': boolean indicating if image has been deleted,
- 'status': string description of image status,
- 'is_public': boolean indicating if image is public
- }, ...
- ]
+ :rtype: array
+ :retval: a sequence of mappings with the following signature
+ {'id': opaque id of image,
+ 'name': name of image,
+ 'created_at': creation timestamp,
+ 'updated_at': modification timestamp,
+ 'deleted_at': deletion timestamp or None,
+ 'deleted': boolean indicating if image has been deleted,
+ 'status': string description of image status,
+ 'is_public': boolean indicating if image is public
+ }
If the service does not implement a method that provides a detailed
set of information about images, then the method should raise
diff --git a/nova/tests/api/__init__.py b/nova/tests/api/__init__.py
index 46f09e906..9caa8c9d0 100644
--- a/nova/tests/api/__init__.py
+++ b/nova/tests/api/__init__.py
@@ -42,7 +42,7 @@ class Test(unittest.TestCase):
environ_keys = {'HTTP_HOST': '%s.example.com' % subdomain}
environ_keys.update(kwargs)
req = webob.Request.blank(url, environ_keys)
- return req.get_response(api.API())
+ return req.get_response(api.API('ec2'))
def test_openstack(self):
self.stubs.Set(api.openstack, 'API', APIStub)
diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py
index 1b8c18974..52b392601 100644
--- a/nova/tests/api/openstack/fakes.py
+++ b/nova/tests/api/openstack/fakes.py
@@ -34,9 +34,6 @@ from nova.tests import fake_flags
from nova.wsgi import Router
-FLAGS = flags.FLAGS
-
-
class Context(object):
pass
@@ -108,7 +105,6 @@ def stub_out_networking(stubs):
def get_my_ip():
return '127.0.0.1'
stubs.Set(nova.utils, 'get_my_ip', get_my_ip)
- FLAGS.FAKE_subdomain = 'api'
def stub_out_glance(stubs, initial_fixtures=[]):
diff --git a/nova/tests/api/openstack/test_auth.py b/nova/tests/api/openstack/test_auth.py
index b63da187f..29f4b8874 100644
--- a/nova/tests/api/openstack/test_auth.py
+++ b/nova/tests/api/openstack/test_auth.py
@@ -51,7 +51,7 @@ class Test(unittest.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-User'] = 'herp'
req.headers['X-Auth-Key'] = 'derp'
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '204 No Content')
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
self.assertEqual(result.headers['X-CDN-Management-Url'],
@@ -65,7 +65,7 @@ class Test(unittest.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-User'] = 'herp'
req.headers['X-Auth-Key'] = 'derp'
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '204 No Content')
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
self.assertEqual(result.headers['X-Server-Management-Url'],
@@ -79,7 +79,7 @@ class Test(unittest.TestCase):
fakes.FakeRouter)
req = webob.Request.blank('/v1.0/fake')
req.headers['X-Auth-Token'] = token
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '200 OK')
self.assertEqual(result.headers['X-Test-Success'], 'True')
@@ -103,7 +103,7 @@ class Test(unittest.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-Token'] = 'bacon'
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '401 Unauthorized')
self.assertEqual(self.destroy_called, True)
@@ -111,18 +111,18 @@ class Test(unittest.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-User'] = 'herp'
req.headers['X-Auth-Key'] = 'derp'
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '401 Unauthorized')
def test_no_user(self):
req = webob.Request.blank('/v1.0/')
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '401 Unauthorized')
def test_bad_token(self):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-Token'] = 'baconbaconbacon'
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '401 Unauthorized')
@@ -146,7 +146,7 @@ class TestLimiter(unittest.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-User'] = 'herp'
req.headers['X-Auth-Key'] = 'derp'
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
token = result.headers['X-Auth-Token']
@@ -155,7 +155,7 @@ class TestLimiter(unittest.TestCase):
req = webob.Request.blank('/v1.0/fake')
req.method = 'POST'
req.headers['X-Auth-Token'] = token
- result = req.get_response(nova.api.API())
+ result = req.get_response(nova.api.API('os'))
self.assertEqual(result.status, '200 OK')
self.assertEqual(result.headers['X-Test-Success'], 'True')
diff --git a/nova/tests/api/openstack/test_flavors.py b/nova/tests/api/openstack/test_flavors.py
index 8dd4d1f29..41018afdf 100644
--- a/nova/tests/api/openstack/test_flavors.py
+++ b/nova/tests/api/openstack/test_flavors.py
@@ -39,7 +39,7 @@ class FlavorsTest(unittest.TestCase):
def test_get_flavor_list(self):
req = webob.Request.blank('/v1.0/flavors')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
def test_get_flavor_by_id(self):
pass
diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py
index d61c3a99b..0f3941c29 100644
--- a/nova/tests/api/openstack/test_images.py
+++ b/nova/tests/api/openstack/test_images.py
@@ -203,7 +203,7 @@ class ImageControllerWithGlanceServiceTest(unittest.TestCase):
def test_get_image_index(self):
req = webob.Request.blank('/v1.0/images')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
res_dict = json.loads(res.body)
fixture_index = [dict(id=f['id'], name=f['name']) for f
@@ -215,7 +215,7 @@ class ImageControllerWithGlanceServiceTest(unittest.TestCase):
def test_get_image_details(self):
req = webob.Request.blank('/v1.0/images/detail')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
res_dict = json.loads(res.body)
for image in res_dict['images']:
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 785fb6f3a..8cfc6c45a 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -69,14 +69,14 @@ class ServersTest(unittest.TestCase):
def test_get_server_by_id(self):
req = webob.Request.blank('/v1.0/servers/1')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
res_dict = json.loads(res.body)
self.assertEqual(res_dict['server']['id'], 1)
self.assertEqual(res_dict['server']['name'], 'server1')
def test_get_server_list(self):
req = webob.Request.blank('/v1.0/servers')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
res_dict = json.loads(res.body)
i = 0
@@ -119,14 +119,14 @@ class ServersTest(unittest.TestCase):
req.method = 'POST'
req.body = json.dumps(body)
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
self.assertEqual(res.status_int, 200)
def test_update_no_body(self):
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
self.assertEqual(res.status_int, 422)
def test_update_bad_params(self):
@@ -145,7 +145,7 @@ class ServersTest(unittest.TestCase):
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
req.body = self.body
- req.get_response(nova.api.API())
+ req.get_response(nova.api.API('os'))
def test_update_server(self):
inst_dict = dict(name='server_test', adminPass='bacon')
@@ -161,28 +161,28 @@ class ServersTest(unittest.TestCase):
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
req.body = self.body
- req.get_response(nova.api.API())
+ req.get_response(nova.api.API('os'))
def test_create_backup_schedules(self):
req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
req.method = 'POST'
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
self.assertEqual(res.status, '404 Not Found')
def test_delete_backup_schedules(self):
req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
req.method = 'DELETE'
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
self.assertEqual(res.status, '404 Not Found')
def test_get_server_backup_schedules(self):
req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
self.assertEqual(res.status, '404 Not Found')
def test_get_all_server_details(self):
req = webob.Request.blank('/v1.0/servers/detail')
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
res_dict = json.loads(res.body)
i = 0
@@ -200,7 +200,7 @@ class ServersTest(unittest.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
def test_server_rebuild(self):
body = dict(server=dict(
@@ -210,7 +210,7 @@ class ServersTest(unittest.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
def test_server_resize(self):
body = dict(server=dict(
@@ -220,7 +220,7 @@ class ServersTest(unittest.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
def test_delete_server_instance(self):
req = webob.Request.blank('/v1.0/servers/1')
@@ -234,7 +234,7 @@ class ServersTest(unittest.TestCase):
self.stubs.Set(nova.db.api, 'instance_destroy',
instance_destroy_mock)
- res = req.get_response(nova.api.API())
+ res = req.get_response(nova.api.API('os'))
self.assertEqual(res.status, '202 Accepted')
self.assertEqual(self.server_delete_called, True)
diff --git a/nova/tests/api_unittest.py b/nova/tests/api_unittest.py
index 0a81c575b..33d4cb294 100644
--- a/nova/tests/api_unittest.py
+++ b/nova/tests/api_unittest.py
@@ -34,10 +34,6 @@ from nova.api.ec2 import apirequest
from nova.auth import manager
-FLAGS = flags.FLAGS
-FLAGS.FAKE_subdomain = 'ec2'
-
-
class FakeHttplibSocket(object):
"""a fake socket implementation for httplib.HTTPResponse, trivial"""
def __init__(self, response_string):
@@ -109,7 +105,7 @@ class ApiEc2TestCase(test.TrialTestCase):
self.host = '127.0.0.1'
- self.app = api.API()
+ self.app = api.API('ec2')
def expect_http(self, host=None, is_secure=False):
"""Returns a new EC2 connection"""
diff --git a/nova/tests/fake_flags.py b/nova/tests/fake_flags.py
index 4bbef8832..bc377f0da 100644
--- a/nova/tests/fake_flags.py
+++ b/nova/tests/fake_flags.py
@@ -24,6 +24,7 @@ flags.DECLARE('volume_driver', 'nova.volume.manager')
FLAGS.volume_driver = 'nova.volume.driver.FakeAOEDriver'
FLAGS.connection_type = 'fake'
FLAGS.fake_rabbit = True
+flags.DECLARE('auth_driver', 'nova.auth.manager')
FLAGS.auth_driver = 'nova.auth.dbdriver.DbDriver'
flags.DECLARE('network_size', 'nova.network.manager')
flags.DECLARE('num_networks', 'nova.network.manager')
diff --git a/nova/wsgi.py b/nova/wsgi.py
index eb305a3d3..b04b487ea 100644
--- a/nova/wsgi.py
+++ b/nova/wsgi.py
@@ -39,10 +39,27 @@ import webob.exc
logging.getLogger("routes.middleware").addHandler(logging.StreamHandler())
-def run_server(application, port):
- """Run a WSGI server with the given application."""
- sock = eventlet.listen(('0.0.0.0', port))
- eventlet.wsgi.server(sock, application)
+class Server(object):
+ """Server class to manage multiple WSGI sockets and applications."""
+
+ def __init__(self, threads=1000):
+ self.pool = eventlet.GreenPool(threads)
+
+ def start(self, application, port, host='0.0.0.0', backlog=128):
+ """Run a WSGI server with the given application."""
+ socket = eventlet.listen((host, port), backlog=backlog)
+ self.pool.spawn_n(self._run, application, socket)
+
+ def wait(self):
+ """Wait until all servers have completed running."""
+ try:
+ self.pool.waitall()
+ except KeyboardInterrupt:
+ pass
+
+ def _run(self, application, socket):
+ """Start a WSGI server in a new green thread."""
+ eventlet.wsgi.server(socket, application, custom_pool=self.pool)
class Application(object):