nova创建虚拟机源码分析系列之五 nova源码分发实现

时间:2023-03-09 05:34:39
nova创建虚拟机源码分析系列之五 nova源码分发实现

前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫。本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类。

nova对于URL请求的处理在上一篇博文中以刻画了简化版的模型,参考该模型,能够快速理解openstack中真实的处理情景。

首先来熟悉nova的代码

openstack  nova的源码分布如下,其中比较重要的是nova文件夹,几乎所有的功能实现都是在这个文件夹下。

nova创建虚拟机源码分析系列之五 nova源码分发实现

WSGI服务器的实现。

路径:/nova/service.py

nova创建虚拟机源码分析系列之五 nova源码分发实现

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 的实现:
根据配置文件,可以选择两中认证模式,分别是:
nova创建虚拟机源码分析系列之五 nova源码分发实现
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创建虚拟机源码分析系列之五 nova源码分发实现
 在nova/api/openstack/compute下的APIRouterV21.factory工厂方法中,所以下一步,会进入该方法。

APIRouterV21.factory
路径:/nova/api/openstack/compute/__init__.py nova创建虚拟机源码分析系列之五 nova源码分发实现
该类是继承自:nova.api.openstack.APIRouterV21,功能实现在该类中。
APIRouterV21
路径:/nova/api/openstack/__init__.py
nova创建虚拟机源码分析系列之五 nova源码分发实现

这里实现了一个重要的URL和处理方法绑定功能,功能如同下面的函数。请求方法 + URL 绑定到对应的处理函数上,实现注册的功能。

nova创建虚拟机源码分析系列之五 nova源码分发实现

该类继承自 base_wsgi.Router,所以去该类上查看具体的实现。

base_wsgi.Router

路径:nova/wsgi.py

nova创建虚拟机源码分析系列之五 nova源码分发实现

看到这里就应该很熟悉了,mapper对象,RoutesMiddleware()函数,_dispatch()函数。

mapper将请求URL解析,根据注册的方法和处理函数获取处理的类,然后将该类传递给_dispatch()函数。函数_dispatch获取处理的类的名称,

然后判断是否为空,如果存在该类,则在return中调用该类的__call__方法。

注:__call__()方法是python类中的一个方法。在函数返回当中不能返回一个对象,可以返回一个函数。所以__call__实现功能是在python类中调用该类的方法,变量

实现一个函数的功能。

在_disptach函数最后的返回中,调用了处理类的__call__方法。nova创建虚拟机过程中,就会调用Controller中的create方法,所以调用的就是下面的方法:

nova创建虚拟机源码分析系列之五 nova源码分发实现

nova创建虚拟机源码分析系列之五 nova源码分发实现