1. 程式人生 > >openstack呼叫restful api

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。

  1. 開啟chrome。
  2. 點選更多工具-->擴充套件程式-->載入已解壓的擴充套件程式-->選擇下載的安裝包檔案,稍等即可安裝成功。
  3. 安裝成功之後在擴充套件程式中有已經安裝好的postman,直接執行。

執行postman如下圖所示:

簡單使用

獲取token

token是環境可操作的前提,openstack登陸時填寫的使用者名稱+密碼,登陸之後的操作都是使用token。獲取token需要填寫的內容如下:

  1. 請求方式為POST
  2. 請求的URL為 http://controller-ip:5000/v2.0/tokens。
  3. 請求的body格式為raw,JSON格式。
  4. 請求的body具體內容如下表

按 Ctrl+C 複製程式碼

{ "auth":{ "passwordCredentials": { "username":"admin", //ç»éç¨æ·å "password":"stack2015" //ç»éç¨æ·å¯ç  }, "tenantName":"admin" //ç»éç¨æ·æå±é¡¹ç® } }

按 Ctrl+C 複製程式碼

下圖為詳細的填寫內容,1-6分別是:

  1. 請求方式為POST
  2. 請求URL地址
  3. 傳入內容body
  4. body的內容的型別為raw
  5. body的內容的格式為JSON
  6. 具體的body內容

body內容為使用者資訊,如果是使用admin使用者登入,使用者名稱為admin,密碼為*******,租戶名為 admin。

 返回資訊如下,具體的內容包括

  1. 獲得的token值
  2. 搭建的環境中各服務的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中從上到下的作用分別是:

  1. admin管理使用者的URL
  2. 域名
  3. 內部服務
  4. nova服務的id
  5. 公共服務

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個點,分別是:

  1. 請求型別。
  2. 請求的URL地址,上面已經分析過完整的地址。
  3. 設定訪問的header,這裡是設定token的key。第一步已經獲取了token的值,剩餘的訪問都是使用token處理。
  4. 設定token的值。

 

返回資訊為環境中所有虛擬機器的簡要資訊。我的環境中只有一個虛擬機器,是上一篇文章中建立的虛擬機器myinstance。注意name和id兩個引數。一般在openstack中要麼使用name操作虛擬機器,要麼使用id操作虛擬機器,兩者可以互換。記下該id,後面需要使用。

如果想要檢視虛擬機器更詳細的資訊,可以使用/server/detail路徑的api。如下是myinstance的詳細資訊,可以分析出使用的網路名為mynetwork。更多資訊可以親自動手檢視一次。

上面介紹的是GET操作,GET操作一般都是檢視內容,不涉及到傳值。restful api的另一大操作是需要POST操作,當需要傳入一些引數去改變操作物件時,使用為POST的型別。以暫停虛擬機器為例,操作是型別+路徑+body。

  1. 型別為POST。
  2. 路徑為/servers/server-id/action。server_id為上一步查詢到的id資訊。
  3. body是填入的暫停的動作,具體見官方手冊。

暫停主機:

暫停虛擬機器填寫的引數分別是:

  1. 請求型別為post請求
  2. URL為/servers/server-id/action
  3. 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。記下備用。

四、建立虛擬機器

獲取引數

到目前為止,我們已經集齊了三顆龍珠,不是三個引數,接下來就可以建立虛擬機器了。映象、規格、網路分別如下:

  1. 映象 c980b3ee-99e7-4372-9ce4-354e7e7647fe
  2. 規格 e941b823-cdb0-45c5-9f0d-148770588970
  3. 網路 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朦朧的面紗,能見其輪廓。