Starts both the EC2 and OpenStack APIs in separate greenthreads.
"""
import eventlet
eventlet.monkey_patch(os=False)
import os
import sys
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(
sys.argv[0]), os.pardir, os.pardir))
if os.path.exists(os.path.join(possible_topdir, "nova", "__init__.py")):
sys.path.insert(0, possible_topdir)
from nova import flags
from nova.openstack.common import log as logging
from nova import service
from nova import utils
if __name__ == '__main__':
flags.parse_args(sys.argv)
logging.setup("nova")
utils.monkey_patch()
launcher = service.ProcessLauncher()
server = service.WSGIService(api)
launcher.launch_server(server, workers=server.workers or 1)
launcher.wait()
default=['ec2', 'osapi_compute', 'osapi_volume', 'metadata'],
help='a list of APIs to enable by default'),
"""Provides ability to launch API from a 'paste' configuration."""
"""Initialize, but do not start the WSGI server.
:param name: The name of the WSGI server given to the loader.
:param loader: Loads the WSGI application using the given name.
:returns: None
"""
self.name = name
self.manager = self._get_manager() //此处返回的是None
self.loader = loader or wsgi.Loader() //wsgi的loader,用于加载模块
self.app = self.loader.load_app(name) //加载模块,其配置文件默认使用了/etc/nova/api-paste.ini文件,加载的模块为app:标示的部分
self.host = getattr(FLAGS, '%s_listen' % name, "0.0.0.0") //此处e2c_listen、osapi_volume_listen....等配置选项是在service.py文件中注册到FLAGS的
self.server = wsgi.Server(name, //返回wsgi的server
self.app,
host=self.host,
port=self.port)
# Pull back actual port used
self.port = self.server.port
self._socket,
self.app,
protocol=self._protocol,
custom_pool=self._pool,
log=self._wsgi_logger)
[app:osapi_compute_app_v2]
paste.app_factory = nova.api.openstack.compute:APIRouter.factory
[pipeline:oscomputeversions]
pipeline = faultwrap oscomputeversionapp
[app:osapi_volume_app_v1]
paste.app_factory = nova.api.openstack.volume:APIRouter.factory
[app:oscomputeversionapp]
paste.app_factory = nova.api.openstack.compute.versions:Versions.factory
[pipeline:osvolumeversions]
pipeline = faultwrap osvolumeversionapp
[app:osvolumeversionapp]
paste.app_factory = nova.api.openstack.volume.versions:Versions.factory
可以看到osapi_compute、osapi_volume都是启动一个“方法功能路由器”来对服务请求进行调用路由