Quantum消息处理流程
本博客欢迎转发,但请保留原作者(孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
1 Paste.deploy配置
2 authtoken
调用kestone进行鉴权。
3 keystonecontext
根据鉴权信息(user_id,tenant_id,roles等),更新请求中的环境上下文。
4 extensions
1) 获取quantum.conf中core_plugin配置的插件类
2) 如果在quantum/extensions/extensions.py中ENABLED_EXTS中有该插件的配置信息,默认如下图:
则加载ext_db_models表示的数据库建模类
3) 加载core_plugin插件类
4) 初始化PluginAwareExtensionManager类及其父类ExtensionManager,两个类的类图如下:
类ExtensionManager初始化主要是加载扩展类目录中的扩展类,代码解析如下:
5) 初始化ExtensionMiddleware
整个初始化过程主要使用从Ruby移植到Python的Routes开发包,用来定义URL和应用程序接口之间的映射,这里不是很懂,网上关于Routes的资料除了官方文档外几乎没有。
- 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=[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[action.collection]
- 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[request_ext.key]
- controller.add_handler(request_ext.handler)
- # 个人理解,开始根据Mapper解析URL,_dispatch()方法根据解析的结果进行处理
- self._router = routes.middleware.RoutesMiddleware(self._dispatch,
- mapper)
- super(ExtensionMiddleware, self).__init__(application)
对于每一个资源的处理是在quantum/api/v2/base.py/Controller类中
5 quantumapiapp_v2_0
处理类:quantum/api/v2/router.py::APIRouter类
初始化:
1) 根据扩展类的配置更新quantum/api/v2/attributes.py::RESOURCE_ATTRIBUTE_MAP定义的对象属性,因为有的扩展类扩展了标准对象(network, port, subnet)的属性。
2) 同样使用Routes,定义URL和应用接口的映射关系。
3) 在父类的初始化中,同样调用:
self._router = routes.middleware.RoutesMiddleware(self._dispatch, self.map)
本博客欢迎转发,但请保留原作者(孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!