本博客欢迎转发,但请保留原作者信息!
博客地址:http://blog.csdn.net/llg8212
内容系本人学习、研究和总结,如有雷同,不胜荣幸!
一篇比较早的blog,讲解nova-network的,但是原理一样:《OpenStack云平台的网络模式及其工作机制》http://blog.csdn.net/hilyoo/article/details/7721401
陈沙克的理解:http://www.chenshake.com/understanding-of-quantum-networks/
用最精炼语言介绍OpenStack网络代码neutron演进的前世今生:http://www.openstack.cn/p353.html
通过devstack启动neutron服务需要在localrc中加入如下配置: disable_service n-net enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta enable_service neutron # Optional, to enable tempest configuration as part of devstack enable_service tempest然后再运行stack.sh
cat /usr/local/bin/neutron-server,其内容为:
import sys
from neutron.server import main
if __name__ == "__main__":
sys.exit(main())
很容易看出执行的入口为neutron.server.main函数,neutron.server.main函数代码如下:
def main():
eventlet.monkey_patch() # eventlet是python的协程,协程的介绍可参见http://blog.csdn.net/hackerain/article/details/7836993
# the configuration will be read into the cfg.CONF global data structure
config.parse(sys.argv[1:])
if not cfg.CONF.config_file:
sys.exit(_("ERROR: Unable to find configuration file via the default"
" search paths (~/.neutron/, ~/, /etc/neutron/, /etc/) and"
" the '--config-file' option!"))
try:
neutron_service = service.serve_wsgi(service.NeutronApiService) # 创建NeutronApiService的实例,并调用start方法。start方法就是启动socket服务器端
neutron_service.wait()
except RuntimeError as e:
sys.exit(_("ERROR: %s") % e)
start函数以协程方式启动wsgi服务的代码:
def _run(self, application, socket):
"""Start a WSGI server in a new green thread."""
eventlet.wsgi.server(socket, application, custom_pool=self.pool,
log=logging.WritableLogger(LOG)) # eventlet.wsgi.server()生成了一个http server,并通过server.start()启动了一个WSGI程序。WSGI(web server gateway interface)web服务器网关接口,WSGI的作用就是将client发给web server的请求转发给要实际处理这个请求的程序。
处理请求的app为函数_run_wsgi中的 app = config.load_paste_app(app_name),该函数的实现就是从配置文件api-paste.ini中加载‘neutron’的app。
api-paste.ini中根据不同版本构建不同的实例:
[composite:neutron]
use = egg:Paste#urlmap
/: neutronversions
/v2.0: neutronapi_v2_0
[composite:neutronapi_v2_0]
use = call:neutron.auth:pipeline_factory
noauth = extensions neutronapiapp_v2_0
keystone = authtoken keystonecontext extensions neutronapiapp_v2_0
[filter:keystonecontext]
paste.filter_factory = neutron.auth:NeutronKeystoneContext.factory
[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
[filter:extensions]
paste.filter_factory = neutron.api.extensions:plugin_aware_extension_middleware_factory
[app:neutronversions]
paste.app_factory = neutron.api.versions:Versions.factory
[app:neutronapiapp_v2_0]
paste.app_factory = neutron.api.v2.router:APIRouter.factory
neutron.api.v2.router:APIRouter.factory就是构造APIRouter的实例,APIRouter的构造函数中构造了4个controller,代码如:
mapper.connect('index', '/', controller=Index(RESOURCES))
controller = base.create_resource(
collection, resource, plugin, params, allow_bulk=allow_bulk,
parent=parent, allow_pagination=allow_pagination,
allow_sorting=allow_sorting)
base.create_resource中将处理函数记录到self._plugin_handlers,内容如下:
{'create': 'create_subnet', 'delete': 'delete_subnet', 'list': 'get_subnets', 'update': 'update_subnet', 'show': 'get_subnet'}
{'create': 'create_network', 'delete': 'delete_network', 'list': 'get_networks', 'update': 'update_network', 'show': 'get_network'}
{'create': 'create_port', 'delete': 'delete_port', 'list': 'get_ports', 'update': 'update_port', 'show': 'get_port'}
扩展的入口为(api-paste.ini配置中指定):neutron.api.extensions:plugin_aware_extension_middleware_factory,
{'create': 'create_router', 'delete': 'delete_router', 'list': 'get_routers', 'update': 'update_router', 'show': 'get_router'}
{'create': 'create_floatingip', 'delete': 'delete_floatingip', 'list': 'get_floatingips', 'update': 'update_floatingip', 'show': 'get_floatingip'}
{'create': 'create_agent', 'delete': 'delete_agent', 'list': 'get_agents', 'update': 'update_agent', 'show': 'get_agent'}
通过这些操作和函数对应的记录,将相应的请求路由到配置的plugin的相应函数。
controller = base.create_resource中创建了Controller对象,其中的index方法就是处理wsgi的查询列表请求,show就是处理根据指定id获取单个信息的请求,create就是创建,delete就是删除,update就是更新。在每一个方法中调用plugin的相应方法来处理请求消息。
/etc/neutron/neutron.conf中使用的默认plugin为:core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin
db本身也是一个plugin,名字为db_base_plugin_v2.py。