【openstack】Quantum消息处理流程简析

本文详细介绍了Quantum消息处理流程,包括deploy配置、keystone鉴权、环境上下文更新、扩展加载过程及URL映射机制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Quantum消息处理流程

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的资料除了官方文档外几乎没有。

Python代码 复制代码 收藏代码
  1. def__init__(self,application,
  2. ext_mgr=None):
  3. self.ext_mgr=(ext_mgr
  4. orExtensionManager(
  5. get_extensions_path()))
  6. #定义mapper
  7. mapper=routes.Mapper()
  8. #extendedresources
  9. forresourceinself.ext_mgr.get_resources():
  10. LOG.debug(_('Extendedresource:%s'),
  11. resource.collection)
  12. foraction,methodinresource.collection_actions.iteritems():
  13. path_prefix=""
  14. parent=resource.parent
  15. conditions=dict(method=[method])
  16. path="/%s/%s"%(resource.collection,action)
  17. ifparent:
  18. path_prefix="/%s/{%s_id}"%(parent["collection_name"],
  19. parent["member_name"])
  20. withmapper.submapper(controller=resource.controller,
  21. action=action,
  22. path_prefix=path_prefix,
  23. conditions=conditions)assubmap:
  24. submap.connect(path)
  25. submap.connect("%s.:(format)"%path)
  26. mapper.resource(resource.collection,resource.collection,
  27. controller=resource.controller,
  28. member=resource.member_actions,
  29. parent_resource=resource.parent)
  30. #extendedactions
  31. action_controllers=self._action_ext_controllers(application,
  32. self.ext_mgr,mapper)
  33. foractioninself.ext_mgr.get_actions():
  34. LOG.debug(_('Extendedaction:%s'),action.action_name)
  35. controller=action_controllers[action.collection]
  36. controller.add_action(action.action_name,action.handler)
  37. #extendedrequests
  38. req_controllers=self._request_ext_controllers(application,
  39. self.ext_mgr,mapper)
  40. forrequest_extinself.ext_mgr.get_request_extensions():
  41. LOG.debug(_('Extendedrequest:%s'),request_ext.key)
  42. controller=req_controllers[request_ext.key]
  43. controller.add_handler(request_ext.handler)
  44. #个人理解,开始根据Mapper解析URL,_dispatch()方法根据解析的结果进行处理
  45. self._router=routes.middleware.RoutesMiddleware(self._dispatch,
  46. mapper)
  47. 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值