讀古今文學網 > OpenStack系統架構設計實戰 > 6.5.2 資源類型的實現 >

6.5.2 資源類型的實現

Heat提供了一種開放式的資源接入框架,通過資源接入框架為所有的資源提供資源接入支持。當需要接入一種新的資源時,只需要實現所提供的資源接口,並完成對應的資源操作邏輯即可。

目前,Heat的所有資源模塊實現均在engine/resources目錄下,為了瞭解Heat的資源類型是如何工作的,我們以OS::Nova::Server資源類型為例子,講解Heat通用的資源類型的實現模式。

OS::Nova::Server這個資源類型在Heat中完成了虛擬機創建和相應的初始化工作。如雲磁盤掛載、調用cloud-init/heat-cfntool和虛擬機交互等。為了實現這個功能,需要完成以下工作。

1)在engine/resources目錄下創建一個server.py文件,這個文件首先要定義一個resource_mapping方法來確定資源類型名稱和實現類的映射關係,如下:

def resource_mapping: return {'OS::Nova::Server': Server, }

這樣,Heat引擎就可以識別這個資源類型的具體實現。

2)如上面定義的類型映射關係所示,需要在Server.py中定義一個Server類,繼承engine.resource.resource.Resource,並重寫具體邏輯,作為資源類型的具體實現,如下:

class Server(stack_user.StackUser):

這裡的父類stack_user.StackUser是engine.resource.resource.Resource的一個子類。

3)在Server類中,實現資源類型的生成週期管理操作,如handle_create()完成資源的創建操作。如果此時需要調用OpenStack的其他組件,則可通過Heat內置的Clients組件進行調用。在一個資源操作中,可能會與多個組件發生多次交互,直至完成資源的創建,如這裡的虛擬機創建過程,先會調用Glance進行鏡像信息獲取和驗證,然後再調用Nova進行虛擬機創建。創建過程中,還是調用Neutron組件進行網絡初始化。

4)資源接入的具體調用流程如下:

總體上,我們也可以將一個Heat模板理解為一個最大的資源,將Heat模板丟給Heat引擎執行時,模板首先會被解析成一個大的資源類型,然後再依次將模板內的資源解析成小資源模板進行處理。

完整的Heat內置資源類型與OpenStack各組件之間的整體交互關係如圖6-2所示。