Restful api 是openstack各服務調用的接口,簡單理解為可以通過網絡去調用的函數。postman是一款前端調用工具,測試后端接口的時候往往是使用該工具去驗證。在openstack的使用中,可以使用postman調用openstack restful接口。這里要區別命令行和restful接口,命令行的使用是調用restful來實現的。所以,不管是命令行還是horizon都是調用了openstack中restful api去實現相應的功能。本節希望通過postman調用接口的方式進一步去剖析openstack。
安裝postman
一、下載postman離線安裝包。鏈接: https://pan.baidu.com/s/1kUVxKI7 密碼: ttmw
二、chrome安裝postman。
- 打開chrome。
- 點擊更多工具-->擴展程序-->加載已解壓的擴展程序-->選擇下載的安裝包文件,稍等即可安裝成功。
- 安裝成功之后在擴展程序中有已經安裝好的postman,直接運行。
運行postman如下圖所示:
簡單使用
獲取token
token是環境可操作的前提,openstack登陸時填寫的用戶名+密碼,登陸之后的操作都是使用token。獲取token需要填寫的內容如下:
- 請求方式為POST
- 請求的URL為 http://controller-ip:5000/v2.0/tokens。
- 請求的body格式為raw,JSON格式。
- 請求的body具體內容如下表
{ "auth":{ "passwordCredentials": { "username":"admin", //登陸用戶名 "password":"stack2015" //登陸用戶密碼 }, "tenantName":"admin" //登陸用戶所屬項目 } }
下圖為詳細的填寫內容,1-6分別是:
- 請求方式為POST
- 請求URL地址
- 傳入內容body
- body的內容的類型為raw
- body的內容的格式為JSON
- 具體的body內容
body內容為用戶信息,如果是使用admin用戶登錄,用戶名為admin,密碼為*******,租戶名為 admin。
返回信息如下,具體的內容包括
- 獲得的token值
- 搭建的環境中各服務的restful 端點
注意這個返回狀態信息,200 OK表示請求正確。狀態是判斷請求是否成功的重要依據。該請求返回類型是http標准請求碼,常見的請求碼如下:
- 200 - OK 一切正常,對GET和POST請求的應答文檔跟在后面。
- 201 - Created 服務器已經創建了文檔,Location頭給出了它的URL。
- 202 - Accepted 已經接受請求,但處理尚未完成。
- 400 - Bad Request 請求出現語法錯誤。
- 401 - Unauthorized 訪問被拒絕,客戶試圖未經授權訪問受密碼保護的頁面。
- 404 - Not Found 無法找到指定位置的資源。這也是一個常用的應答。
如下是完整的返回信息,在獲取token的同時,返回的信息可以看到返回的還有所有服務的請求地址即Catalog。其中標藍的部分要重點注意,是openstack核心服務的訪問端點。
{ "access": { "token": { "issued_at": "2017-12-26T09:29:34.000000Z", "expires": "2017-12-26T10:29:33.000000Z", "id": "gAAAAABaQhZ-a-i7B_f8Vtrlh0NcEyDe9h0RcDLjqXYduJAA-GbA599iLthfbj4_rJMoHx3XNIiIZs18BDWKTu8X1pcaccWbd2BapglewqWreTjnT--fuVrQpN8bzEmAk_pZpC6MFEY93VzsuZGRGAym7hNGRKgfsgyhChJXalPVIDMLLwYCu2s", "tenant": { "description": "Bootstrap project for initializing the cloud.", "enabled": true, "id": "ffd1a0df301045f1b20eef7d9e126dbf", "name": "admin" }, "audit_ids": [ "b7Q0lp05SI2xcoBYBHAQwQ" ] }, "serviceCatalog": [ { "endpoints": [ { "adminURL": "http://controller:8774/v2.1", "region": "RegionOne", "internalURL": "http://controller:8774/v2.1", "id": "adc922e83ef447e7abca68e96119e60a", "publicURL": "http://controller:8774/v2.1" } ], "endpoints_links": [], "type": "compute", "name": "nova" }, { "endpoints": [ { "adminURL": "http://controller:9696", "region": "RegionOne", "internalURL": "http://controller:9696", "id": "3fa6e602366b424fb51002436b7485c8", "publicURL": "http://controller:9696" } ], "endpoints_links": [], "type": "network", "name": "neutron" }, { "endpoints": [ { "adminURL": "http://controller:8776/v2/ffd1a0df301045f1b20eef7d9e126dbf", "region": "RegionOne", "internalURL": "http://controller:8776/v2/ffd1a0df301045f1b20eef7d9e126dbf", "id": "402b52c472f241fe84e994ec5fb90789", "publicURL": "http://controller:8776/v2/ffd1a0df301045f1b20eef7d9e126dbf" } ], "endpoints_links": [], "type": "volumev2", "name": "cinderv2" }, { "endpoints": [ { "adminURL": "http://controller:9292", "region": "RegionOne", "internalURL": "http://controller:9292", "id": "39c50e9ed55d4d1486a037a85db863ba", "publicURL": "http://controller:9292" } ], "endpoints_links": [], "type": "image", "name": "glance" }, { "endpoints": [ { "adminURL": "http://controller:8776/v1/ffd1a0df301045f1b20eef7d9e126dbf", "region": "RegionOne", "internalURL": "http://controller:8776/v1/ffd1a0df301045f1b20eef7d9e126dbf", "id": "0c827a2a02e84ed5aa8dc113c1329b33", "publicURL": "http://controller:8776/v1/ffd1a0df301045f1b20eef7d9e126dbf" } ], "endpoints_links": [], "type": "volume", "name": "cinder" }, { "endpoints": [ { "adminURL": "http://controller:8080/v1", "region": "RegionOne", "internalURL": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf", "id": "0ee0b857383a44d98970cce3fd0cdfd2", "publicURL": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf" } ], "endpoints_links": [], "type": "object-store", "name": "swift" }, { "endpoints": [ { "adminURL": "http://controller:8778", "region": "RegionOne", "internalURL": "http://controller:8778", "id": "43881ded3c564795908280a7408ec8a6", "publicURL": "http://controller:8778" } ], "endpoints_links": [], "type": "placement", "name": "placement" }, { "endpoints": [ { "adminURL": "http://controller:35357/v3/", "region": "RegionOne", "internalURL": "http://controller:5000/v3/", "id": "0042fccfe6d6476385e2d48692cfebff", "publicURL": "http://controller:5000/v3/" } ], "endpoints_links": [], "type": "identity", "name": "keystone" } ], "user": { "username": "admin", "roles_links": [], "id": "99c64dce212547a08f68a48f5b86044e", "roles": [ { "name": "admin" } ], "name": "admin" }, "metadata": { "is_admin": 0, "roles": [ "39a6815cad0e4e7c879de0092076ff3f" ] } } }
以nova服務為例,具體分析其中的內容。包括:
其中endpoints的內容是nova服務在keystone服務中注冊的restful路徑。在endpoint中從上到下的作用分別是:
- admin管理用戶的URL
- 域名
- 內部服務
- nova服務的id
- 公共服務
nova服務操作
准備工作:
- restful api路徑
在openstack社區中有openstack restful api的使用文檔。https://developer.openstack.org/api-guide/quick-start/
- token值
token值是在上面使用用戶名和密碼獲取。
完成以上准備工作我們來開始使用。首先查看官方文檔中nova服務的api的描述。從api使用手冊中進入Compute API。
如下圖看到的都是nova的操作,每個操作都是對應一個類型+路徑。類型有GET查看類的操作,有POST設置類的操作。路徑為/servers。以查看環境中的虛擬機為例,操作類型為GET,路徑為/servers。這里的路徑沒有包括前面的端點,因為每個服務的端點端口號不同,版本信息不同。結合獲取token時返回的端點信息為一個完整的路徑。nova的端點信息為 http://controller:8774/v2.1,所以請求的完整路徑為http://controller:8774/v2.1/servers。使用時將controller換成控制節點的ip地址即可。
查詢主機:
填寫postman,填寫的內容有4個點,分別是:
- 請求類型。
- 請求的URL地址,上面已經分析過完整的地址。
- 設置訪問的header,這里是設置token的key。第一步已經獲取了token的值,剩余的訪問都是使用token處理。
- 設置token的值。
返回信息為環境中所有虛擬機的簡要信息。我的環境中只有一個虛擬機,是上一篇文章中創建的虛擬機myinstance。注意name和id兩個參數。一般在openstack中要么使用name操作虛擬機,要么使用id操作虛擬機,兩者可以互換。記下該id,后面需要使用。
如果想要查看虛擬機更詳細的信息,可以使用/server/detail路徑的api。如下是myinstance的詳細信息,可以分析出使用的網絡名為mynetwork。更多信息可以親自動手查看一次。
上面介紹的是GET操作,GET操作一般都是查看內容,不涉及到傳值。restful api的另一大操作是需要POST操作,當需要傳入一些參數去改變操作對象時,使用為POST的類型。以暫停虛擬機為例,操作是類型+路徑+body。
- 類型為POST。
- 路徑為/servers/server-id/action。server_id為上一步查詢到的id信息。
- body是填入的暫停的動作,具體見官方手冊。
暫停主機:
暫停虛擬機填寫的參數分別是:
- 請求類型為post請求
- URL為/servers/server-id/action
- body填入動作:暫停。
再次查詢該虛擬機的詳細信息是,能夠查詢到vm_state是paused狀態。
通過上面postman調用restful api接口的操作,已經介紹了postman的基本使用技巧和restful api的使用方式。下面通過完成創建一個虛擬機的一個小目標來進一步學習restful api的使用技巧。
創建虛擬機
前言:如下圖是官方文檔中給出的創建虛擬機的body內容。有四個參數:
- name
- imageRef
- flavorRef
- network
name是我們自己定義的,剩余三個參數要自己查找。想要創建一個虛擬機,首先要查詢到imageref、flavorref、networks,並選擇合適的內容。然后組裝查詢到的內容,創建虛擬機。
准備工作:
一、查詢鏡像url。
從官網上找到鏡像api介紹
填寫URL時和nova操作一樣,要知道image服務端點,從獲取token時返回的的服務類型中查找,可以得知image的端點是:http://controller:9292。注意不要忘記了token。
經過查詢可知鏡像的id為c980b3ee-99e7-4372-9ce4-354e7e7647fe。記下備用。
二、查詢flavor
使用nova的端點信息,加上/flavors路徑。完整路徑為:http://controller_ip:8774/v2.1/flavors。
從返回信息中記下名為myflavor,flavor id為 e941b823-cdb0-45c5-9f0d-148770588970。記下備用。
三、查詢network
查詢官網網絡api,可知,路徑為/v2.0/networks,完整的URL為:http://controller:9696/v2.0/networks。
從查詢結果中選擇名為mynetwork的網絡, network id 為4bc273a0-e9a5-4a26-b713-509704d19368。記下備用。
四、創建虛擬機
獲取參數
到目前為止,我們已經集齊了三顆龍珠,不是三個參數,接下來就可以創建虛擬機了。鏡像、規格、網絡分別如下:
- 鏡像 c980b3ee-99e7-4372-9ce4-354e7e7647fe
- 規格 e941b823-cdb0-45c5-9f0d-148770588970
- 網絡 4bc273a0-e9a5-4a26-b713-509704d193
組裝參數
根據手冊組裝我們自己的body信息,其中注意network的格式。
{ "server": { "name": "my_second_instance", "imageRef": "c980b3ee-99e7-4372-9ce4-354e7e7647fe", "flavorRef": "e941b823-cdb0-45c5-9f0d-148770588970", "networks": [{"uuid": "4bc273a0-e9a5-4a26-b713-509704d19368"}] } }
填寫參數
根據官網給出的參數,類型+URL+body。類型為POST,URL為http://controller_ip:8774/v2.1/servers,body為上面填寫好的內容。
返回信息如下:
再次查看環境中虛擬機,可以看到剛剛創建的名為my_second_instance的主機。
簡單總結:
restful api能夠完成所有對openstack的操作,並且使用restful api已經比較深入的接觸了openstack,至少知道了各種服務接口、服務之間的調用、組件之間的運作機制等。這對理解openstack框架有着深刻的意義。走到已經揭開了openstack朦朧的面紗,能見其輪廓。