程 成,朱志祥,梁小江
(1.西安邮电大学 计算机学院,陕西 西安 710061;2.陕西省信息化工程研究院,陕西 西安 710065)
基于OpenStack Horizon框架的研究与应用
程成1,朱志祥1,梁小江2
(1.西安邮电大学 计算机学院,陕西 西安710061;2.陕西省信息化工程研究院,陕西 西安710065)
摘要OpenStack 作为云计算的开源项目,被诸多企业作为IaaS平台使用。文中针对OpenStack平台界面开发效率低,功能扩展难的问题,提出Horizon框架的潜在通用模式,并基于Horizon框架快速实现界面功能扩展。简化了OpenStack界面的二次开发过程,可帮助企业更加快速、便捷地设计出具有丰富功能和企业特色的云计算平台产品。
关键词云计算;OpenStack Horizon;Django框架;二次开发
云计算已成为互联网新兴计算模式[1],用户付费获得准入资格后,便可使用资源池中与支付金额相对应的定量资源,并可对计算资源进行自由扩展[2]。OpenStack云计算平台是由RackSpace和NASA共同开发并得到了Dell、Citrix等行业巨头的投入和支持[3]。由于OpenStack具有系统稳定,Restful API丰富及运营成本低等特点,大多数企业都基于OpenStack研发云平台产品,如青云、UnitedStack、阿里云等[4]。
随着基于OpenStack平台研发的产品增多,为丰富用户功能及突出企业特色,Horizon项目作为OpenStack的界面显示部分变得越来越重要。
1Horizon系统架构
OpenStack Horizon项目为用户提供了操作OpenStack各服务的Web界面[5],作为Apache WSGI应用程序部署,基于Django框架开发实现,还运用jQuery、Bootstrap、Underscore.js、AngularJS、D3.js、Rickshaw、LESS CSS等技术。
Horizon框架具有可扩展性、可定制和可测试性,框架提供的功能使得开发人员能够快速构建Web界面,并通过常见的导航框架组装各个组件,提供了许多定制挂钩,使开发人员能够定制应用程序的CSS样式、JavaScript和Python的应用脚本。Horizon关联并兼容OpenStack的所有服务组件API,其关系如图1所示。
1.1具体架构分析
Horizon框架基于Django开发[6],专注于代码的高度可重用,遵循面向对象原则。一般基于Django框架的Web程序,主要由3部分组成,处理业务逻辑代码的Views,处理与显示相关的Template、处理与数据相关的所有事务Model,简称MTV模式。当用户向WebServer发起请求之后,Server程序找到当前url对应的模板,填充模板变量,输出成字符串形式的Html源码,最后返回给浏览器渲染页面。Django框架结构图,如图2所示。
图1 服务组件关系图
图2 Django框架
不同于Django框架,Horizon则将页面上所有元素模块化,如网页中一些常见元素、表单、表格、标签页等,全部封装为Python类,每个组件对应一小块Html模板。当渲染页面时,Horizon将当前页面的多个元素对应于各自Html片段,最终将这些片段拼装成一个完整的Html页面,返回浏览器。
Horizon框架的应用程序运行在OpenStack服务之上,而不是运行在一个数据库上,其通过REST-ful API访问这些服务[7]。总结Horizon的特点如下:页面元素模块化、子面板可插拔、All in One(从部署上而言,Horizon只有其自身一个组件)。Horizon框架的结构,如图3所示。
图3 Horizon框架
1.2目录结构详解
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中实现,使得Horizon面板上所有的Dashboard可插拔,所有Panel均可动态加载。Dashboards是顶级导航元素,而Panels对应于一个页面。当开发人员需要加入新的菜单项时,只需将菜单项继承PanelGroups和Panel,再注册到顶级的Dashboards中,侧边栏导航会自动加载新元素,同时也拥有Horizon的身份验证和授权方案。
Tabs/TabGroups机制可实现页签的动态加载,当需要将应用程序呈现于多个选项卡,使用Horizon提供的Tabs和TabGroups类创建tabs,可自动化呈现页签,并实现页签切换。
DataTable机制会自动化创建并呈现具有高度交互性的功能表。Datatable中包括以下功能,如:多选列、批处理操作,实时表搜索过滤,可配置table-wide动作,可配置下拉菜单,基于Ajax表的更新或轮询等,其实现只需在源码中声明即可。
1.2.2Dashboard目录
OpenStack_dashboard部分是各个面板的具体实现代码,其中包括各个面板的模板文件,和后端交互的业务逻辑代码等。使用URLconf文件进行链接请求,通过view进行后端处理,最后由template进行页面渲染,目录结构图5所示。
图5 Dashboard目录结构图
Dashboard面板的设计分成3层:Dashboard→PanelGroup→Panel。Dashboard是顶级的UI组件,其中包含面板组和面板。PanelGroups组织集合相类似的面板并提供下拉菜单,面板组的配置在Dashboard.py文件中;Panel是UI的主要组成部分,每个Panel有自身特有的目录和标准化目录结构,面板的配置在panel.py文件中。每个Dashboard相当于django中的一个app,包含独有的url,模板,使业务逻辑模块化。
2界面功能扩展实例
通过对Horizon框架的分析以及各文件功能的了解,此部分实现OpenStack界面操作日志记录的功能。
2.1开发环境
实例基于OpenStack H版本,开发工具为eclipse,便于调试的方便需将local_setting.py中Debug设置为true。
2.2模块添加
在Project的面板界面增加action_log菜单项,即Dashboards/Project下新建一个命名action_log的文件夹,其文件目录结构如图6所示。
图6 action_log目录结构
Panel.py定义应用标识,通过Register语句即可将应用注册到Project面板中,其核心代码如下:
class ActionLog(horizon.Panel):
name=_("Action Log")
slug=‘action_log’
dashboard.Project.register(ActionLog)
Tables.py显示数据给最终用户,并设定数据的列名,其核心代码如下:
class ActionLogTable(tables.DataTable):
设置id、name、action、status列名
id=tables.Column(‘id’)
…
…
class Meta:
name="actionlog"
verbose_name=_("ActionLog")
urls.py获取用户请求 URL,通过正则表达式的匹配调用对应函数,其核心代码如下:
urlpatterns=patterns(‘openstack_dashboard.dashboards.project.action_log.views’,url(r‘^$’,views.IndexView.as_view(),name=‘index’))
Views.py为业务执行函数,执行相关的动作,其核心代码如下:
class IndexView(tables.DataTableView):
table_class=ActionLogTable
template_name=index.html
def get_data(self):
连接数据库;
cur=conn.cursor()
按条件查找数据表;
rows=cur.fetchall()
for row in rows:
遍历数据库内容;
actions.append(action)
return actions
Dashboard.py加载action_log加载到框架面板组中,其核心代码如下:class BasePanels(horizon.PanelGroup):
slug="compute"
name=_("Compute")
panels=(‘action_log’)
Index.html定义显示模板,通过特定语句加载 HTML传递需要显示的数据,核心代码如下:
{% extends ‘base.html’ %}
{% block title %}
{% trans "ActionLog" %}
{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("ActionLog")%}
action_log表字段类型设计,如表1所示。
表1 action_log表
修改horizon/tables/action.py,添加实现动作记录函数,核心代码如下:
def handle(self,table,request,obj_ids):
event_message=self. get_action_name
记录每个动作到数据表中;
ToMysql(datum_display,event_message)
菜单项添加效果,如图7所示。点击“Action Log”后,就会列出操作日志信息,如图8所示。
图7 菜单项效果图
图8 操作日志
3结束语
OpenStack已成为云计算开源领域的领导者,越来越多的企业基于OpenStack搭建基础设施平台,服务于上层应用。Horizon框架的通用模式的提出,为OpenStack界面的二次开发带来方便,帮助企业更加快速、便捷地设计出具有功能丰富并具有企业特色的云计算平台产品。
参考文献
[1]杨青峰.云计算时代关键技术预测与战略选择[J].中国科学院院刊,2015(2):148-161,169.
[2]李小宁,李磊,金连文,等.基于OpenStack构建私有云计算平台[J].电信科学,2012(9):1-8.
[3]曹媛媛.云计算关键技术应用及发展[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]王石玉.云计算在企业信息化的应用[J].电子科技,2012,25(10):142-144.
[6]高峰,杨连贺.Flex技术与Django开发框架的整合研究[J].计算机与数字工程,2010,38(1):94-96,146.
[7]钟志伟.基于OpenStack的私有云管理平台及其关键技术研究[D].北京邮电大学,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
文献标识码A
文章编号1007-7820(2016)04-084-04
doi:10.16180/j.cnki.issn1007-7820.2016.04.022
作者简介:程成(1990—),男,硕士研究生。研究方向:云计算理论与应用。朱志祥(1959—),男,博士,教授。研究方向:信息化应用和网络安全。梁小江(1983—),男,硕士,高级工程师。研究方向:云计算。
收稿日期:2015- 09- 06