openstack呼叫restful api
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具體內容如下表
按 Ctrl+C 複製程式碼
{ "auth":{ "passwordCredentials": { "username":"admin", //ç»éç¨æ·å "password":"stack2015" //ç»éç¨æ·å¯ç }, "tenantName":"admin" //ç»éç¨æ·æå±é¡¹ç® } }
按 Ctrl+C 複製程式碼
下圖為詳細的填寫內容,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路徑
- 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朦朧的面紗,能見其輪廓。