1. 程式人生 > >nova創建虛擬機源碼分析系列之七 傳入參數轉換成內部id

nova創建虛擬機源碼分析系列之七 傳入參數轉換成內部id

接口 函數 device 博文 nat build 消息 通過 rop

上一篇博文將nova創建虛機的流程推進到了/compute/api.py中的create()函數,接下來就繼續分析。

在分析之前簡單介紹nova組件源碼的架構。以conductor組件為例:

技術分享

每個組件都會有這三個文件:api.py rpcapi.py manager.py。

  1. api.py conductor實現自身功能的文件
  2. rpcapi.py conductor提供給其他組件通過消息隊列調用的接口函數
  3. manager.py 其他組件通過消息隊列調用的處理端函數

下面是/compute/api.py中的create()函數。

技術分享

技術分享

/nova/compute/api::create()

  1. 檢查是否創建多個實例,是否制定IP。檢查是否從端口ID創建多個實例
  2. 檢查域是否可用
  3. 創建過濾器
  4. 調用本類中create_instance()方法


總結:該函數的主要任務是對check policies、check quota、創建db記錄,創建下一步中schedule所需要的調度規則信息filter_properties,將部分參數整合,

然後將創建請求發送到本類中的_create_instance()函數中,進行下一步處理。

/compute/api.py ::_create_instance()函數:

技術分享

技術分享

技術分享

/nova/compute/api::create_instance()

  1. 規格化和設置一些參數,如安全組,最小數值,最大數值,塊設備。
  2. 訪問glance服務,獲取image-id
  3. 檢查網絡是否超過配額
  4. 循環更新每一個主機的狀態
  5. 調用/nova/conductor/api::build_instances()

總結:本函數的主要做的是獲取鏡像-id,檢查網絡,寫入數據庫等工作。

其中獲取image-id的流程具有代表性,值得細細分析。

首先看glance架構:

glance-registry負責存儲鏡像的的具體信息,包括鏡像的大小,格式,位置等。glance-backend負責存儲真正的鏡像。

技術分享

當獲取鏡像時,首先會到glance-registry組件中獲取將請求的鏡像的數據,大小,格式,位置等,

然後到需要創建虛擬機時再去相應路徑下載鏡像作為虛機啟動模板。

所以這裏就會有一個請求鏡像id的過程,從nova的以http請求的方式去調用glance-api,glance-api調用glance-registry查詢數據庫獲得鏡像的id。

技術分享

代碼流程如下:

技術分享

技術分享

技術分享

 session, image_id = self._get_session_and_image_id(context, id_or_uri)
 return session.show(context, image_id,
                            include_locations=include_locations,
                            show_deleted=show_deleted)

這段代碼的作用是通過glanceclient獲取鏡像文件信息。 在openstack中,不同組件之間的通信是通過RESTful API完成的,openstack的處理方式是為每個組件都包含了這樣一個client,

它們都繼承於HTTPClient這個基類,但做了一些個性化的封裝,用於向各自的組件發送HTTP請求。具體到這裏,nova需要和glace通信,以獲取鏡像文件的信息,所以需要聲明了這樣一個glanceclient。

代碼self._get_session_and_image_id(context, id_or_uri) 的作用就是創建一個glaceclient對象,然後把這個對象封裝入GlanceImageService類裏,即返回值image_service。

然後調用該類下的show方法來獲取鏡像文件的信息

摘錄自:http://blog.csdn.net/qiuhan0314/article/details/43057591

技術分享

可以看到這裏有 image = self._client.call(context, version, ‘get‘, image_id) 這條調用函數就是restful 請求。

這樣就通過restful api獲取了鏡像id。由於鏡像不是主題討論的重點,所以就不再話下。

_create_instance()函數中另一個比較重要的方法是 _provision_instances(),該函數實現了對創建虛機時的各項配額進行檢查,並將虛機信息寫入數據庫。

技術分享

技術分享

instance = self.create_db_entry_for_new_instance(context, instance_type, boot_meta, instance, security_groups,
block_device_mapping, num_instances, i, shutdown_terminate, create_instance=False)

是向數據庫中寫入實例信息的函數

技術分享

技術分享

介紹完/compuet/api.py文件中的_create_instance()函數,目前推進的進度在這裏。

技術分享

nova創建虛擬機源碼分析系列之七 傳入參數轉換成內部id