Horizon是OpenStack的一個子項目,用於提供一個Web前端控制檯(稱爲Dashboard),以此來展現OpenStack的功能。一般狀況下,咱們都是從Horizon、Dashboard開始來了解OpenStack的。實際上,Horizon並不會爲OpenStack添加任何一個新的功能,它只是使用了OpenStack部分API功能,所以,咱們能夠擴展Horizon的功能,擴展Dashboard。前端
圖2-1-1 Dashboard界面apache
一個Dashboard(在django裏稱爲app)一般狀況下由四個組件組成,分別爲panel、tab(可選)、table和view,如圖2-1-1所示。其中,panel、tab和table用於導航的,真正展現數據的在view裏面。它們之間的關係是panel包含tab,tab包含table,view包含table或者tab。django
經過查看Horizon的源碼,可從其目錄結構看出它們之間的關係,如圖2-1-2所示。app
圖2-1-2 Horizon源碼目錄結構框架
下面,我會以在admin這個Dashboard裏擴展添加一個monitoring的panel爲例,介紹擴展OpenStack Dashboard的流程。url
首先介紹Dashboard.py這個文件,它位於每一個Dashboard的根目錄,其做用是註冊Dashboard(django裏稱爲app)以及設置Dashboard的屬性,好比Dashboard裏有哪些panel。spa
打開admin目錄下的Dashboard.py文件,設置SystemPanels有monitoring的panel:調試
咱們能夠在Dashboard.py文件裏隨意的添加、刪除panel屬性,這對於調試程序的時候很方便。rest
而後在amdin目錄下建立一個monitoring的文件夾,並在monitoring文件夾裏建立panel.py文件,定義panel:繼承
這是最簡單的panel,只定義了其名字。注意:slug屬性的值要與monitoring文件夾名字同樣。當定義完成後,要記得將其註冊到Dashboard裏。
Horizon是基於Django框架,程序是經過url來找到panel的,所以,須要在monitoring目錄下創建urls.py文件,定義url:
table用於展現數據,Horizon提供了DataTable基類,咱們能夠經過繼承DataTable來實現自定義的table:
在MonitoringTable裏定義了兩列resources和percent。
view是用來集成table或者tab的,Horizon提供了多種vie類,下面使用DataTableView來自定義咱們本身的IndexView:
在IndexView裏定義好table_class和template_name的屬性值,同時須要定義好get_data()方法,此方法用於獲取數據展現在table裏。
至此,擴展Dashboard已完成,須要重啓apache才能看到效果:sudo service apache2 restart。效果以下: