Extension Service的WSGI Application与Core Service的相比,有几个不同点。
1 加载所有的Extension Service(因为Extension Service是多个,而不是1个)。
2 为每一个Extension Service构建映射规则:Extension Service API(RESTful)与处理函数之间的映射规则。
3 因为Extension Service的WSGI Application属于filter app性质,所以如果一个HTTP Request不属于所有这些Extension Service的管理范围,那么这个Application还需要将请求转给Core Service的WSGI Application。
下面来介绍Extension Service的WSGI Application。
在etc/api-paste.ini中,有如下配置信息:
#“filter”表明这个section定义的WSGI Application是一个filter app [filter:extensions] #这里定义了一个WSGI Application的factory paste.filter_factory = neutron.api.extensions:plugin_aware_extension_middleware_factory
这个factory的代码如下:
def plugin_aware_extension_middleware_factory(global_config, **local_config): #_factory是一个内嵌函数,参数app就是Core Service的WSGI Application实例,也就是class APIRouter的实例对象 def _factory(app): ext_mgr = PluginAwareExtensionManager.get_instance() return ExtensionMiddleware(app, ext_mgr=ext_mgr) return _factory
这个factory返回的ExtensionMiddleware实例,就是Extension Service的WSGI Application
代码中的app是APIRouter的实例对象,参考下面代码:
def pipeline_factory(loader, global_conf, **local_conf): #这里的app就是Core Service的WSGI Application,也就是class APIrouter的实例对象 app = loader.get_app(pipeline[-1]) filters.reverse() #这个循环中,第一个filter就是Extension Service的WSGI Application的工厂函数,也就是***_factory(app)函数 #这里的app就是class APIrouter的实例对象 for filter in filters: app = filter(app) return app