1. 程式人生 > >openstack-wsgi的route中增加api流程詳解(os-networks)增加

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

感謝朋友支援本部落格,歡迎共同探討交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正!

如有轉載,請保留源作者部落格資訊。

如需交流,歡迎大家部落格留言。

在前面文章中,已經詳細介紹了,如何從頁面dashboard呼叫novaclient然後生成一個url地址 ,或從啟動nova --debug list 然後呼叫novaclient然後生成URL地址 url地址形如: GET /v2/b077619bde964a4eb924db869fba977d/servers/detail 今天文章中要講解的是當我們以後生成了這樣一個url了,下一步wsgi框架又是如何根據url去呼叫nova底層相應的程式碼。
1、首先將route mapper資訊打印出來:
vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py

重啟openstack-nova-api服務

service  openstack-nova-api restart tailf /var/log/nova/api.log
以上列印的route資訊,就是底層通過wsgi,將api以新增到route的mapper,釋出給外邊呼叫。 2、接下來講解如何新增自定義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的資訊。 3、講解:釋出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請求時候:則對應找到上述路由。 4、請求自定義的路由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完成。