问题导读
1、什么是 Paste Deployment?
2、如何写一个application?
3、 nova-api.ini主要定义了哪些?
Paste Deployment用于发现和配置WSGI Application和Server,有了Paste Deployment,WSGI applications只需向其用户提供一个单独的入口loadapp函数,然后用户调用这个函数就可以使用已经开发好的WSGI application,同时,由于只提供了一个入口,WSGI的开发者也不再需要将App的具体实现暴露给用户,大大简化了整个开发过程。
这里涉及到了两个概念: server和application,server可能大家比较熟悉,即常用的apache,nignx等等,applications广义理解就是一 个符合wsgi规范的一个可调用的object,规范指的是:一个接受两个参数的函数(environ,start_response)
目的:使得web application像library,well encapsulated and reusable, but still with rich reusable functionality
paste deploy 概念
1. settions
paste deploy主要的任务就是搭建连接server与applications的桥梁,所以section就是为了application进行服务的,主要用来分类和描述不同用途的application.
(1)[app:name]
定义一个符合wsgi协议的应用,有几种使用方法:
#指向另外一个配置文件中的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 复制代码
(2)[composite:name]
composite section也定义了一个application,与application section的区别是composite section是wsgi application的集合,可以包括其他application section中定义的application,最常用的用法是:
// 定义一个mapper URL的composite app,调用urlmap_factory方法,其参数是不同的URL,当加载了此app后,根据不同的URL,重定向到不同的wsgi application
[composite:osapi_compute]
use = call:nova.api.openstack.urlmap:urlmap_factory
/: oscomputeversions
/v1.1: openstack_compute_api_v2
/v2: openstack_compute_api_v2
/v3: openstack_compute_api_v3
[composite:openstack_compute_api_v2]
use = call:nova.api.auth:pipeline_factory
noauth = faultwrap sizelimit noauth ratelimit osapi_compute_app_v2
keystone = faultwrap sizelimit authtoken keystonecontext ratelimit osapi_compute_app_v2
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
[composite:openstack_compute_api_v3]
use = call:nova.api.auth:pipeline_factory_v3
noauth = faultwrap sizelimit noauth_v3 osapi_compute_app_v3
keystone = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v3 复制代码
(3)[filter:name]
定义过滤器,类似python中的decorator(装饰器),接受一个application参数作为对象,返回一个封装后的 application,这里只是定义了filter,并没有将filter作用到application上。 将filter作用到app的方法有两种: filter-app section和 pipe section
(4)[filter-app:name]
与filter类似,唯一的区别是filter-app可以使用next参数来指定filter要作用的application.
[filter-app:blog] use = egg:Authentication#auth next = blogapp roles = admin htpasswd = /home/me/users.htpasswd [app:blogapp] use = egg:BlogApp database = sqlite:/home/me/blog.db 复制代码
(5)[pipeline:name]
将一系列的filter作用到app上,下面例子即将faultwrap filter作用到oscomputeversionapp application上,当然可以将多个filter作用到一个app上,作用顺序为靠近app的filter先执行。
[pipeline:oscomputeversions]
pipeline = faultwrap oscomputeversionapp
[filter:faultwrap]
paste.filter_factory = nova.api.openstack:FaultWrapper.factory
//filter的嵌套,执行顺序为:ratelimit --> keystonecontext --> authtoken --> sizelimit --> faultwrap (完全类似与decorator)
[composite:openstack_compute_api_v2]
use = call:nova.api.auth:pipeline_factory
noauth = faultwrap sizelimit noauth ratelimit osapi_compute_app_v2
keystone = faultwrap sizelimit authtoken keystonecontext ratelimit osapi_compute_app_v2
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2 复制代码
(6)[server:name]
2. protocol
到现在为止,大体了解了6种section,其实每种section都是一个application,只是每种application的功能不同而已,另外,在section中指定了每种section的入口,前面给出的例子中大多通过use来给出的,比如:
[composite:osapi_compute]
use = call:nova.api.openstack.urlmap:urlmap_factory
/: oscomputeversions
/v1.1: openstack_compute_api_v2
/v2: openstack_compute_api_v2
/v3: openstack_compute_api_v3
通 过use = call:nova.api.openstack.urlmap:urlmap_factory,指定了composite application osapi_compute的入口为nova.api.openstack.urlmap:urlmap_factory,即urlmap.py中的函数 urlmap_factory.
除了采用use的方式指定application,可以使用paste.xxx_factory的方式来指定application的入口,其中paste.xxx_factory称为protocol:
[app:oscomputeversionapp]
paste.app_factory = nova.api.openstack.compute.versions:Versions.factory
[filter:ratelimit]
paste.filter_factory = nova.api.openstack.compute.limits:RateLimitingMiddleware.factory 复制代码
当 前比较常用的potocol 有:paste_app_factory,paste.filter_factory,paste.compsite_factory,paste.filter_app_factory, paste.server_factory,用来分别上述的6种section指定入口。
3. 加载 wsgi application
上面详细介绍了wsgi application的种类以及对应的entry的定义,下面来分析下如何server端如何来加载这些applications.
paste.deploy.loadwsgi.loadapp(uri, name=None, **kw) //
paste.deploy.loadwsgi.loadserver(uri, name=None, **kw) paste.deploy.loadwsgi.loadfilter(uri, name=None, **kw) paste.deploy.loadwsgi.appconfig(uri, name=None, relative_to=None, global_conf=None) 复制代码
4. nova的paste deployment配置文件分析
前面提到,paste deployment就是完成从配置文件中加载WSGI App的功能,以nova-api为例,分析下都定义了哪些WSGI App以及每个App的含义。
nova-api.ini主要定义了三个WSGI App: metadata, ec2和osapi_compute。
复制代码