在看过了nova模块的源码之后,再去看OpenStack其它模块的源码会轻松很多,因为框架也是大同小异的。自四月份开通博客写了几篇文章后,真心觉得写篇技术文章如果要把前前后后牵扯到的其它技术内容都做介绍实在是太费精力了,如果是为自己日后复习则也没必要,因此这篇neutron-server启动流程的文章,我感觉懒得啰嗦了,直接展示一下源码流程吧,若有误导之处,请您谅解并欢迎指正。


neutron-server的main函数如下图:


openstack源 OpenStack源码_Server


main中调用了/usr/lib/python2.7/dist-packages/neutron/service.py中的serve_wsgi函数,参数为该文件中的NeutronApiService类,我们看下这个serve_wsgi函数干了什么,如下图:


openstack源 OpenStack源码_python_02


可以看到,该函数中先调用了NeutronApiService的create函数返回一个对象,接着调用对象的start函数。再看下NeutronApiService类:


openstack源 OpenStack源码_python_03


NeutronApiService类继承自WsgiService类,只有一个create静态函数,该函数创建了一个该类的对象并返回,有一个app_name参数,默认为“neutron”。因此,start函数是在基类WsgiService实现,其中调用了_run_wsgi(self.app_name),再看下_run_wsgi函数的实现:


openstack源 OpenStack源码_openstack源_04


_run_wsgi函数调用了config.load_paste_app(app_name),app_name是“neutron”,就是使用python的Paste模块,并根据配置文件/etc/neutron/api-paste.ini的内容加载一个wsgi的应用。如图中标注,对于路径/v2.0,最后会调用到neutron.api.v2.router:APIRouter.factory函数类生成一个应用并建立映射关系。api-paste.ini内容如下:


openstack源 OpenStack源码_main函数_05


然后初始化一个wsgi.Server对象,再调用wsgi.Server的start方法,Paste加载的应用作为参数传递,关于Paste模块的介绍看这里。来下面再看下wsgi.Server类:


openstack源 OpenStack源码_Server_06


start调用了self._launch函数,之后的就是启动了一个wsgi服务,具体就不分析了,自己看代码吧。至此,neutron-server的wsgi服务起来了,等待后续的服务请求。


别忘了,main函数中还有一个重要的调用service.server_rpc(),该函数代码如下:


openstack源 OpenStack源码_Server_07


该函数中首先调用manager.NeutronManager.get_plugin()获得一个plugin的对象实例,然后将其作为参数给RpcWorker的构造函数,生成一个RpcWorker对象,再调用RpcWorker对象的start函数。start函数代码如下,


openstack源 OpenStack源码_openstack源_08


它调用了plugin的start_rpc_listeners()函数,根据我安装环境的配置,这里的plugin是neutron.plugins.ml2.plugin.Ml2Plugin类的对象,看下该类的实现:


openstack源 OpenStack源码_main函数_09


可以看到,这个函数启动了一个rpc服务,用于和agent交互。接下来的文章,会写agent端的流程,再接下的文章则详细介绍创建一个租户网络的完整调用流程。