【openstack】Quantum消息处理流程简析
1 Paste.deploy配置http://dl.iteye.com/upload/attachment/0075/1164/faef214b-a1fb-3d9a-99f6-33a8be391ccb.bmp
2 authtoken
调用kestone进行鉴权。
3 keystonecontext
根据鉴权信息(user_id,tenant_id,roles等),更新请求中的环境上下文。
http://dl.iteye.com/upload/attachment/0075/1166/37f2bd4a-2ef1-3987-af90-7fcda3e4e485.bmp
4 extensions
1) 获取quantum.conf中core_plugin配置的插件类
2) 如果在quantum/extensions/extensions.py中ENABLED_EXTS中有该插件的配置信息,默认如下图:
则加载ext_db_models表示的数据库建模类
3) 加载core_plugin插件类
4) 初始化PluginAwareExtensionManager类及其父类ExtensionManager,两个类的类图如下:
http://dl.iteye.com/upload/attachment/0075/1168/13176a6c-3105-3645-b55d-dc129f345139.bmp
类ExtensionManager初始化主要是加载扩展类目录中的扩展类,代码解析如下:
http://dl.iteye.com/upload/attachment/0075/1172/e1cfe9f4-6151-3ca6-9b29-a53aef7faabb.png
5) 初始化ExtensionMiddleware
整个初始化过程主要使用从Ruby移植到Python的Routes开发包,用来定义URL和应用程序接口之间的映射,这里不是很懂,网上关于Routes的资料除了官方文档外几乎没有。
<div class="dp-highlighter"><div class="bar">def __init__(self, application,
ext_mgr=None):
self.ext_mgr = (ext_mgr
or ExtensionManager(
get_extensions_path()))
# 定义mapper
mapper = routes.Mapper()
# extended resources
for resource in self.ext_mgr.get_resources():
LOG.debug(_('Extended resource: %s'),
resource.collection)
for action, method in resource.collection_actions.iteritems():
path_prefix = ""
parent = resource.parent
conditions = dict(method=)
path = "/%s/%s" % (resource.collection, action)
if parent:
path_prefix = "/%s/{%s_id}" % (parent["collection_name"],
parent["member_name"])
with mapper.submapper(controller=resource.controller,
action=action,
path_prefix=path_prefix,
conditions=conditions) as submap:
submap.connect(path)
submap.connect("%s.:(format)" % path)
mapper.resource(resource.collection, resource.collection,
controller=resource.controller,
member=resource.member_actions,
parent_resource=resource.parent)
# extended actions
action_controllers = self._action_ext_controllers(application,
self.ext_mgr, mapper)
for action in self.ext_mgr.get_actions():
LOG.debug(_('Extended action: %s'), action.action_name)
controller = action_controllers
controller.add_action(action.action_name, action.handler)
# extended requests
req_controllers = self._request_ext_controllers(application,
self.ext_mgr, mapper)
for request_ext in self.ext_mgr.get_request_extensions():
LOG.debug(_('Extended request: %s'), request_ext.key)
controller = req_controllers
controller.add_handler(request_ext.handler)
# 个人理解,开始根据Mapper解析URL,_dispatch()方法根据解析的结果进行处理
self._router = routes.middleware.RoutesMiddleware(self._dispatch,
mapper)
super(ExtensionMiddleware, self).__init__(application)
页:
[1]