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具體內容如下表
{
    "auth":{
             "passwordCredentials":
             {
                "username":"admin",    //登陸用戶名
                "password":"stack2015" //登陸用戶密碼
              },
     "tenantName":"admin"             //登陸用戶所屬項目
       }
}

下圖為詳細的填寫內容,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路徑

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

  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朦朧的面紗,能見其輪廓。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM