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

Quantum消息处理流程

1      Paste.deploy配置


2      authtoken

调用kestone进行鉴权。

3      keystonecontext

根据鉴权信息(user_idtenant_idroles等),更新请求中的环境上下文。
【openstack】Quantum消息处理流程简析_第1张图片

4      extensions

1)     获取quantum.confcore_plugin配置的插件类

2)     如果在quantum/extensions/extensions.pyENABLED_EXTS中有该插件的配置信息,默认如下图:
【openstack】Quantum消息处理流程简析_第2张图片
 则加载
ext_db_models表示的数据库建模类

3)     加载core_plugin插件类

4)     初始化PluginAwareExtensionManager类及其父类ExtensionManager,两个类的类图如下:
【openstack】Quantum消息处理流程简析_第3张图片
 类
ExtensionManager初始化主要是加载扩展类目录中的扩展类,代码解析如下:

【openstack】Quantum消息处理流程简析_第4张图片
 5)
    
初始化ExtensionMiddleware

整个初始化过程主要使用从Ruby移植到PythonRoutes开发包,用来定义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)

 

 

你可能感兴趣的:(云计算,openstack,quantum)