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 ...
随机推荐
- 详谈Javascript类与继承
本文将从以下几方面介绍类与继承 类的声明与实例化 如何实现继承 继承的几种方式 类的声明与实例化 类的声明一般有两种方式 //类的声明 var Animal = function () { this. ...
- Less注释语法
Less注释语法 适当的注释是保证代码可读性的必要手段,Less支持两种类型的注释:多行注释和单行注释. 1)形如 /* */ 的多行注释.如: /* Hello, I'm a CSS-style c ...
- 快速上手使用Maven
maven的相关命令 mvn archetype:create :创建 Maven 项目 mvn compile :编译源代码(编译到target文件夹中) mvn test-compile :编译测 ...
- 教我徒弟Android开发入门(一)
前言: 这个系列的教程是为我徒弟准备的,也适合还不懂java但是想学android开发的小白们~ 本系列是在Android Studio的环境下运行,默认大家的开发环境都是配置好了的 没有配置好的同学 ...
- openstack pike 使用 linuxbridge + vxlan
#openstack pike 使用 linuxbridge + vxlan #openstack pike 集群高可用 安装部署 汇总 http://www.cnblogs.com/elvi/p/ ...
- Shell 初步学习
Shell 概述 Shell:Linux命令解释器 脚本执行方式 chmod 755 脚本名:赋权限(调用必须显示的使用绝对路径或相对路径) bash 脚本名:通过Bash调用执行脚本 命令别名 al ...
- 网页设计——6.html其他标签
今天学习html的其他标签: 一.列表 1.无序列表ul 基本结构: <ul type="属性值"> <li>列表内容</li> </u ...
- Pythonh中的zip()与*zip()函数详解
前言 实验环境: Python 3.6: 示例代码地址:下载示例: 本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables)函数详解 ...
- admin密码重置方式
1.在项目根目录下运行:python manage.py shell 2.重设密码 from django.contrib.auth.models import User user =User.obj ...
- “command line option syntax error,Type command/?for help
VS2010安装WDT时出现"command line option syntax error.Type command/?for help错误 解决:可能是由于你的安装源文件所在的路径中有 ...



