一、基礎准備:
Horizon是基於django webframework開發的標准的Python wsgi程序,django的設計專注於代碼的高度可重用,信奉DRY原則,一切面向對象,而Horizon可以說高度match了django的設計風格。網站程序基本有三部分組成,業務邏輯代碼(Python),靜態文件(js/css),模板(Python中的 jinja,mako,nodejs中有jade), 用戶向webserver發起請求之后,server程序找到當前url對應的模板,填充模板變量(輸出成字符串形式的html源碼),返回給瀏覽器,瀏覽器渲染頁面。一般模板語言都有繼承(extend),插入(include)等特性,來提高頁面的復用率。
Horizon做得就更徹底一些,它將頁面上所有元素模塊化,網頁中一些常見元素,表單,表格,標簽頁,全部封裝成Python類,每個組件有自己 對應的一小塊html模板.當渲染整個頁面的時候,Horizon先找到當前頁面有多少組件,將各個組件分別進行渲染變成一段html片段,最后拼裝成一 個完整的html頁面,返回瀏覽器。
總結Horizon的特點:
- 頁面元素模塊化
- 子面板可插
- All in One(從部署上來說,Horizon只有它自己這一個組件)
二、分析horizon
1、horizon設計分為三層:Dashboard->PanelGroup->Panel
a、project普通用戶登錄后看到的是項目面板
b、admin管理登錄看到可見左測的管理員面板
c、settings右上角的設置面板
d、identity不同的角色登錄之后,左側的“身份”面板,可設置項目用戶
e、交換機管理面板
每個dashboard都是django中的一個app,django中的app可以理解成對業務邏輯模塊化的一種手段,里面可以包含自己獨有的url設定,模板和業務邏輯代碼。每個dashboard下定義了一系列的PanelGroup,虛擬機管理對應到界面上就是一個PanelGroup(ManageCompute),里面有一系列的子panel(Overview、Instance、Volumes...). swift, heat, neutron的管理面板自都是一個PanelGroup,底下有各自的子Panel。
2、項目結構
Horizon項目核心的代碼包有兩個:openstack-dashboard和python-django-horizon。
第一個包是控制台代碼的具體實現,是一個基於Django框架的web應用,安裝后主要文件在/usr/share/openstack-dashboard/路徑下。第二個包是通用的一些Python類庫,也包括一些靜態文件,安裝后在/usr/lib/python2.7/dist-packages/horizon下。定制化開發,主要是修改業務代碼,基本不需要修改python-django-horizon,所以我們分析的重點放在openstack-dashboard這個包上。

圖中的7個名詞在代碼中都可以對應上,代碼的層級結構還是很清晰的。
