转载: Nova-Router 分析

很早的实现了,nova代码已经做了很多修改了。

以创建实例 URL(http://10.191.7.32:8773/v1.1/service?*****)为例说明 Router 的执行流程

1. 依据 python 的 pater.deploy 模块的语法规则,利用 Nova 的 apt-paste 文件,将该 URL 依次通过“faultwrap noauth ratelimit extensions osapiapp11”执行,本例分析 URL 在 osapiapp11 的执行流程,其他只 是对 URL 进行过滤操作。

2. osapiapp11 对应的类 nova.api.openstack:APIRouterV11,该类的继承关 系图如下

 

3 代码执行流程

3.1 初始化

a.osapiapp11 会调用类○3 中的 factory()函数,该函数由继承父类○2 而来。

b. 类○3 factory()调用自身的构造函数, __init__()函数该函数由 继承父类○2 而来。

c.类○3 __init__()函数调用自身实现的_setup_routes()函数,建立 URL 映射表 mapper。

d. _setup_routes()首先调用_setup_base_routes()函数建立基 础映射,该函数由类○3 从父类○2 继承而来。

e._setup_base_routes()建立基础映射,并调用 super(APIRouter, self).__init__(mapper),即调用类○1 的__init__()函数。

f. 完成类○3 初始化

nova.wsgi.Router()○1

nova.api.openstack.APIRouter()○2

nova.api.openstack.APIRouterV10()

nova.api.openstack.APIRouterV11()○3

3.2 执行 URL 映射(根据例子中的 URL)

a. 调用类○3 __call__()函数,该函数继承自类○1

b. __call__()调用 routes.middleware.RoutesMiddleware,完成 URL 到 Contoller 的映射。映射的 controller 为 servers.create_resource(version)。 c. servers.create_resource(version) 函 数 调 用 的 为 nova.api.openstack.servers.py 模块中的 create_resource 函数。该类通过调 用函数 wsgi.Resource(controller, deserializer, serializer) , 实 例 化 nova.api.wsgi.Resouce()类作为 controller 对 象。该对象包含了一个 controller 属性,该属性为 nova.api.openstack.serveric. ControllerV11 类的 实例。

d. 调用上步中实例化对象的__call__函数完成 URL 的执行。即调用 nova.api.wsgi.Resouce()的__call__函数。

e. 该函数调用 self.deserializer.deserialize(request)获取请求的 action 字符串。然后调用自身的 dispatch 函数从 controller 中获取相关函数并调 用执行。

f. 即从 nova.api.openstack.servers. ControllerV11 类中调用 create() 函数,该函数继承自该类的基类 Controller。

g. create 通过调用 self.compute_api.create 完成对 URL 操作。

nova.api  controller 继承关系图

posted @ 2015-10-16 08:40  lvmxh  阅读(303)  评论(0编辑  收藏  举报