以创建实例 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 继承关系图