以前一直想寫博客,但因各種因素一直沒寫。最近在做OpenStack,而OpenStack對外提供REST API,今天就簡要介紹一下OpenStack REST API 使用,關於什么是REST API可以參考以下兩篇博文:
http://www.choudan.net/2013/07/28/OpenStack-Restful-API.html
http://www.ruanyifeng.com/blog/2011/09/restful.html
簡單的來說,一切都是資源,每個資源對應一個URI。
我們可以使用linux curl命令使用REST API向OpenStack發送請求,例如根據用戶名、密碼和tenant得到token:
curl -i 'http://127.0.0.1:5000/v2.0/tokens' -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "secretsecret"}}}'
但是我覺得用curl命令不太方便,而且有時候返回結果很長很長的時候不太好看,所以就使用了RESTClient,因為是在CentOS環境下工作,於是在火狐下裝了個RESTClient插件,像上面的請求可以輕松搞定,加入兩個Header,如果要訪問其他資源,則還另外需要一個Header:x-auth-token,選擇一個Method,然后在Body里面寫下需要的東西,截圖如下:
Body:
{ "auth":{ "passwordCredentials":{ "username":"admin", "password":"123456" }, "tenantName":"admin" } }
OpenStack的API大多都在官方文檔中寫了,為什么說大多,而不是全部,是因為有些真沒寫,我覺得其中沒寫的分兩類:
- 沒有及時更新。
- 覺得沒必要寫,認為大家可以猜到,或者可以從源碼中找到蛛絲馬跡。畢竟搞OpenStack還是得要兩把刷子。
舉幾個目前API文檔中沒寫或者沒有詳細說明用法的API,比如:
- OpenStack中的admin用戶如何獲得所有tenant(project)下的虛機信息。具體的做法是加上query參數all_tenants,即:/v2/{tenant_id}/servers/detail?all_tenants=true
- 延伸第一條,admin如何獲取某個tenant下的虛機。/v2/{tenant_id}/servers/detail?all_tenants=true&project_id=XXX
還有好多可以加query參數的API,就不一一列舉了。
還有一個問題,在API文檔中只有URL的后半部分,那么前半部分去哪了,前半部分就在當初安裝OpenStack時創建的endpoint中,我們可以使用以下命令找到:
keystone endpoint-list keystone endpoint-get --service=XXX
在實際的編碼中我們當然不能在代碼里把URL寫死,應該通過查數據表得到各個服務的endpoint,然后生成完整的URL。細心的同學就會發現,在每次認證的時候不僅會返回token而且會返回serviceCatalog,里面就有我們想要的endpoint,就不必再單獨再去查一次數據庫了。
有個問題沒太弄懂,不知是否有人解答一下:
keystone兩個端口,一個是5000,一個是35357(adminURL)。兩個權限不一樣,創建用戶什么的必須用35357。我知道OpenStack采用Policy來管理某個用戶在某個tenant下的權限。但后台具體是如何區分5000和35357的呢,怎樣讓35357可以創建用戶而5000創建不了用戶。