程 成,朱志祥,梁小江
(1.西安郵電大學(xué) 計算機學(xué)院,陜西 西安 710061;2.陜西省信息化工程研究院,陜西 西安 710065)
?
基于OpenStack Horizon框架的研究與應(yīng)用
程成1,朱志祥1,梁小江2
(1.西安郵電大學(xué) 計算機學(xué)院,陜西 西安710061;2.陜西省信息化工程研究院,陜西 西安710065)
摘要OpenStack 作為云計算的開源項目,被諸多企業(yè)作為IaaS平臺使用。文中針對OpenStack平臺界面開發(fā)效率低,功能擴展難的問題,提出Horizon框架的潛在通用模式,并基于Horizon框架快速實現(xiàn)界面功能擴展。簡化了OpenStack界面的二次開發(fā)過程,可幫助企業(yè)更加快速、便捷地設(shè)計出具有豐富功能和企業(yè)特色的云計算平臺產(chǎn)品。
關(guān)鍵詞云計算;OpenStack Horizon;Django框架;二次開發(fā)
云計算已成為互聯(lián)網(wǎng)新興計算模式[1],用戶付費獲得準(zhǔn)入資格后,便可使用資源池中與支付金額相對應(yīng)的定量資源,并可對計算資源進行自由擴展[2]。OpenStack云計算平臺是由RackSpace和NASA共同開發(fā)并得到了Dell、Citrix等行業(yè)巨頭的投入和支持[3]。由于OpenStack具有系統(tǒng)穩(wěn)定,Restful API豐富及運營成本低等特點,大多數(shù)企業(yè)都基于OpenStack研發(fā)云平臺產(chǎn)品,如青云、UnitedStack、阿里云等[4]。
隨著基于OpenStack平臺研發(fā)的產(chǎn)品增多,為豐富用戶功能及突出企業(yè)特色,Horizon項目作為OpenStack的界面顯示部分變得越來越重要。
1Horizon系統(tǒng)架構(gòu)
OpenStack Horizon項目為用戶提供了操作OpenStack各服務(wù)的Web界面[5],作為Apache WSGI應(yīng)用程序部署,基于Django框架開發(fā)實現(xiàn),還運用jQuery、Bootstrap、Underscore.js、AngularJS、D3.js、Rickshaw、LESS CSS等技術(shù)。
Horizon框架具有可擴展性、可定制和可測試性,框架提供的功能使得開發(fā)人員能夠快速構(gòu)建Web界面,并通過常見的導(dǎo)航框架組裝各個組件,提供了許多定制掛鉤,使開發(fā)人員能夠定制應(yīng)用程序的CSS樣式、JavaScript和Python的應(yīng)用腳本。Horizon關(guān)聯(lián)并兼容OpenStack的所有服務(wù)組件API,其關(guān)系如圖1所示。
1.1具體架構(gòu)分析
Horizon框架基于Django開發(fā)[6],專注于代碼的高度可重用,遵循面向?qū)ο笤瓌t。一般基于Django框架的Web程序,主要由3部分組成,處理業(yè)務(wù)邏輯代碼的Views,處理與顯示相關(guān)的Template、處理與數(shù)據(jù)相關(guān)的所有事務(wù)Model,簡稱MTV模式。當(dāng)用戶向WebServer發(fā)起請求之后,Server程序找到當(dāng)前url對應(yīng)的模板,填充模板變量,輸出成字符串形式的Html源碼,最后返回給瀏覽器渲染頁面。Django框架結(jié)構(gòu)圖,如圖2所示。
圖1 服務(wù)組件關(guān)系圖
圖2 Django框架
不同于Django框架,Horizon則將頁面上所有元素模塊化,如網(wǎng)頁中一些常見元素、表單、表格、標(biāo)簽頁等,全部封裝為Python類,每個組件對應(yīng)一小塊Html模板。當(dāng)渲染頁面時,Horizon將當(dāng)前頁面的多個元素對應(yīng)于各自Html片段,最終將這些片段拼裝成一個完整的Html頁面,返回瀏覽器。
Horizon框架的應(yīng)用程序運行在OpenStack服務(wù)之上,而不是運行在一個數(shù)據(jù)庫上,其通過REST-ful API訪問這些服務(wù)[7]。總結(jié)Horizon的特點如下:頁面元素模塊化、子面板可插拔、All in One(從部署上而言,Horizon只有其自身一個組件)。Horizon框架的結(jié)構(gòu),如圖3所示。
圖3 Horizon框架
1.2目錄結(jié)構(gòu)詳解
1.2.1Horizon目錄
OpenStack Horizon項目由兩部分代碼組成:Horizon和OpenStack_dashboard。Horizon提供功能組件,OpenStack_dashboard則是一個使用了Hrizon的Django項目。具體各文件的功能如圖4所示。
圖4 Horizon目錄
Horizon通過3個獨特機制將頁面上所有元素模塊化,分別為Dashboards/Panels機制,Tabs/TabGroup機制,DataTables機制。
Dashboard/Panel機制在Horizon/base.py中實現(xiàn),使得Horizon面板上所有的Dashboard可插拔,所有Panel均可動態(tài)加載。Dashboards是頂級導(dǎo)航元素,而Panels對應(yīng)于一個頁面。當(dāng)開發(fā)人員需要加入新的菜單項時,只需將菜單項繼承PanelGroups和Panel,再注冊到頂級的Dashboards中,側(cè)邊欄導(dǎo)航會自動加載新元素,同時也擁有Horizon的身份驗證和授權(quán)方案。
Tabs/TabGroups機制可實現(xiàn)頁簽的動態(tài)加載,當(dāng)需要將應(yīng)用程序呈現(xiàn)于多個選項卡,使用Horizon提供的Tabs和TabGroups類創(chuàng)建tabs,可自動化呈現(xiàn)頁簽,并實現(xiàn)頁簽切換。
DataTable機制會自動化創(chuàng)建并呈現(xiàn)具有高度交互性的功能表。Datatable中包括以下功能,如:多選列、批處理操作,實時表搜索過濾,可配置table-wide動作,可配置下拉菜單,基于Ajax表的更新或輪詢等,其實現(xiàn)只需在源碼中聲明即可。
1.2.2Dashboard目錄
OpenStack_dashboard部分是各個面板的具體實現(xiàn)代碼,其中包括各個面板的模板文件,和后端交互的業(yè)務(wù)邏輯代碼等。使用URLconf文件進行鏈接請求,通過view進行后端處理,最后由template進行頁面渲染,目錄結(jié)構(gòu)圖5所示。
圖5 Dashboard目錄結(jié)構(gòu)圖
Dashboard面板的設(shè)計分成3層:Dashboard→PanelGroup→Panel。Dashboard是頂級的UI組件,其中包含面板組和面板。PanelGroups組織集合相類似的面板并提供下拉菜單,面板組的配置在Dashboard.py文件中;Panel是UI的主要組成部分,每個Panel有自身特有的目錄和標(biāo)準(zhǔn)化目錄結(jié)構(gòu),面板的配置在panel.py文件中。每個Dashboard相當(dāng)于django中的一個app,包含獨有的url,模板,使業(yè)務(wù)邏輯模塊化。
2界面功能擴展實例
通過對Horizon框架的分析以及各文件功能的了解,此部分實現(xiàn)OpenStack界面操作日志記錄的功能。
2.1開發(fā)環(huán)境
實例基于OpenStack H版本,開發(fā)工具為eclipse,便于調(diào)試的方便需將local_setting.py中Debug設(shè)置為true。
2.2模塊添加
在Project的面板界面增加action_log菜單項,即Dashboards/Project下新建一個命名action_log的文件夾,其文件目錄結(jié)構(gòu)如圖6所示。
圖6 action_log目錄結(jié)構(gòu)
Panel.py定義應(yīng)用標(biāo)識,通過Register語句即可將應(yīng)用注冊到Project面板中,其核心代碼如下:
class ActionLog(horizon.Panel):
name=_("Action Log")
slug=‘a(chǎn)ction_log’
dashboard.Project.register(ActionLog)
Tables.py顯示數(shù)據(jù)給最終用戶,并設(shè)定數(shù)據(jù)的列名,其核心代碼如下:
class ActionLogTable(tables.DataTable):
設(shè)置id、name、action、status列名
id=tables.Column(‘id’)
…
…
class Meta:
name="actionlog"
verbose_name=_("ActionLog")
urls.py獲取用戶請求 URL,通過正則表達式的匹配調(diào)用對應(yīng)函數(shù),其核心代碼如下:
urlpatterns=patterns(‘openstack_dashboard.dashboards.project.action_log.views’,url(r‘^$’,views.IndexView.as_view(),name=‘index’))
Views.py為業(yè)務(wù)執(zhí)行函數(shù),執(zhí)行相關(guān)的動作,其核心代碼如下:
class IndexView(tables.DataTableView):
table_class=ActionLogTable
template_name=index.html
def get_data(self):
連接數(shù)據(jù)庫;
cur=conn.cursor()
按條件查找數(shù)據(jù)表;
rows=cur.fetchall()
for row in rows:
遍歷數(shù)據(jù)庫內(nèi)容;
actions.append(action)
return actions
Dashboard.py加載action_log加載到框架面板組中,其核心代碼如下:class BasePanels(horizon.PanelGroup):
slug="compute"
name=_("Compute")
panels=(‘a(chǎn)ction_log’)
Index.html定義顯示模板,通過特定語句加載 HTML傳遞需要顯示的數(shù)據(jù),核心代碼如下:
{% extends ‘base.html’ %}
{% block title %}
{% trans "ActionLog" %}
{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("ActionLog")%}
action_log表字段類型設(shè)計,如表1所示。
表1 action_log表
修改horizon/tables/action.py,添加實現(xiàn)動作記錄函數(shù),核心代碼如下:
def handle(self,table,request,obj_ids):
event_message=self. get_action_name
記錄每個動作到數(shù)據(jù)表中;
ToMysql(datum_display,event_message)
菜單項添加效果,如圖7所示。點擊“Action Log”后,就會列出操作日志信息,如圖8所示。
圖7 菜單項效果圖
圖8 操作日志
3結(jié)束語
OpenStack已成為云計算開源領(lǐng)域的領(lǐng)導(dǎo)者,越來越多的企業(yè)基于OpenStack搭建基礎(chǔ)設(shè)施平臺,服務(wù)于上層應(yīng)用。Horizon框架的通用模式的提出,為OpenStack界面的二次開發(fā)帶來方便,幫助企業(yè)更加快速、便捷地設(shè)計出具有功能豐富并具有企業(yè)特色的云計算平臺產(chǎn)品。
參考文獻
[1]楊青峰.云計算時代關(guān)鍵技術(shù)預(yù)測與戰(zhàn)略選擇[J].中國科學(xué)院院刊,2015(2):148-161,169.
[2]李小寧,李磊,金連文,等.基于OpenStack構(gòu)建私有云計算平臺[J].電信科學(xué),2012(9):1-8.
[3]曹媛媛.云計算關(guān)鍵技術(shù)應(yīng)用及發(fā)展[J].電子科技,2011,24(11):141-143,151.
[4]NIST.NIST Cloud Computing Program[EB/OL].(2013-11-13)[2013-12-05].http://www.nist.gov/itl/cloud/
[5]王石玉.云計算在企業(yè)信息化的應(yīng)用[J].電子科技,2012,25(10):142-144.
[6]高峰,楊連賀.Flex技術(shù)與Django開發(fā)框架的整合研究[J].計算機與數(shù)字工程,2010,38(1):94-96,146.
[7]鐘志偉.基于OpenStack的私有云管理平臺及其關(guān)鍵技術(shù)研究[D].北京郵電大學(xué),2014.
[8]Django.Django documentation[EB/OL].(2014-01-03)[2015-05-10].https://do cs.djangoproject.com/en/1.8.
Study and Application Based on OpenStack Horizon Frame
CHENG Cheng1,ZHU Zhixiang1,LIANG Xiaojiang2
(1.School of Computer Science,Xi’an University of Posts and Telecommunications,Xi’an 710061,China;.Shaanxi Province Information Engineering Institute,Xi’an 710065,China)
AbstractAs the most popular open source projects in cloud computing,OpenStack has been used by many enterprises as Iaas platform.In view of the low efficiency of the platform interface development and difficult function expansion,this paper presents the potential general pattern of the horizon framework for convenient secondary development of OpenStack interface,based on which quick interface function expansion is realized.This pattern can help enterprises design cloud computing platform products with multi functions and characteristics of enterprises.
Keywordscloud computing;OpenStack Horizon;Django frame;secondary development
中圖分類號TP391
文獻標(biāo)識碼A
文章編號1007-7820(2016)04-084-04
doi:10.16180/j.cnki.issn1007-7820.2016.04.022
作者簡介:程成(1990—),男,碩士研究生。研究方向:云計算理論與應(yīng)用。朱志祥(1959—),男,博士,教授。研究方向:信息化應(yīng)用和網(wǎng)絡(luò)安全。梁小江(1983—),男,碩士,高級工程師。研究方向:云計算。
收稿日期:2015- 09- 06