openstack-wsgi的route中增長api流程詳解(os-networks)增長

感謝朋友支持本博客,歡迎共同探討交流,因爲能力和時間有限,錯誤之處在所不免,歡迎指正! python

若有轉載,請保留源做者博客信息。
json

Better Me的博客blog.csdn.net/tantexian

如需交流,歡迎你們博客留言。 vim

在前面文章中,已經詳細介紹了,如何從頁面dashboard調用novaclient而後生成一個url地址 , 或從啓動nova --debug list 而後調用novaclient而後生成URL地址

url地址形如: GET /v2/b077619bde964a4eb924db869fba977d/servers/detail

今天文章中要講解的是當咱們之後生成了這樣一個url了,下一步wsgi框架又是如何根據url去調用nova底層相應的代碼。

講解這個以前,先回憶下查看routes已發佈的api。更多詳情請查看文章: openstack_ice之wsgi詳解(paste從ini配置文件->routesr具體發佈流程)

一、首先將route mapper信息打印出來:
vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py

重啓openstack-nova-api服務 api

service  openstack-nova-api restart
tailf /var/log/nova/api.log
以上打印的route信息,就是底層經過wsgi,將api以添加到route的mapper,發佈給外邊調用。

二、接下來說解如何添加自定義api,並加入到route mapper中,發佈出來給外部調用.
注:接下來以網絡模塊爲例,增長一個test_api接口。
下圖爲未添加前,network的route信息:

經過以前的文章分析,找到wsgi的入口:
vim /usr/lib/python2.6/site-packages/nova/api/openstack/compute/contrib/os_networks.py

os_network爲openstack封裝的,用來增長映射route mapper路由的類:

中添加下圖代碼:test_member:post、test_collection:
每次添加完成須要從新發布須要重啓openstack-nova-api服務。
重啓後查看os-network路由信息以下圖:

如上圖發現test_member、test_collection路由信息發佈成功。
member_actions發佈的api是針對每一個特定的對象,例如獲取id爲1的person所有信息。所以須要在url前面增長id字段屬性。
collection_actions發佈的api是針對對象集合,例如獲取全部person的信息。

跟多關於route信息請參考文章wsgi-restful-routes詳解

三、講解:發佈api成功,後臺的route控制器接收到匹配的url以後,如何控制調用後臺代碼
url的產生大體有三種方式:
1:用dashboard經過novaclient組裝。(網絡的由neutronclient組裝,簡單起見,後續文章默認只說起novaclient)
2:經過系統命令例如nova list產生。
3:經過curl本身組裝。

第一和第二種方式,請參考以前對應文章詳解。接下來詳細介紹下若是經過curl調用已發佈的route,開發自定義api。
注:底層api開發,多采用第三種方式進行。

第一步獲取token:
執行nova --debug list:
其中X-Auth-Token後面的值爲須要獲取的token。
第二步:
將token值添加到環境變量中(也能夠不加入環境變量,每次請求時帶上)
vim  vim .bashrc

這樣之後就能夠直接使用$token獲取token的值。
export .bashrc文件
echo $token將看到token值

第三步:發送url請求:
curl -i 'http://192.168.1.158:8774/v2/b077619bde964a4eb924db869fba977d/servers/f664204b-d4ec-4d01-aec9-757719a8d06b' -X GET -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Accept: application/json" -H "X-Auth-Token:$token"

對應的route爲:

當執行上述url請求時候:則對應找到上述路由。

四、請求自定義的路由test_collection:
根據路由信息,拼接url爲:

curl -i 'http://192.168.1.158:8774/v2/b077619bde964a4eb924db869fba977d/os-networks/test_collection' -X POST -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Accept: application/json" -H "X-Auth-Token:$token"
錯誤爲404沒有找到:

打開route發佈源碼:
vim /usr/lib/python2.6/site-packages/nova/api/openstack/compute/contrib/os_networks.py

進入到路由控制器:NetworkController():
能夠看到路由控制器類有方法show(),delete()等。
在控制器類定義test_collection方法,以下圖:
重啓nova-api服務添加的代碼生效。(每次修改api模塊代碼則必須重啓服務,後面將再也不重複)

再次請求url:
curl -i 'http://192.168.1.158:8774/v2/b077619bde964a4eb924db869fba977d/os-networks/test_collection' -X POST -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Accept: application/json" -H "X-Auth-Token:$token"
api日誌:

在test_collection函數中,添加自定義的底層代碼便可。
到此添加底層api完成。
相關文章
相關標籤/搜索