nova創建虛擬機源碼分析系列之七 傳入參數轉換成內部id
上一篇博文將nova創建虛機的流程推進到了/compute/api.py中的create()函數,接下來就繼續分析。
在分析之前簡單介紹nova組件源碼的架構。以conductor組件為例:
每個組件都會有這三個文件:api.py rpcapi.py manager.py。
- api.py conductor實現自身功能的文件
- rpcapi.py conductor提供給其他組件通過消息隊列調用的接口函數
- manager.py 其他組件通過消息隊列調用的處理端函數
下面是/compute/api.py中的create()函數。
/nova/compute/api::create()
- 檢查是否創建多個實例,是否制定IP。檢查是否從端口ID創建多個實例
- 檢查域是否可用
- 創建過濾器
- 調用本類中create_instance()方法
總結:該函數的主要任務是對check policies、check quota、創建db記錄,創建下一步中schedule所需要的調度規則信息filter_properties,將部分參數整合,
然後將創建請求發送到本類中的_create_instance()函數中,進行下一步處理。
/compute/api.py ::_create_instance()函數:
/nova/compute/api::create_instance()
- 規格化和設置一些參數,如安全組,最小數值,最大數值,塊設備。
- 訪問glance服務,獲取image-id
- 檢查網絡是否超過配額
- 循環更新每一個主機的狀態
- 調用/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