OpenStack源码系列---neutron-server
在看过了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的更多相关文章
- OpenStack源码系列---nova-api
OpenStack源码实际上是比较规范的,但是对刚刚接触到源代码的人来说,却感觉有点混乱.我刚开始的时候也常常搞乱,比如service.Service类继承自openstack.common.serv ...
- OpenStack源码分析 Neutron源码分析(一)-----------Restful API篇
原文:https://blog.csdn.net/happyanger6/article/details/54586463 首先,先分析WSGI应用的实现. 由前面的文章http://blog.csd ...
- OpenStack源码系列---nova-conductor
nova-conductor启动的也是一个rpc server,代码框架和nova-compute类似,所以我也懒得再详细分析一遍服务启动的过程.nova-api那篇文章的最后我说"cctx ...
- OpenStack源码系列---起始篇
近一年来我负责公司云点的自动化部署工作,包括公司自有云平台方案.XenServer.vSphere.Ovirt和OpenStack的自动化安装部署,目前已经到了OpenStack这一部分.自动化部署首 ...
- OpenStack源码系列---nova-compute
nova-compute运行的节点为计算节点,虚拟机运行于计算节点上.例如对于创建虚拟机请求,nova-api接收到客户端请求后,经过nova-scheduler调度器调度,再将请求发送给某个选定的n ...
- (转)如何阅读OpenStack源码
1 关于该项目 本项目使用在线绘图工具web sequencediagrams完成,目标是图形化OpenStack的所有操作流程,通过操作序列图能快速学习Openstack的工作原理,理清各个组件的关 ...
- Netty源码—一、server启动(1)
Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo.RocketMQ.可以说Netty是对Java NIO的封装,比如ByteBu ...
- 11 hbase源码系列(十一)Put、Delete在服务端是如何处理
hbase源码系列(十一)Put.Delete在服务端是如何处理? 在讲完之后HFile和HLog之后,今天我想分享是Put在Region Server经历些了什么?相信前面看了<HTab ...
- 9 hbase源码系列(九)StoreFile存储格式
hbase源码系列(九)StoreFile存储格式 从这一章开始要讲Region Server这块的了,但是在讲Region Server这块之前得讲一下StoreFile,否则后面的不好讲下去 ...
随机推荐
- GET 方法和 POST方法区别
两种 HTTP 请求方法:GET 和 POST 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST. GET - 从指定的资源请求数据. POST - 向指定的资源提交 ...
- Mac版有道云笔记不能自动同步
删除本地资源文件夹 /Users/xxxx/Library/Containers/com.youdao.note.YoudaoNoteMac 直接删除整个文件夹,之后重新登录账号.
- 请编写一个方法,返回某集合的所有非空子集。 给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
题解:观察测试样例,会发现每个子集的选择规律与二进制((2^n) - 1)到 1 的顺序生成的规律是一致的,样例中n=3,2^n-1=7,用二进制表示为111,其中每一位的1表示数组中的三个数都选择. ...
- 【LeetCode】Broken Calculator(坏了的计算器)
这道题是LeetCode里的第991道题. 题目描述: 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数 ...
- Leetcode 354.俄罗斯套娃信封问题
俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计 ...
- Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)
昨晚打得小号,虽然很菜,可是还是涨了些rating A. Arpa and a research in Mexican wave time limit per test 1 second memory ...
- get 发送ajax请求
上demo小案例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- 【Luogu】P3381最小费用最大流模板(SPFA找增广路)
题目链接 哈 学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...
- 浅谈java内存泄漏
最近有朋友遇到个问题,tomcat在运行几天后就会报outofmemory,然后就死了,我就稍微总结了下内存泄漏的一些原因,纯属个人理解,欢迎大侠们劈砖: 一.字符串问题 这个也是一个常见的问题,我们 ...
- spring 如何动态加载properties文件的内容
1. 在xml中配置你的properties路径: <bean id="messageSource" class="org.springframework.cont ...