问题背景

最近在研究openstack 服务的源代码,由于项目代码较多对其又不熟悉,刚开始就不知道从哪里开始入手分析。经过分析发现,在正式分析源码之前需要对python的wsgi、paste、routes和webob这几个模块有所了解才可以继续深入。在此,就我对paste的学习理解首先分享出来,其余模块接下来会娓娓道来。

研究对象

  • Devstack 安装的OpenStack Pike版本的Cinder项目

研究过程

1、打开cinder项目下的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 [composite:openstack_volume_api_v1]
use = call:cinder.api.middleware.auth:pipeline_factory
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv1
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv1
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv1 [composite:openstack_volume_api_v2]
use = call:cinder.api.middleware.auth:pipeline_factory
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2 [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 [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:faultwrap]
paste.filter_factory = cinder.api.middleware.fault:FaultWrapper.factory [filter:osprofiler]
paste.filter_factory = osprofiler.web:WsgiMiddleware.factory [filter:noauth]
paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory [filter:sizelimit]
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory [app:apiv1]
paste.app_factory = cinder.api.v1.router:APIRouter.factory [app:apiv2]
paste.app_factory = cinder.api.v2.router:APIRouter.factory [app:apiv3]
paste.app_factory = cinder.api.v3.router:APIRouter.factory [pipeline:apiversions]
pipeline = cors http_proxy_to_wsgi faultwrap osvolumeversionapp [app:osvolumeversionapp]
paste.app_factory = cinder.api.versions:Versions.factory [filter:keystonecontext]
paste.filter_factory = cinder.api.middleware.auth:CinderKeystoneContext.factory [filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory

通过观察,我们很快就能发现这个文件的规律。都是以[type:name]的形式组织起来的,只不过type:name的名称和所包含的内容不太相同而已,接下来我们就对这个文件进行分析;

2、首先,我们需要明确几个概念:

  • 针对composite、app、filter或者pipeline这种带有[]的,我们称之为section;
  • composite:request进来后通过的第一个section,表示需要将一个http url request调度到一个或者多个application上;
  • filter:是一个实现了过滤功能的中间件(将application进行进一步的封装),用于过滤request和response;
  • pipeline:最后一个名字对应的一定是app类型,非最后一个名字对应的是filter;
  • app:一个app就是一个实现主要功能的具体application。所以,app必须是callable object类型,接受的参数(environ, start_response),这是WSGI server交给application的符合WSGI规范的参数。

3、下面对各个section进行简单介绍

(1)[composite:name]

composite section定义了一种application,表示将请求调度定向到多个或者多种应用上。composite section可以是WSGI application的集合,可以包括其他application section中定义的application,常用用法:

[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 [composite:openstack_volume_api_v1]
use = call:cinder.api.middleware.auth:pipeline_factory
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv1
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv1
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv1 [composite:openstack_volume_api_v2]
use = call:cinder.api.middleware.auth:pipeline_factory
noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2 [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

(2)[filter:name]

filter section定义了一个过滤器,过滤器接收一个application参数作为对象,并返回一个封装后的application;

(3)[filter-app:name]

filter-app section定义的也是过滤器,这个过滤器直接作用在application上面。filter-app section表明对某个application进行修饰,需要修饰的application通过参数next指明,例如:

[filter-app:myblog]

use = egg:Authentication

next = myblogapp

这个字段表明在正式调用myblogapp之前,会调用egg:Authentication进行用户验证,随后才会调用myblogapp进行处理,这也就实现了对myblogapp的修饰。

(4)[pipeline:name]

当使用多个filter的时候需要使用pipeline的方式,它需要提供一个key参数pipeline,后面的值是一个列表,最后以应用结尾。如下:

[pipeline:apiversions]
pipeline = cors http_proxy_to_wsgi faultwrap osvolumeversionapp

(5)[app:name]

app section直接或间接地定义了一个符合WSGI协议的应用application,有以下几种使用方法:

  • 指向某个配置文件中的application
[app:app_1]
use = config:another_config_file.ini
  • 指向某个URL

    [app:app_2]

    use = egg:App_2
  • 指向从指定模块可调用的application

    [app:app_3]

    use = call:my.project:APP_3
  • 指向其他已经定义或即将定义的section

    [app:app_4]

    use = app_4
  • 直接指向具体的python代码(cinder中,应用的就是这种定义的section方式)

    [app:app_5]

    paste.app_factory = myapp.moudulename:app_factor

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

  1. OpenStack Paste.ini详解(二)

    接着OpenStack Paste.ini详解(一),接下来就分析request被paste.ini处理的流程 WSGI server接收到URL形式的request时,这些request首先会被Pa ...

  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. MySQL Cluster 配置文件(config.ini)详解

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

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

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

  6. Openstack Paste.ini 文件详解

    目录 目录 pasteini 配置文件详解 composite pipeline filter app DEFAULT server Request 被 pasteini 处理的流程 如何加载 pas ...

  7. OpenStack 部署步骤详解(mitaka/ocata/一键部署)

    正文 OpenStack作为一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,开放源代码项目的云计算管理平台项目.具体知识我会在后面文章中做出介绍,本章主要按步骤给大家演示在C ...

  8. Openstack keystone组件详解

    OpenStack Keystone Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证.服务规则和服务令牌功能的模块.用户访问资源 ...

  9. mysql my.ini 详解

    linux下mysql配置文件my.cnf详解[转]   basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录 ...

随机推荐

  1. JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务

    1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...

  2. c中有序表的简单定义

    #include <iostream> using namespace std; #define MaxSize 50 typedef int ElemType; //定义变量int的别名 ...

  3. java常用类————Date类

    Date类在Java.util包中. 一.功能介绍:创建Date对象,获取时间,格式化输出的时间. 二.对象创建:1.使用Date类无参数的构造方法创建的对象可以获取本地时间.例如: Date now ...

  4. Linux 格式化和挂载数据盘

    如果您已经为 ECS 实例配了数据盘,您需要先格式化数据盘并挂载文件系统后才能正常使用数据盘. 注意: 磁盘分区和格式化是高风险行为,请慎重操作.本文档描述如何处理一个新买的数据盘,如果您的数据盘上有 ...

  5. Yaf框架的配置

    http://www.laruence.com/manual/yaf.ini.html //先看一下惠新宸鸟哥yaf官网的配置说明 我们可以在php.ini中定义开发环节配置项,把本地开发设置成dev ...

  6. 软AP的实现------hostapd的编译运行

    最近要给摄像头做一个软ap,让手机能够连上这个热点,从而能够与摄像头进行通信. 1.什么是hostapd : hostapd能够使得无线网卡切换为master模式,模拟AP(通常可以认为是路由器)功能 ...

  7. yaf框架学习文件配置

    文件配置: 在配置php支持yaf的时候,可以设置一个参数yaf.environ:把本地开发设置成develop.测试环境配置成test.生产环境配置成product. [yaf] extension ...

  8. jquery 上传图片转为base64,ajax提交到后台

    支持多张图片上传.图片上传数量修改.可以删除 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  9. 使用sql语句获取数据库表的信息

    下面的sql语句可以查看表的信息.其中modify_date和create_date可以根据表的修改时间来查看.如果不需要删除后,就能看到所有表的字段信息 ) PERCENT d.name AS 表名 ...

  10. R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 在之前的开篇提到了text2vec ...