1. 程式人生 > >openstack_ice之wsgi詳解(paste從ini配置檔案->routesr具體釋出流程)

openstack_ice之wsgi詳解(paste從ini配置檔案->routesr具體釋出流程)

vim /etc/nova/api-paste.ini 

其中openstack_compute_api_v2的use = call:nova.api.auth:pipeline_factory表示通過訪問的url,來選擇具體使用哪個應用。

根據http://192.168.1.120:8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail,由匹配規則,接下來呼叫

/v2: openstack_compute_api_v2應用。

這個Application對應了三個引數:noauth,keystone和keystone_nolimit。我們可以看到這裡Application具體實現的方法是pipeline_factory。我們可以看到在引數noauth,keystone和keystone_nolimit中,分別集成了多個應用,實際上每個引數最終實現的Application分別是最後一個,即

osapi_compute_app_v2osapi_compute_app_v2osapi_compute_app_v2,其前面的Application都扮演這最後一個Application的過濾器。我們以引數keystone為例,實現引數keystone的Application為osapi_compute_app_v2,它前面的faultwrap sizelimit authtoken keystonecontext等應用都是它的過濾器,其實現過程也就是faultwrap(sizelimit(authtoken(keystonecontext(osapi_compute_app_v2)))),具體的呼叫過程就是
osapi_compute_app_v2->keystonecontext->authtoken->sizelimit->faultwrap,前面方法的執行結果作為後面方法的輸入引數,最後得到的執行結果作為引數keystone的值。可以說明,三個引數noauth,keystone和keystone_nolimit的值都是這樣得到的。

詳解:

後面三句分別對應配置檔案中不同配置執行不通的過濾流程,最終三個都將返回osapi_compute_app_v2應用。

use = call:nova.api.auth:pipeline_factory程式碼:

pipeline_factory函式的目的就是讀取解析配置檔案(/etc/nova/nova.conf)中定義的認證策略:noauth、keystone、keystone_nolimit。

假若在配置檔案nova.conf中,配置的是auth_strategy=keystone,接下來匹配:

keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
faultwrap sizelimit過濾器不做進一步詳解,有興趣者請自行跟進程式碼檢視。
5、分析authtoken 過濾器:
找到對應的程式碼:
由上述程式碼可知,授權對應過濾器authtoken,具體操作在AuthProtocol類的__call__函式。授權的具體細節請自行分析以上函式,再次不做過多講解。
注:有paste的知識可知,每一個factory,都會有一個__call__函式。呼叫該factory就會呼叫此函式。