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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#############
# 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的分发策略是:

1
 
/ ---> [composite:osapi_compute] /v2 ---> openstack_compute_api_v21_legacy_v2_compatible /v2.1 ---> openstack_compute_api_v21
1
 
1
openstack_compute_api_v21_legacy_v2_compatible 的实现:根据配置文件,可以选择两中认证模式,分别是:
1
keystone 的认证方法是: cors--> http_proxy_to_wsgi --> compute_req_id --> faultwrap                       --> sizelimit --> authtoken --> keystonecontext -->                      --> legacy_v2_compatible---- osapi_compute_app_v21前面都是过滤,直到最后的osapi_compute_app_v21是处理函数。处理函数的实现:
1
在nova/api/openstack/compute下的APIRouterV21.factory工厂方法中,所以下一步,会进入该方法。APIRouterV21.factory路径:/nova/api/openstack/compute/__init__.py该类是继承自:nova.api.openstack.APIRouterV21,功能实现在该类中。
1
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方法,所以调用的就是下面的方法:

 

 

 

 

 

 

 

1
<strong> </strong>

 

1
<strong><br><br><br><br><br><br><br><br></strong>

__EOF__

本文作者goldsunshine
本文链接https://www.cnblogs.com/goldsunshine/p/7777161.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   金色旭光  阅读(1205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示