一、基础准备:
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的源码中,包含两个代码文件夹:
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交互的业务逻辑代码等。
对重要目录做一个介绍,有些目录目前还没有接触到还不清楚具体的作用:
1 horizon 2 ./doc: horizon相关帮助性文档 3 ./horizon:horizon通用组件库 4 ./browsers: 5 ./conf:Horizon配置文件 6 ./contrib: 7 ./forms:form表单基类包 8 ./locale:国际化语言包 9 ./management:manage.py startdash/startpanel命令 10 ./static:horizon静态文件包 11 ./tables:table基类包 12 ./tabs:tab基类包 13 ./templates:模板文件基类 14 ./templatetags:模板标签基类 15 ./test:测试包 16 ./utils:工具包 17 ./workflows:工作流机制包 18 ./openstack_dashboard:horizon各个面板的具体实现代码 19 ./api:调用nova、swift、glance等接口封装 20 ./conf:nova、cinder等API访问权限控制,叫 xxx_policy.json,里 面定义了鉴权用的rules。 21 ./dashboards:Horizon界面展示各个模块实现目录。 22 ./admin:管理员界面 23 ./instances:云主机管理界面 24 ./templates:云主机html界面模板 25 ./forms.py:form表单实现 26 ./panel.py:实现panel注册到dashbord 27 ./tables.py:table实现 28 ./tests.py:测试 29 ./urls.py:url映射 30 ./views.py:url映射的视图 31 ...32 ./identity:项目、用户管理界面 33 ./project:普通用户项目界面 34 ./router: 35 ./settings:设置界面 36 ./django_pyscss_fix: 37 ./enabled:控制导航加载哪些模块显示出来。 38 ./local:本地配置文件 39 ./locale:本地国家化语言包 40 ./management:定义安装apache、horizon等是配置文件的 41 模板文件。 42 ./openstack:log、_i18n等包 43 ./static:horizon静态包 44 ./templates:horizon模板包 45 ./templatetags:horizon模板标签包 46 ./test:测试包 47 ./usage:Horizon概况页面资源统计实现包 48 ./utils:工具包 49 ./wsgi:wsgi包 50 ./tool: horizon工具包 51 ./manage.py :