Added support for OpenStack and EC2 APIs to run on different ports.
This commit is contained in:
parent
ab1c34f717
commit
2e2dce7ebf
|
@ -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()
|
||||
|
|
|
@ -35,37 +35,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',
|
||||
|
@ -78,7 +72,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
|
||||
|
|
25
nova/wsgi.py
25
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):
|
||||
|
|
Loading…
Reference in New Issue