neutronapi_v2_0 section代码解读

48 篇文章 11 订阅
neutronapi_v2_0定义如下:
#neutronapi_v2_0 section定义
[composite:neutronapi_v2_0]
use = call:neutron.auth:pipeline_factory
#noauth表示没有鉴权
noauth = cors http_proxy_to_wsgi request_id catch_errors extensions neutronapiapp_v2_0
#keystone表示采用keystone模块鉴权
keystone = cors http_proxy_to_wsgi request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0
这是一个app factory通告法,neutron.auth:pipeline_factory是一个app factory,” noauth = cors http_proxy_to_wsgi request_id catch_errors extensions neutronapiapp_v2_0 “和”keystone = cors http_proxy_to_wsgi request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0 “两个字符串都会作为参数传递给这个factory。下面看看pipeline_factory这个函数的代码:
def pipeline_factory(loader, global_conf, **local_conf):
    """Create a paste pipeline based on the 'auth_strategy' config option."""
    pipeline = local_conf[cfg.CONF.auth_strategy]
    pipeline = pipeline.split()
    filters = [loader.get_filter(n) for n in pipeline[:-1]]
    app = loader.get_app(pipeline[-1])
    filters.reverse()
    for filter in filters:
        app = filter(app)
return app
逐行解读这个函数
1 参数local_conf
参数local_conf中的值,就是neutronapi_v2_0中定义的两个字符串” noauth = cors http_proxy_to_wsgi request_id catch_errors extensions neutronapiapp_v2_0 “和”keystone = cors http_proxy_to_wsgi request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0 “。local_conf的数据结构是一个字典,所以它的值如下(伪码):
local_conf
{
        noauth:cors http_proxy_to_wsgi request_id catch_errors extensions neutronapiapp_v2_0
        keystone:cors http_proxy_to_wsgi request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0
}
2 pipeline = local_conf[cfg.CONF.auth_strategy]
local_conf实际上是两个字符串,local_conf[cfg.CONF.auth_strategy]就是根据cfg.CONF.auth_strategy选择其中之一。cfg.CONF.auth_strategy相对于一个key,它的值在配置文件”etc/neutron.conf“中定义:
#[ etc/neutron.conf]
#鉴权策略
auth_strategy=keystone
pipeline = local_conf[cfg.CONF.auth_strategy]代码执行结果是:
pipeline=” cors http_proxy_to_wsgi request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0 “
3 pipeline = pipeline.split()
执行结果如下:
pipeline={“cors”, …”keystonecontext”, “extensions”, “neutronapiapp_v2_0 “}
4 filters = [loader.get_filter(n) for n in pipeline[:-1]]
调用loader对象,获取一系列的filter。filter是一个比较特殊的WSGI Application。当filter的条件不满足时,就直接response(to web client)。如果filter的条件满足,它就return下一个app。
由于pipeline实际存储的是一系列section name,所以,loader.get_filter(n) for n in pipeline[:-1]实际上就是将pipeline里存储的所有filter type的section所对应的具备filter特征的WSGI Application给加载上来。
执行完这句代码以后,filter的值为:
filter={app_cors, …app_keystonecontext, app_ext}
5 app = loader.get_app(pipeline[-1])
这句代码的基本原理和上一句基本相同,只不过是加载最后一个app(pipeline[-1]),执行完以后,app的值(伪码)为:
app = app_v2.0
6 filters.reverse()
这句代码是将filters倒叙排序一下,执行完后,filters的值如下:
filter={ app_ext, app_keystonecontext, … app_cors }
7 最后三行
这三句代码实际上就是将app_v2.0外面一层一层加上filter,首先加上的是app_ext,然后加app_keystonecontext,最后加app_cors。这也是上一句代码filters.reverse()的原因,因为首先要加最里层的filter。
app = filter(app),filter是一个WSGI Application,filter(app)中的app,表示这个app是filter构造函数的一个参数。经过filter层层封装以后,neutronapiapp_v2_0所代表的WSGI Application如下图:
Neutron将它的Service分为两大类:Core Service和Extension Service。Core Service包括networks、subnets、ports、subnetpools等资源的RESTful API,Extension Service包括routes、segments、trunks等等其他各种资源的RESTful API。
针对这两类资源的Services API的处理,Neutron的代码是不同的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值