當你輸入 nova boot時,client做了什麼?

這裏寫圖片描述
當你輸入上圖命令後,會發生什麼?

導讀:本博文以nova boot爲例分析nova創建虛擬機時, nova client的工作流程。 在之後的博文中會分析 nova 創建虛擬機的後續流程。

基礎簡介:
nova boot –image 89b959c5-ac9f-4f7e-9094-0a17cd6d78cf –flavor 1 my_instance
該命令爲nova創建虛擬機,用到的虛擬機鏡像 ID 爲image,虛擬機配合用的是內置套餐1(最mini型),虛擬機名字叫做 my_instance。

正文:
就像所有的程序都有main函數一樣,我們nova的main函數定義在
/usr/bin/nova.py
代碼可謂簡潔明瞭

 import sys
 from novaclient.shell import main
 if __name__ == "__main__":
     sys.exit(main())                

看來真正的main函數被指向了 novaclient.shell.py中
那麼問題來了,novaclient在哪?不同的系統安裝環境不一樣,這裏介紹一種小技巧尋找代碼位置,如圖所示:
這裏寫圖片描述

UML 圖:

找到novaclient代碼位置後,我們就來查看它的目錄結構:
這裏寫圖片描述

目錄結構簡潔明瞭,novaclient使用兩種api,分別是V1_1和V3,我們這裏主要使用V1_1。


迴歸到代碼主線

  1. /usr/bin/nova.py main() —> /novaclient/shell.py main() #簡單調用,傳遞用戶輸入參數。
  2. shell.py main() —> shell.py OpenStackComputeShell類中main() #使用一個map()函數將用戶輸入的參數遞歸解析出來傳入。
  3. 類中main()中主要做三件事,(1)根據傳進來參數給各種變量賦值。(2)驗證身份合法性。(3)創建一個client的實例中創建client代碼如下。(4)創建一個HttpClient。這裏寫圖片描述

  4. client.Client定義在 /novaclient/client.py中,其根據version參數確定使用api的版本號,並返回一個指定版本的實例。這裏返回的是v1_1版本的實例。

  5. v1_1實例定義在/novaclient/v1_1/client.py中。在該類中調用nova命令的方法。這裏寫圖片描述
    我們創建虛擬機用的函數就在servers.ServerManager()中。
  6. /novaclient/v1_1/server.py 我們來看 ServerManager class。裏面封裝的函數有
    create,start,pause,lock等等若干對虛擬機的操作。我們追溯一下ServerManager的父類,可以看到這樣的繼承關係:ServerManager->base.BootingManagerWithFind->base.ManagerWithFind->base.Manager。ServerManager中create中調用的是base.Manager類中的 _create()函數。
  7. base路徑爲/novaclient/base.py 看一下Manager類中_create()函數,這裏面根據參數封裝了http請求,使用ipdb調試工具查看一下輸出如圖:
    這裏寫圖片描述
    8._create()中api.client.post()方法發送http請求,並返回結果。api.client.post()在/novaclient/openstack/common/apiclient/client.py 其中client_request()該函數發送http請求。
    9._create函數執行完,返回至/novaclient/v1_1/server.py中的_boot(),然後再回到create(),再返回至/novaclient/v1_1/shell.py中的do_boot()。這裏寫圖片描述
    通過_print_server()打印信息。
    這裏寫圖片描述

粗略分析了一下novaclient 命令流程,其他命令可參考該過程,大同小異。後續會分析nova創建虛擬機過程。
如有錯誤不足,歡迎指出^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章