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

neutron-server的main函数如下图:

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

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

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

_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内容如下:

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

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

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

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

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

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

OpenStack源码系列---neutron-server的更多相关文章

  1. OpenStack源码系列---nova-api

    OpenStack源码实际上是比较规范的,但是对刚刚接触到源代码的人来说,却感觉有点混乱.我刚开始的时候也常常搞乱,比如service.Service类继承自openstack.common.serv ...

  2. OpenStack源码分析 Neutron源码分析(一)-----------Restful API篇

    原文:https://blog.csdn.net/happyanger6/article/details/54586463 首先,先分析WSGI应用的实现. 由前面的文章http://blog.csd ...

  3. OpenStack源码系列---nova-conductor

    nova-conductor启动的也是一个rpc server,代码框架和nova-compute类似,所以我也懒得再详细分析一遍服务启动的过程.nova-api那篇文章的最后我说"cctx ...

  4. OpenStack源码系列---起始篇

    近一年来我负责公司云点的自动化部署工作,包括公司自有云平台方案.XenServer.vSphere.Ovirt和OpenStack的自动化安装部署,目前已经到了OpenStack这一部分.自动化部署首 ...

  5. OpenStack源码系列---nova-compute

    nova-compute运行的节点为计算节点,虚拟机运行于计算节点上.例如对于创建虚拟机请求,nova-api接收到客户端请求后,经过nova-scheduler调度器调度,再将请求发送给某个选定的n ...

  6. (转)如何阅读OpenStack源码

    1 关于该项目 本项目使用在线绘图工具web sequencediagrams完成,目标是图形化OpenStack的所有操作流程,通过操作序列图能快速学习Openstack的工作原理,理清各个组件的关 ...

  7. Netty源码—一、server启动(1)

    Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo.RocketMQ.可以说Netty是对Java NIO的封装,比如ByteBu ...

  8. 11 hbase源码系列(十一)Put、Delete在服务端是如何处理

    hbase源码系列(十一)Put.Delete在服务端是如何处理?    在讲完之后HFile和HLog之后,今天我想分享是Put在Region Server经历些了什么?相信前面看了<HTab ...

  9. 9 hbase源码系列(九)StoreFile存储格式

    hbase源码系列(九)StoreFile存储格式    从这一章开始要讲Region Server这块的了,但是在讲Region Server这块之前得讲一下StoreFile,否则后面的不好讲下去 ...

随机推荐

  1. log4j动态日志级别调整

    1. 针对root logger的设置 log4j.rootLogger=INFO, CONSOLELogger.getRootLogger().setLevel(org.apache.log4j.L ...

  2. oracle 安装 启动listener 建库相关

    安装 参考 http://www.cnblogs.com/gaojun/archive/2012/11/22/2783257.html 几个问题: 1. 用户删除问题 p001:~ # userdel ...

  3. GT使用说明

    GT文档:https://gt.qq.com/docs.html GT Android版的详细使用手册: https://gt.qq.com/docs/a/GTAndroidUserGuide.pdf

  4. Caffe 编译: undefined reference to imencode()

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/52150781 整理之前编译工程中遇到的 ...

  5. ios sqlite 简单使用

    // // ViewController.m // sqlitedemo // // Created by lam_TT on 15-4-11. // Copyright (c) 2015年 lam_ ...

  6. 雅礼培训 Problem A 【线段树】

    题意 维护一段区间,支持求区间最大值,区间且,区间或 \(n,q<=2*10^5\) 题解 我们用线段树维护区间最大值 对于and和or运算, and实质就是强行把一些位改为0 or实质就是强行 ...

  7. [NOI2001] 食物链 (扩展域并查集)

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  8. STL学习笔记(四) 迭代器

    条款26:iterator 优先于 const_iterator, reverse_iterator, const_reverse_iterator iterator, reverse_iterato ...

  9. Laravel 5 Form 和 HTML 的使用

    最近在用 laravel 5 做例子,在做到表单的时候,习惯性的使用 Form::open() 结果发现提示错误,没有这个类, 好吧,找了找,发现 在laravel 5 中,把 from 和 html ...

  10. 洛谷 P1522 牛的旅行

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...