感謝朋友支持本博客,歡迎共同探討交流,因爲能力和時間有限,錯誤之處在所不免,歡迎指正! python
若有轉載,請保留源做者博客信息。
json
Better Me的博客:blog.csdn.net/tantexian
在前面文章中,已經詳細介紹了,如何從頁面dashboard調用novaclient而後生成一個url地址 ,
或從啓動nova --debug list 而後調用novaclient而後生成URL地址
url地址形如: GET /v2/b077619bde964a4eb924db869fba977d/servers/detail
今天文章中要講解的是當咱們之後生成了這樣一個url了,下一步wsgi框架又是如何根據url去調用nova底層相應的代碼。
一、首先將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的信息。
三、講解:發佈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完成。