Openstack之paste deployment与代码调用

本文介绍 OpenStack 中 Keystone 组件的 WSGI 配置原理及流程,详细解析 paste.deployment 的使用方式,展示了如何通过配置文件管理 HTTP 请求的过滤与路由。

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



Openstack之paste deployment与代码调用


具体内容可参考:
http://pythonpaste.org/deploy/
http://pythonpaste.org/deploy/module-paste.deploy.html


Paste Deployment用于发现和配置WSGI Application和Server,有了Paste Deployment,WSGI applications只需向其用户提供一个单独的入口loadapp函数,然后用户调用这个函数就可以使用已经开发好的WSGI application,同时,由于只提供了一个入口,WSGI的开发者也不再需要将App的具体实现暴露给用户,大大简化了整个开发过程。


1、paste deploy配置文件


以Openstack中的keystone组件为例,按照官方文档,在Ubuntu14.04下安装kilo版,该文件路径为: /etc/keystone/keystone-paste.ini,其内容如下:

# Keystone PasteDeploy configuration file.
[filter:debug]
paste.filter_factory = keystone.common.wsgi:Debug.factory
[filter:request_id]
paste.filter_factory = oslo_middleware:RequestId.factory
[filter:build_auth_context]
paste.filter_factory = keystone.middleware:AuthContextMiddleware.factory
[filter:token_auth]
paste.filter_factory = keystone.middleware:TokenAuthMiddleware.factory
[filter:admin_token_auth]
paste.filter_factory = keystone.middleware:AdminTokenAuthMiddleware.factory
[filter:json_body]
paste.filter_factory = keystone.middleware:JsonBodyMiddleware.factory
[filter:user_crud_extension]
paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory
[filter:crud_extension]
paste.filter_factory = keystone.contrib.admin_crud:CrudExtension.factory
[filter:ec2_extension]
paste.filter_factory = keystone.contrib.ec2:Ec2Extension.factory
[filter:ec2_extension_v3]
paste.filter_factory = keystone.contrib.ec2:Ec2ExtensionV3.factory
[filter:federation_extension]
paste.filter_factory = keystone.contrib.federation.routers:FederationExtension.factory
[filter:oauth1_extension]
paste.filter_factory = keystone.contrib.oauth1.routers:OAuth1Extension.factory
[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory
[filter:endpoint_filter_extension]
paste.filter_factory = keystone.contrib.endpoint_filter.routers:EndpointFilterExtension.factory
[filter:endpoint_policy_extension]
paste.filter_factory = keystone.contrib.endpoint_policy.routers:EndpointPolicyExtension.factory
[filter:simple_cert_extension]
paste.filter_factory = keystone.contrib.simple_cert:SimpleCertExtension.factory
[filter:revoke_extension]
paste.filter_factory = keystone.contrib.revoke.routers:RevokeExtension.factory
[filter:url_normalize]
paste.filter_factory = keystone.middleware:NormalizingFilter.factory
[filter:sizelimit]
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory


[app:public_service]
paste.app_factory = keystone.service:public_app_factory
[app:service_v3]
paste.app_factory = keystone.service:v3_app_factory
[app:admin_service]
paste.app_factory = keystone.service:admin_app_factory


[pipeline:public_api]
# The last item in this pipeline must be public_service or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_bo
dy ec2_extension user_crud_extension public_service
[pipeline:admin_api]
# The last item in this pipeline must be admin_service or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension s3_extension crud_extension admin_service
[pipeline:api_v3]
# The last item in this pipeline must be service_v3 or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_bo
dy ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_
extension endpoint_filter_extension endpoint_policy_extension service_v3


[app:public_version_service]
paste.app_factory = keystone.service:public_version_app_factory
[app:admin_version_service]
paste.app_factory = keystone.service:admin_version_app_factory


[pipeline:public_version_api]
pipeline = sizelimit url_normalize public_version_service
[pipeline:admin_version_api]
pipeline = sizelimit url_normalize admin_version_service


[composite:main]
use = egg:Paste#urlmap
/v2.0 = public_api
/v3 = api_v3
/ = public_version_api
[composite:admin]
use = egg:Paste#urlmap
/v2.0 = admin_api
/v3 = api_v3
/ = admin_version_api


1.1 sections


该文件由app, filter, pipeline, composite等section组成。

composite是最高层次的调度者,它针对不同的url将具体工作分配到不同的pipeline上。

接下来再看pipeline,每一个pipeline由若干个filter和一个application组成,前者对http请求进行过滤,包括判断请求是否具有必要的参数、对参数进行格式化处理等操作。

application位于pipeline的末尾,每一个pipeline只有一个application。最终通过所有filter的请求被application所处理,这就是composite, pipeline, filter, app之间的逻辑关系。


keystone-paste.ini文件从一个高层次定义了keystone所需的composite会将哪些url交由由哪些pipeline, 每一个pipeline由哪些filter和app组成,以及具体到每一个filter和app是
由系统源码的哪一个部分实现的。


1.1.1 app


app的use配置有下面5种方法:


#指向另外一个配置文件中的application
[app:myapp]
use = config:another_config_file.ini#app_name


# or any URI:
[app:myotherapp]
use = egg:MyApp


# or a callable from a module:
[app:mythirdapp]
use = call:my.project:myapplication


# or even another section:
[app:myfourthapp]
use = myotherapp


# or point to python code directly, and must use protocol currently
[app:myfifthapp]
paste.app_factory = myapp.modulename:app_factor


1.1.2 composite


composite可以将url转向其他的pipeline,例如下面的例子:


[composite:main]
use = egg:Paste#urlmap
/v2.0 = public_api
/v3 = api_v3
/ = public_version_api


[pipeline:api_v3]
# The last item in this pipeline must be service_v3 or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body 
                   ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension 
                   oauth1_extension endpoint_filter_extension endpoint_policy_extension service_v3


这里将URL /v3转到pipeline api_v3。




1.1.3 pipeline


每一个pipeline由若干个filter和一个application组成,前者对http请求进行过滤,包括判断请求是否具有必要的参数、对参数进行格式化处理等操作。


对于上面的[pipeline:api_v3]:
“=”后面的内容中,最后一个是application,而之前都是filter。


例如url_normalize是一个filter:
[filter:url_normalize]
paste.filter_factory = keystone.middleware:NormalizingFilter.factory


service_v3则是一个app:
[app:service_v3]
paste.app_factory = keystone.service:v3_app_factory


1.1.4 filter


[filter:name]
定义过滤器,类似python中的decorator(装饰器),接受一个application参数作为对象,返回一个封装后的 application,这里只是定义了filter,并没有将filter作用到application

上。 


将filter作用到app的方法有两种: filter-app section和 pipe section 



1.1.5 filter-app


[filter-app:name]
与filter类似,唯一的区别是filter-app可以使用next参数来指定filter要作用的application。


2、调用例子


以POST请求http://localhost:35357/v3/auth/tokens为例:


第一步:通过composite中的/v3将其映射到pipeline api_v3;


第二步:pipeline api_v3将其对应到app service_v3,首先需要调用一系列的filter;


第三步:所有的filter通过以后,转由app service_v3进行处理;


第四步:app service_v3调用keystone.service:v3_app_factory;


第五步:最终将执行路径/usr/lib/python2.7/dist-packages/keystone中的文件service.py中的v3_app_factory函数。










    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值