openstack neutron学习(一) ---- neutron-server入口

声明:

本博客欢迎转发,但请保留原作者信息!

博客地址: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服务的配置

通过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

neutron-server入口

main函数

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入口

处理请求的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。




你可能感兴趣的:(openstack)