Table of Contents
0. systemctl status neutron-server:获取neutron-server 脚本入口... 2
1. /usr/bin/neutron-server:Main 函数入口... 2
2. cmd/eventlet/server/__init__.py:main函数实现... 3
3. server/wsgi_eventlet.py:wsgi_eventlet.eventlet_wsgi_server 函数实现... 3
4. service.py:serve_wsgi的实现... 4
4. service.py:NeutronApiService实现... 4
5. common/config.py:config.load_paste_app实现... 6
6. ../oslo_service/wsgi.py:wsgi.Loader.load_app的实现... 6
7. /usr/share/neutron/neutron-dist.conf:paste.deploy形式加载neutron的应用... 8
8. api/v2/router.py:APIRouter.factory实现... 10
9. pecan_wsgi/app.py:v2_factory实现... 10
10. manager.py:NeutronManager实现... 11
理解此加载过程需要预先具备以下几点知识:
* wsgi基本概念
* paste.deploy应用加载方式
* python pecan应用框架
0. systemctl status neutron-server:获取neutron-server 脚本入口
从systemctl status neutron-server 中获取neutron-server脚本入口
● neutron-server.service - OpenStack Neutron Server
Loaded: loaded (/usr/lib/systemd/system/neutron-server.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2021-02-15 21:59:30 PST; 4h 18min ago
Main PID: 19888 (neutron-server)
Tasks: 11
Memory: 1.0G
CGroup: /system.slice/neutron-server.service
├─19888 /usr/bin/python2 /usr/bin/neutron-server --config-file /usr/share/neutron/neutron-dist.conf --config-dir /usr/sh...
。。。
Hint: Some lines were ellipsized, use -l to show in full
1. /usr/bin/neutron-server:Main 函数入口
#!/usr/bin/python2
# PBR Generated from u'console_scripts'
import sys
from neutron.cmd.eventlet.server import main
if __name__ == "__main__":
sys.exit(main())
以下调试均在/usr/lib/python2.7/site-packages/neutron目录下。
2. cmd/eventlet/server/__init__.py:main函数实现
from neutron import server
from neutron.server import rpc_eventlet
from neutron.server import wsgi_eventlet
def main():
server.boot_server(wsgi_eventlet.eventlet_wsgi_server)
boot_server: 在做了两件事:
初始化配置文件, 此时暂时不展开。
执行传入的参数(函数)。
3. server/wsgi_eventlet.py:wsgi_eventlet.eventlet_wsgi_server 函数实现
def eventlet_wsgi_server():
neutron_api = service.serve_wsgi(service.NeutronApiService)
start_api_and_rpc_workers(neutron_api)
eventlet_wsgi_server函数中先是准备好wsgi服务相关要素,然后通过eventlet的方式启动。
此处我们主要探究wsgi服务准备部分:
neutron_api = service.serve_wsgi(service.NeutronApiService)
4. service.py:serve_wsgi的实现
def serve_wsgi(cls):
try:
service = cls.create()
service.start()
except Exception:
with excutils.save_and_reraise_exception():
LOG.exception('Unrecoverable error: please check log '
'for details.')
registry.notify(resources.PROCESS, events.BEFORE_SPAWN, service)
return service
调用传入的Service构造函数
启动服务:start
4. service.py:NeutronApiService实现
class NeutronApiService(WsgiService):
"""Class for neutron-api service."""
def __init__(self, app_name):
profiler.setup('neutron-server', cfg.CONF.host)
super(NeutronApiService, self).__init__(app_name)
@classmethod
def create(cls, app_name='neutron'):
# Setup logging early
config.setup_logging()
service = cls(app_name)
return service
NeutronApiService继承自WsgiService
class WsgiService(object):
"""Base class for WSGI based services.
For each api you define, you must also define these flags:
:<api>_listen: The address on which to listen
:<api>_listen_port: The port on which to listen
"""
def __init__(self, app_name):
self.app_name = app_name
self.wsgi_app = None
def start(self):
self.wsgi_app = _run_wsgi(self.app_name)