nova创建虚拟机源码分析系列之五 nova源码分发实现
前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫。本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类。
nova对于URL请求的处理在上一篇博文中以刻画了简化版的模型,参考该模型,能够快速理解openstack中真实的处理情景。
首先来熟悉nova的代码
openstack nova的源码分布如下,其中比较重要的是nova文件夹,几乎所有的功能实现都是在这个文件夹下。

WSGI服务器的实现。
路径:/nova/service.py

configure.ini配置文件
路径:/etc/nova/api-paste.ini
#############
# OpenStack #
############# [composite:osapi_compute]
use = call:nova.api.openstack.urlmap:urlmap_factory
/: oscomputeversions
# v21 is an exactly feature match for v2, except it has more stringent
# input validation on the wsgi surface (prevents fuzzing early on the
# API). It also provides new features via API microversions which are
# opt into for clients. Unaware clients will receive the same frozen
# v2 API feature set, but with some relaxed validation
#<-------------------------------------------->#
#http://192.168.252.177:8000/v2.0
#判断api的版本信息,也是IP地址之后的第一个路径
#<-------------------------------------------->#
/v2: openstack_compute_api_v21_legacy_v2_compatible
/v2.1: openstack_compute_api_v21 [composite:openstack_compute_api_v21]
use = call:nova.api.auth:pipeline_factory_v21
noauth2 = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit noauth2 osapi_compute_app_v21
keystone = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v21 [composite:openstack_compute_api_v21_legacy_v2_compatible]
use = call:nova.api.auth:pipeline_factory_v21
noauth2 = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit noauth2 legacy_v2_compatible osapi_compute_app_v21
keystone = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit authtoken keystonecontext legacy_v2_compatible osapi_compute_app_v21 [filter:request_id]
paste.filter_factory = oslo_middleware:RequestId.factory [filter:compute_req_id]
paste.filter_factory = nova.api.compute_req_id:ComputeReqIdMiddleware.factory [filter:faultwrap]
paste.filter_factory = nova.api.openstack:FaultWrapper.factory [filter:noauth2]
paste.filter_factory = nova.api.openstack.auth:NoAuthMiddleware.factory [filter:sizelimit]
paste.filter_factory = oslo_middleware:RequestBodySizeLimiter.factory [filter:http_proxy_to_wsgi]
paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory [filter:legacy_v2_compatible]
paste.filter_factory = nova.api.openstack:LegacyV2CompatibleWrapper.factory #<-------------------------------------------->#
#最终到了应用的部分,osapi_compute_app_v21的实现在
/nova/api/openstack/compute/__init__.py中
#<-------------------------------------------->#
[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory [pipeline:oscomputeversions]
pipeline = faultwrap http_proxy_to_wsgi oscomputeversionapp [app:oscomputeversionapp]
paste.app_factory = nova.api.openstack.compute.versions:Versions.factory
configure.ini的分发策略是:
/ ---> [composite:osapi_compute]
/v2 ---> openstack_compute_api_v21_legacy_v2_compatible
/v2.1 ---> openstack_compute_api_v21
openstack_compute_api_v21_legacy_v2_compatible 的实现:
根据配置文件,可以选择两中认证模式,分别是:
keystone 的认证方法是: cors--> http_proxy_to_wsgi --> compute_req_id --> faultwrap
--> sizelimit --> authtoken --> keystonecontext -->
--> legacy_v2_compatible---- osapi_compute_app_v21
前面都是过滤,直到最后的osapi_compute_app_v21是处理函数。
处理函数的实现:
在nova/api/openstack/compute下的APIRouterV21.factory工厂方法中,所以下一步,会进入该方法。 APIRouterV21.factory
路径:/nova/api/openstack/compute/__init__.py
该类是继承自:nova.api.openstack.APIRouterV21,功能实现在该类中。
APIRouterV21
路径:/nova/api/openstack/__init__.py
这里实现了一个重要的URL和处理方法绑定功能,功能如同下面的函数。请求方法 + URL 绑定到对应的处理函数上,实现注册的功能。

该类继承自 base_wsgi.Router,所以去该类上查看具体的实现。
base_wsgi.Router
路径:nova/wsgi.py

看到这里就应该很熟悉了,mapper对象,RoutesMiddleware()函数,_dispatch()函数。
mapper将请求URL解析,根据注册的方法和处理函数获取处理的类,然后将该类传递给_dispatch()函数。函数_dispatch获取处理的类的名称,
然后判断是否为空,如果存在该类,则在return中调用该类的__call__方法。
注:__call__()方法是python类中的一个方法。在函数返回当中不能返回一个对象,可以返回一个函数。所以__call__实现功能是在python类中调用该类的方法,变量
实现一个函数的功能。
在_disptach函数最后的返回中,调用了处理类的__call__方法。nova创建虚拟机过程中,就会调用Controller中的create方法,所以调用的就是下面的方法:


nova创建虚拟机源码分析系列之五 nova源码分发实现的更多相关文章
- nova创建虚拟机源码分析系列之四 nova代码模拟
在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...
- Java源码分析系列之HttpServletRequest源码分析
从源码当中 我们可以 得知,HttpServletRequest其实 实际上 并 不是一个类,它只是一个标准,一个 接口而已,它的 父类是ServletRequest. 认证方式 public int ...
- netty源码分析系列文章
netty源码分析系列文章 nettynetty源码阅读netty源码分析 想在年终之际将对netty研究的笔记记录下来,先看netty3,然后有时间了再写netty4的,希望对大家有所帮助,这个是 ...
- nova创建虚拟机源码分析系列之三 PasteDeploy
上一篇博文介绍WSGI在nova创建虚拟机过程的作用是解析URL,是以一个最简单的例子去给读者有一个印象.在openstack中URL复杂程度也大大超过上一个例子.所以openstack使用了Past ...
- nova创建虚拟机源码系列分析之二 wsgi模型
openstack nova启动时首先通过命令行或者dashborad填写创建信息,然后通过restful api的方式调用openstack服务去创建虚拟机.数据信息从客户端到达openstack服 ...
- Spark 源码分析系列
如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...
- MyCat源码分析系列之——SQL下发
更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...
- MyCat源码分析系列之——BufferPool与缓存机制
更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...
- MyCat源码分析系列之——前后端验证
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ...
随机推荐
- 爬虫day 04_01(爬百度页面)
import urllib.request import http.cookiejar from lxml import etree head = { 'Connection': 'Keep-Aliv ...
- SPFA【模板】单源最短路径
题目传送 https://www.luogu.org/problem/show?pid=3371没啥解释,SPFA纯模版qaq//Gang #include<iostream> #incl ...
- mysqldump指定编码导出数据
mysqldump指定编码导出数据 第一步,导出旧库 mysqldump --default-character-set=latin1 -uroot -pXXX --database db > ...
- Postgres中表和元组的组织方式
PG version 9.5.3 PG中四种堆文件: 普通堆 临时堆 序列堆 TOAST表 PageHeaderData长度为24(截图为8.4版本,20字节)个字节包含的内容如下: 空闲空间的起始和 ...
- 【luogu P1471】方差
https://www.luogu.org/problem/show?pid=1471 一眼就能看出是线段树/树状数组题目了. 求平均不用说,线段树/树状数组维护区间和即可. 方差怎么求?先变换下方差 ...
- day2-Python基本数据类型介绍
百度云连接 链接:https://pan.baidu.com/s/1hsGQx7m 密码:u07q
- DDD实践
一. 虽然招聘是主旋律,但技术还是得不断的突破.在.net core的实践中,一开始就瞄准了DDD.需要特别感谢https://github.com/EduardoPires/EquinoxProje ...
- 翻煎饼 Stacks of Flapjacks
题意:本题意为煎饼排序,大的放在上面,小的放在下面(此题输入是从上到下输入的),为煎饼排序是通过一系列的"翻转"动作来完成的.翻转动作就是将一个小铲插到一叠煎饼中的某两个煎饼之间, ...
- DXGI快速截屏录屏技术
DXGI快速截屏录屏技术 概述 很多地方都需要用到截屏/录屏技术,比如桌面直播,桌面录制等等.在微软Windows平台,有很多截屏的接口,不过大多数性能并不理想,Windows8以后微软引入了一套 ...
- Android中相机和相冊使用分析
Android中相机和相冊使用分析 欢迎转载,但请尊重原创(文章来自不易,转载请标明转载出处,谢谢) 在手机应用程序中,使用自带的相机拍照以及相冊选择喜欢的图片是最常见只是的用户需求,那么怎么合理使用 ...



