这篇文章主要介绍一下Openstack Horizon — juno项目的整体情况,关于这方面的内容网上已经有很多相关的介绍,我在这里只作为一个知识的搬运工,把一些分散的内容加上个人的理解形成一篇介绍性博文,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
邮箱地址:[email protected]
二、Horizon介绍
Horizon是OpenStack的一个子项目,用于提供一个Web前端控制台(称为Dashboard),以此来展示OpenStack的功 能。通常情况下,我们都是从Horizon、Dashboard开始来了解OpenStack的。实际上,Horizon并不会为OpenStack添加任何一个新的功能,它只是使用了OpenStack部分API功能,因此,我们可以扩展Horizon的功能,扩展Dashboard。
Horizon是基于django webframework开发的标准的python wsgi程序,django的设计专注于代码的高度可重用,信奉DRY原则,一切面向对象,而Horizon可以说高度match了django的设计风格。
先说一点web开发的常识,网站程序基本有三部分组成,业务逻辑代码(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
(1)、project 普通用户登陆后看到的项目面板
(2)、admin 管理登陆后可见,左侧的管理员面板
(3)、settings 右上角的设置面板,里面可设置语言,时区,更改密码
(4)、identity 不同的角色登陆之后,左侧的“身份”面板,可设置项目用户
(5)、router ciso nexus 1000v的管理面板
每一个dashboard都是django中的一个app,django中的app可以理解成对业务逻辑模块化的一种手段,里面可以包含自己独有的url设定,模板,和业务逻辑代码。每个dashboard下定义了一系列的PanelGroup,虚拟机管理对应到界面上就是一个PanelGroup(ManageCompute), 里面有一系列的子panel(Overview, Instances, Volumes…)。Swift,heat,neutron的管理面板各自都是一个PanelGroup,底下有各自的子panel。
2、项目结构
Horizon的源码中,包含两个代码文件夹
1、horizon
2、openstack_dashboard
Horizon这个包是一些在django基础上写的通用组件,表格(table),标签页(tab),表单(form),面包屑导航 (browser),工作流(workflow),这些代码和openstack的具体业务逻辑没有什么关系,如果做一个新的django项目,理论上可以复用Horizon这个包中的代码。horizon/base.py中还实现了一套dashboard/panel机制,使得Horizon面板上所有的dashboard都是”可插拔”的,所有的panel都是”动态加载”的。
openstack_dashboard/dashboards/中是各个面板的具体实现代码,其中包括各个面板的模板文件, 和后端service交互的业务逻辑代码等。
以下对重要目录做一个介绍,有些目录目前还没有接触到还不清楚具体的作用:
horizon
./doc: horizon相关帮助性文档
./horizon:horizon通用组件库
./browsers:
./conf:Horizon配置文件
./contrib:
./forms:form表单基类包
./locale:国际化语言包
./management:manage.py startdash/startpanel命令
./static:horizon静态文件包
./tables:table基类包
./tabs:tab基类包
./templates:模板文件基类
./templatetags:模板标签基类
./test:测试包
./utils:工具包
./workflows:工作流机制包
./openstack_dashboard:horizon各个面板的具体实现代码
./api:调用nova、swift、glance等接口封装
./conf:nova、cinder等API访问权限控制,叫 xxx_policy.json,里 面定义了鉴权用的rules。
./dashboards:Horizon界面展示各个模块实现目录。
./admin:管理员界面
./instances:云主机管理界面
./templates:云主机html界面模板
./forms.py:form表单实现
./panel.py:实现panel注册到dashbord
./tables.py:table实现
./tests.py:测试
./urls.py:url映射
./views.py:url映射的视图
…...
./identity:项目、用户管理界面
./project:普通用户项目界面
./router:
./settings:设置界面
./django_pyscss_fix:
./enabled:控制导航加载哪些模块显示出来。
./local:本地配置文件
./locale:本地国家化语言包
./management:定义安装apache、horizon等是配置文件的
模板文件。
./openstack:log、_i18n等包
./static:horizon静态包
./templates:horizon模板包
./templatetags:horizon模板标签包
./test:测试包
./usage:Horizon概况页面资源统计实现包
./utils:工具包
./wsgi:wsgi包
./tool: horizon工具包
./manage.py :
参考资料:http://www.cnblogs.com/yuxc/p/3419102.html