摘要

最近碰到个项目,需要在Horizon基础上开发增加一些小功能,这里将简单介绍一下Horizon的开发过程。

一、Horizon介绍

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模板(templates)。当渲染整个页面的时候,Horizon先找到当前页面有多少组件,将各个组件分别进行渲染变成一段html片段,最后拼装成一 个完整的html页面,返回浏览器。

一个Dashboard(在django里称为app)通常情况下由四个组件组成,分别为panel、tab、table和view。其中,panel、tab和table用于导航的,真正展示数据的在view里面。它们之间的关系是panel包含tab,tab包含table,view包含table或者tab。

二、研发环境搭建

可以在已经部署好的openstack环境中直接修改/usr/lib/python2.7/site-packages/openstack_dashboard/目录下的代码,之后重启httpd服务调试,也可以通过官网Quick start中的方式,将源码下载到本地,然后通过tox工具进行调试。这里将描述一下第二种方式的操作过程:

[root@vultr ~]# yum -y install epel-release
[root@vultr ~]# yum install gcc git-core python-devel python-virtualenv openssl-devel libffi-devel which
[root@vultr ~]# yum -y install python-pip
[root@vultr ~]# pip install django
[root@vultr ~]# pip install tox
[root@vultr ~]# mkdir /root/python; cd /root/python;
[root@vultr python]# git clone https://github.com/openstack/horizon.git
[root@vultr python]# cd horizon
[root@vultr horizon]# git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/stable/ocata
  origin/stable/pike
  origin/stable/queens
  origin/stable/rocky
[root@vultr horizon]# git checkout -b origin/stable/pike
[root@vultr horizon]# cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py

之后修改local_settings.py文件的下列参数,其中ALLOWED_HOSTS参数是为了能访问Dashboard而设置成*,其它4个参数目的是对接已有环境的Keystone,否则无法正常登入Dashboard。

ALLOWED_HOSTS = ['*']
SECRET_KEY='atUWYfUG0GOELk0aNS2a5fjQxVC3Rc8z7Qdl8LJc'
OPENSTACK_HOST = "172.16.170.129"
OPENSTACK_KEYSTONE_URL = "http://%s:15000/v2.0" % OPENSTACK_HOST
OPENSTACK_ENDPOINT_TYPE = "internalURL"

之后通过tox启动Dashboard,期间会有较长的pip install过程,根据网络状况不同,安装时间也会不同,国内用户等待的时间会比较漫长。

[root@hcs1 horizon]# tox -e runserver -- 172.16.33.1:8000
runserver create: /home/zgq/python/horizon/.tox/runserver
runserver installdeps: -r/home/zgq/python/horizon/requirements.txt, -r/home/zgq/python/horizon/test-requirements.txt 

启动完成之后可以通过浏览器登入Dashboard

三、创建自己的Panel

参考官网教程

[root@hcs1 horizon]# cd /home/zgq/python/horizon
[root@hcs1 horizon]# mkdir -p openstack_dashboard/dashboards/mydashboard/mypanel
[root@hcs1 horizon]# tox -e manage -- startdash mydashboard \
  --target openstack_dashboard/dashboards/mydashboard
[root@hcs1 horizon]# tox -e manage -- startpanel mypanel \
  --dashboard=openstack_dashboard.dashboards.mydashboard \
  --target=openstack_dashboard/dashboards/mydashboard/mypanel

之后删掉暂时用不上的,只留下需要的文件,目录结构如图:

修改dashboard.py文件

修改mypanel/panel.py文件

修改mypanel/tables.py文件

修改mypanel/tabs.py文件

修改mypanel/views.py文件

修改mypanel/urls.py文件

修改mypanel/templates/mypanel/index.html文件

最后创建并修改/home/zgq/python/horizon/openstack_dashboard/enabled/_50_mydashboard.py文件

之后重启tox后再次登入dashboard,新增的界面已经加上了

四、创建一个复杂的动作

参考官网教程

因为是在上一步新增的界面上增加Action,所以不需要修改dashboard.py和panel.py文件。新增form.py文件

之后修改table.py文件,增加Action

修改views.py文件,为Action创建views视图

修改url.py文件,添加url链接

最近添加Action所用的html

最后运行界面如图

以上