在看过了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. css3盒子模型及其定位

    盒子模型常见相关属性和属性取值 /*基本属性*/ padding: padding-left/right/top/bottom border: border-left/right/top/bottom ...

  2. Objective-c 实例变量的访问级别

    在C#和JAVA中无论是method还是variable都有严格的访问级别控制,那么在object-c中对访问级别的使用非常稀少,原因可能是因为在method上没有访问级别的语法,单单控制变量没有什么 ...

  3. python-selenium使用send_keys()方法写中文报错的解决方法

    问题描述: 自动化操作页面,输入中文姓名: # coding=utf-8 url = "http://dealer.bitauto.com/50002218/zuidijia/" ...

  4. 【LeetCode】Reorder Log Files(重新排列日志文件)

    这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...

  5. BZOJ 2337 [HNOI2011]XOR和路径 ——期望DP

    首先可以各位分开求和 定义$f(i)$表示从i到n的期望值,然后经过一些常识,发现$f(n)=1$的时候的转移,然后直接转移,也可以找到$f(n)=0$的转移. 然后高斯消元31次就可以了. #inc ...

  6. BZOJ 4318 OSU! ——期望DP

    这次要求$x^3$的概率和. 直接维护三个值$x$ $x^2$ $x^3$的期望. 概率的平方不等于平方的概率. #include <map> #include <ctime> ...

  7. USACO Longest Prefix

    题目大意:给出一个长字符串,问最长的前缀,使得这个前缀能用给出的一些元素组合而成 思路:暴力dp,dp[i]表示长度为i的前缀能否被表示 /*{ ID:a4298442 PROB:prefix LAN ...

  8. BZOJ2288 【POJ Challenge】生日礼物 【堆 + 链表】

    题目 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知 ...

  9. 【ZOJ4053】Couleur(主席树,set,启发式)

    题意: 有n个位置,每个位置上的数字是a[i],现在有强制在线的若干个单点删除操作,每次删除的位置都不同,要求每次删除之后求出最大的连续区间逆序对个数 n<=1e5,1<=a[i]< ...

  10. 【HDOJ6351】Beautiful Now(贪心,搜索)

    题意:给定一个数字n,最多可以交换其两个数位k次,求交换后的最大值与最小值,最小值不能有前导0 n,k<=1e9 思路: 当k>=n的位数时只需要无脑排序 k<n时有一个显然的贪心是 ...