Paste Deploy是一个WSGI工具包,对WSGI进行了一些包装,使之更易使用。对外提供WSGI服务,配置信息在etc目录下的api-paste.ini文件,下图是openstack nova项目的api-paste.ini文件示例
由图可以看出api-paste有四种不同的配置composite、app、filter、pipeline。
配置说明 composite
composite用于实现复杂的应用程序,可以进行分支选择,将一个请求调度定向多个app上,通过自定义或默认的urlmap来将请求调度到应用上。或者定义处理请求的流水线。
如图所示,openstack_compute_api_v21中处理所有虚拟机的请求,genuine配置文件配置需要使用keystone进行认证,所以会在第三个app进行处理,第三个app采用管道形式,将多个app组合
keystone = cors compute_req_id faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v21
并且cors compute_req_id faultwrap sizelimit authtoken keystonecontext这些都是配置定义的filter检查,只有osapi_compute_app_v21配置定义为app。
配置说明 app
声明一个应用,用于处理请求,表示该请求的处理类。如果xxx为main表示只有一个。
表示处理请求的对象通过指定路径的方法获得。
nova的配置文件中,根据上文定义osapi_compute_app_v21为app
配置项中指明处理类为nova.api.openstack.compute:APIRouterV21.factory
配置说明 filter
filter配置表示对请求进行pre handle和post handle。例如用户验证,准备服务器环境
配置说明 pipeline
pipeline配置从UNIX系统的pipeline发展而来,表示请求由一连串app或filter处理,并最终获得结果。由若干个filter和1个app组成。通过pipeline,可以很容易定制WSGI服务
查找过程
nova api-paste.ini配置文件内容如下
############
# Metadata #
############
[composite:metadata]
use = egg:Paste#urlmap
/: meta
[pipeline:meta]
pipeline = cors metaapp
[app:metaapp]
paste.app_factory = nova.api.metadata.handler:MetadataRequestHandler.factory
#############
# OpenStack #
#############
[composite:osapi_compute]
use = call:nova.api.openstack.urlmap:urlmap_factory
/: oscomputeversions
/v2: openstack_compute_api_v21_legacy_v2_compatible
/v2.1: openstack_compute_api_v21
# NOTE: this is deprecated in favor of openstack_compute_api_v21_legacy_v2_compatible
[composite:openstack_compute_api_legacy_v2]
use = call:nova.api.auth:pipeline_factory
noauth2 = cors compute_req_id faultwrap sizelimit noauth2 legacy_ratelimit osapi_compute_app_legacy_v2
keystone = cors compute_req_id faultwrap sizelimit authtoken keystonecontext legacy_ratelimit osapi_compute_app_legacy_v2
keystone_nolimit = cors compute_req_id faultwrap sizelimit authtoken keystonecontext osapi_compute_app_legacy_v2
[composite:openstack_compute_api_v21]
use = call:nova.api.auth:pipeline_factory_v21
noauth2 = cors compute_req_id faultwrap sizelimit noauth2 osapi_compute_app_v21
keystone = cors compute_req_id faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v21
[composite:openstack_compute_api_v21_legacy_v2_compatible]
use = call:nova.api.auth:pipeline_factory_v21
noauth2 = cors compute_req_id faultwrap sizelimit noauth2 legacy_v2_compatible osapi_compute_app_v21
keystone = cors compute_req_id faultwrap sizelimit authtoken keystonecontext legacy_v2_compatible osapi_compute_app_v21
[filter:request_id]
paste.filter_factory = oslo_middleware:RequestId.factory
[filter:compute_req_id]
paste.filter_factory = nova.api.compute_req_id:ComputeReqIdMiddleware.factory
[filter:faultwrap]
paste.filter_factory = nova.api.openstack:FaultWrapper.factory
[filter:noauth2]
paste.filter_factory = nova.api.openstack.auth:NoAuthMiddleware.factory
[filter:legacy_ratelimit]
paste.filter_factory = nova.api.openstack.compute.limits:RateLimitingMiddleware.factory
[filter:sizelimit]
paste.filter_factory = oslo_middleware:RequestBodySizeLimiter.factory
[filter:legacy_v2_compatible]
paste.filter_factory = nova.api.openstack:LegacyV2CompatibleWrapper.factory
[app:osapi_compute_app_legacy_v2]
paste.app_factory = nova.api.openstack.compute:APIRouter.factory
[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory
[pipeline:oscomputeversions]
pipeline = faultwrap oscomputeversionapp
[app:oscomputeversionapp]
paste.app_factory = nova.api.openstack.compute.versions:Versions.factory
##########
# Shared #
##########
[filter:cors]
paste.filter_factory = oslo_middleware.cors:filter_factory
oslo_config_project = nova
[filter:keystonecontext]
paste.filter_factory = nova.api.auth:NovaKeystoneContext.factory
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
首先因为没有main,根据openstack的请求osapi_compute,会自动跳转到section[composite:osapi_compute]中。
在该section中根据请求的url中版本号决定跳转到不同的section。
v2版本的请求跳转到section【openstack_compute_api_v21_legacy_v2_compatible】
v2.1版本的请求跳转到section【openstack_compute_api_v21】
如下图所示
url请求的版本见api
在openstack_compute_api_v21的section中,根据配置文件的keystone类型,进行keyston对应的管道任务处理,并最终跳转到app:osapi_compute_app_v21进行处理
app:osapi_compute_app_v21中根据配置的nova.api.openstack.compute:APIRouterV21.factory进行处理,然后进入nova的对应python文件中进行执行追踪。