接着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. .net 分割字符串

    string a = "1-2-3-4-5-6-7-8-9"; string[] b = a.Split(new Char[] { '-' }); for (int i = 0; ...

  2. Centos下Sphinx的下载与编译安装

    官方下载地址   http://sphinxsearch.com/downloads/release/ 百度云下载地址  https://pan.baidu.com/s/1gfmPbd5 wget  ...

  3. hdu1061(2015-N1):1.快速幂;2.找规律

    1.快速幂 原理:求a的b次方,将b转化为二进制数,该二进制位第i位的权是2^(i-1), 例如 11的二进制是1011 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 因此,我们将a¹ ...

  4. CodeForces - 796C Bank Hacking

    思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...

  5. [Code] 递归函数在函数式 Java 中的实现

    这里以阶乘函数为例,对于阶乘函数 fact :: Integer -> Integer fact 0 = 1 fact n = n * fact (n - 1) 在函数式 Java 中可以使用 ...

  6. C 语言中模板的几种实现方式

    简单宏定义实现 简单宏定义 - 方式一 这种方式将主要实现部分放在一个宏定义中,利用字符替换的方式实现不同 type 的运算,详细思路见代码: simple_macro_1.c #include &l ...

  7. easywechat--在thinkPHP5中的使用

    1. 安装 1.1 v-4.0 版本要求 PHP版本在7.0以上 1.2 在项目目录下运行以下命令 若未安装composer,则先安装composer -> http://docs.phpcom ...

  8. MS SQL xp_instance_regwrite设置注册表疑惑

      以前写过一篇博文"MS SQL 日志记录管理",里面介绍了如何设置SQL Server的错误日志的最大归档数量,如果在SSMS的UI界面设置,可以从"Manageme ...

  9. 3.3.5 DMA写时发生Cache命中的优化

    在许多高性能处理器中,还提出了一些新的概念,以加速外设到存储器的DMA写过程.如Freescale的I/O Stashing和Intel的IOAT技术. 如图3?8所示,当设备进行存储器写时,如果可以 ...

  10. eclipse中maven的run as打war包失败的问题

    场景一: 由于某些原因,有的时候需要暂时在断网的情况下,或者更标准的说,是在连不上公司的maven公有仓库的情况下打包. 很长一段时间,我打包都是在eclipse中用run as在线打包,直到前不久一 ...