接着OpenStack Paste.ini详解(一),接下来就分析request被paste.ini处理的流程

WSGI server接收到URL形式的request时,这些request首先会被Paste模块按照配置文件paste.ini进行处理,其过程大致如下:

  • composite:将request和application进行映射。然后将request转发到pipeline或app中,最终到达指定的application;
  • pipeline:包含filter和app;
  • filter:调用具体的中间件(MiddleWare)对request进行过滤处理;
  • app:具体的application实现对request的操作;

    我们来逐个字段对文件api-paste.ini的内容进行解析:

    首先,来看下面的字段:
[composite:osapi_volume]
use = call:cinder.api:root_app_factory
/: apiversions
/v1: openstack_volume_api_v1
/v2: openstack_volume_api_v2
/v3: openstack_volume_api_v3

对于osapi_volume,这里使用composite的分发机制:

  • 实现xxx/xxx形式的API交给apiversions来处理;
  • 实现xxx/v1(2/3)/xxx形式的API交给openstack_volume_api_v1(2/3)来处理;

其次,来看apiversions的实现机制:

[pipeline:apiversions]
pipeline = cors http_proxy_to_wsgi faultwrap osvolumeversionapp [app:osvolumeversionapp]
paste.app_factory = cinder.api.versions:Versions.factory

这里使用pipeline字段实现cors、http_proxy_to_wsgi faultwrap对osvolumeversionapp的过滤操作,而osvolumeversionapp具体映射为application:ciner.api.versions:Versions.factory

再次,来看openstack_volume_api_v3(以此为例子说明v1/v2的实现)

[composite:openstack_volume_api_v3]
use = call:cinder.api.middleware.auth:pipeline_factory
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3

这里的composite字段实现了多个application的集合应用,openstack_volume_api_v3具体映射到的application为use = call:cinder.api.middleware.auth:pipeline_factory,pipeline_factory是这个application实现的具体方法,这个application对应了三个参数:noauth、keystone、keystone_nolimit。在这三个参数中,分别集成了多个filter,因为每个参数的application是最后一个字段,即apiv3、apiv3和apiv3。

由于openstack默认使用的是keystone认证,所以我们以参数keystone为例,实现参数keystone的application为:keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3

在apiv3前面的都是它的过滤器,其实现过程也就是cors(http_proxy_to_wsgi(request_id(faultwrap(sizelimit(osprofiler(authtoken(keystonecontext(apiv3)))))))),具体的调用过程为apiv3->keystonecontext->authtoken->osprofiler ->sizelimit ->faultwrap ->request_id ->http_proxy_to_wsgi ->cors ,前面方法的执行结果作为后面方法的输入参数,最后得到的运行结果作为keystone的值。可以说明,noauth、keystone和keystone_nolimit的值都是这样得到的,作为application use = call:cinder.api.middleware.auth:pipeline_factory的输入值。

最后,分别来看其他application的实现:

[app:apiv3]
paste.app_factory = cinder.api.v3.router:APIRouter.factory [filter:keystonecontext]
paste.filter_factory = cinder.api.middleware.auth:CinderKeystoneContext.factory [filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory [filter:osprofiler]
paste.filter_factory = osprofiler.web:WsgiMiddleware.factory [filter:sizelimit]
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory [filter:faultwrap]
paste.filter_factory = cinder.api.middleware.fault:FaultWrapper.factory [filter:request_id]
paste.filter_factory = oslo_middleware.request_id:RequestId.factory [filter:http_proxy_to_wsgi]
paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory [filter:cors]
paste.filter_factory = oslo_middleware.cors:filter_factory
oslo_config_project = cinder

可以看到,这些应用的不同类型与之前的分析是一致的,filter类型的都是过滤器,而apiv3作为最后实现的application都是app类型,接下来我们就可以到对应的类下面去看看具体每个中间件的代码实现了。通过分析我们可以发现,这些application主要是实现了一些身份认证和请求参数限制等验证性质的功能。

接下来就可以使用debug的方式或者print的方式来查看这个过程,至此对paste.ini的简单分析就暂时结束,接下来就是结合源码更加深入的分析。

OpenStack Paste.ini详解(二)的更多相关文章

  1. OpenStack Paste.ini详解(一)

    问题背景 最近在研究openstack 服务的源代码,由于项目代码较多对其又不熟悉,刚开始就不知道从哪里开始入手分析.经过分析发现,在正式分析源码之前需要对python的wsgi.paste.rout ...

  2. Centos7上部署openstack ocata配置详解

    之前写过一篇<openstack mitaka 配置详解>然而最近使用发现阿里不再提供m版本的源,所以最近又开始学习ocata版本,并进行总结,写下如下文档 OpenStack ocata ...

  3. (转)Centos7上部署openstack ocata配置详解

    原文:http://www.cnblogs.com/yaohong/p/7601470.html 随笔-124  文章-2  评论-82  Centos7上部署openstack ocata配置详解 ...

  4. OpenStack各组件详解和通信流程

    一.openstack由来 openstack最早由美国国家航空航天局NASA研发的Nova和Rackspace研发的swift组成.后来以apache许可证授权,旨在为公共及私有云平台建设.open ...

  5. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  6. MySQL Cluster 配置文件(config.ini)详解

    MySQL Cluster 配置文件(config.ini)详解 ################################################################### ...

  7. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  8. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  9. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

随机推荐

  1. Java经典编程题50道之二十九

    求一个3*3矩阵对角线元素之和. public class Example29 {    public static void main(String[] args) {        int[][] ...

  2. REST&RESTFUL

    REST(表征性状态传输,Representational State Transfer)指的是一组架构约束条件和原则.是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格 ...

  3. 老男孩Python全栈开发(92天全)视频教程 自学笔记07

    day7课程内容: Python的编码解码 二进制 --->ASCII:只能存英文和拉丁字符,一个字符占一个字节,8位 ------->gb2312:只能6700多个中文,1980年 -- ...

  4. Markdown语法你都会了吗?

    关于Markdown,它可以说是程序员公认最好的文档语言了,没有之一!我相信经常写文章或者开发文档的大佬们都对其能生成简洁.大方.雅观的文档都深有体会,它的强大是毋庸置疑的.它编写的文档不但能生成ht ...

  5. struts2标签库----数据标签详解

    上篇文章我们介绍struts2标签库中的控制标签的基本使用和部分原理,本篇文章接着了解下标签库中有关数据标签的使用和原理.主要涉及以下数据标签: action标签:用于在视图页面跳转到一个Action ...

  6. 【开源项目】智能电视及电视盒子的控制应用TVRemoteIME的接口说明

    一.APP项目介绍: APP名称:TVRemoteIME 功能说明:安卓智能电视或者安卓盒子的控制应用,可跨屏远程输入.远程遥控(代替遥控器)盒子.盒子应用及文件管理.HTTP/RTMP/MMS网络视 ...

  7. SQL Server查询中对于单列数据','分割的数据进行的拆分操作,集合的每一个行变多行

    1.cross apply cross apply 我们可以把它看作成是inner join 来使用 2.outer apply outer apply我们可以把它看做是left join 来使用 注 ...

  8. C++的AES加解密

    最近公司项目要做个WPF程序,但是底层加密部分要用C++来实现.通过网上搜索各种资料,地址已经记不下了,没发贴出来了! 下面看看如何加解密的~!先贴代码.... string tKey(sKey); ...

  9. Linux显示指定区块大小为1048576字节

    Linux显示指定区块大小为1048576字节 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -m 文件系统 1M-blocks 已用 可用 已用% 挂 ...

  10. Flex和Java通信报错

    1.错误描述 11-30 18:15:52 ERROR [localhost-startStop-1] org.springframework.web.servlet.FrameworkServlet ...