您的位置:首页 > 其它

Horizon的认识(个人理解)

2015-09-10 09:36 316 查看
1 Horizon的源码中,包含两个代码文件夹

(1)、horizon

(2)、openstack_dashboard

(1) Horizon是一些在django基础上写的通用组件,表格(table),标签页(tab),表单(form),面包屑导航 (browser),工作流(workflow),其中,horizon/base.py实现了一套dashboard/panel机制,panel是可插拔的、动态的。

(2)openstack_dashboard是horizon各个面板的具体实现代码。

(2-1) /dashboards是各模块的目录,包括:./admin,(管理员面板)./identity(项目、用户管理界面),./project(普通用户项目界面),./router(路由设置),./settings(设置界面)。

dashboards/admin/instances 是管理员面板,云主机管理界面,其中,

./templates:云主机html界面模板

./forms.py:form表单实现

./panel.py:实现panel注册到dashbord

./tables.py:table实现

./tests.py:测试

./urls.py:url映射

./views.py:url映射的视图

(2-2)./enabled是控制导航加载哪些模块显示出来

(2-3)./local:本地配置文件

(2-4) ./management:定义安装apache、horizon等是配置文件的

模板文件。

(2-5) ./static:horizon静态包

(2-6) ./templates:horizon模板包

2 Horizon模块注册机制

Horizon/base.py中实现了一套dashboard/panel注册、动态加载机制,base的源码结构图,如下所示:



Horizon初始化init.py

if Horizon:

register = Horizon.register

unregister = Horizon.unregister

get_absolute_url = Horizon.get_absolute_url

get_user_home = Horizon.get_user_home

get_dashboard = Horizon.get_dashboard

get_default_dashboard = Horizon.get_default_dashboard

get_dashboards = Horizon.get_dashboards

urls = Horizon._lazy_urls

horizon项目在引入的时候自动通过horizon.init()自动Load类属性方法def_lazy_urls(self),加载LazyURLPattern(url_patterns)其中url_patterns是一个嵌套方法。

当请求过来的时候,根据Django Urls映射机制,去openstack_dashboard.urls.py匹配url,匹配模式,

urlpatterns = patterns(

”,

url(r’^$’, ‘openstack_dashboard.views.splash’, name=’splash’),

url(r’^api/’, include(‘openstack_dashboard.api.rest.urls’)),

url(r”, include(horizon.urls)),

)

urls.py文件中url(r’’, include(horizon.urls)),触发执行_lazy_urls()方法。_lazy_urls()方法返回def_urls(self)处理结果的第一个参数urlpatterns,整个Horizon模块的注册Urls编译都是在这个方法内完成,通过_autodiscover()方法,从“settings.INSTALLED_APPS发现模块,包含dashboard.py文件的模块进行注册,并添加到self._registry注册表中,然后通过循环遍历注册表,调用每个注册dashboard的_autodiscover()方法,注册每个dashboard下面的panel,完成整个horizon模块的注册,最终返回一个urlpatterns值,urls匹配调用相应的views模块。

注册模块包括两部分,

(一):INSTALLED_APPS = [

‘openstack_dashboard’,

‘django.contrib.contenttypes’,

‘django.contrib.auth’,

‘django.contrib.sessions’,

‘django.contrib.messages’,

‘django.contrib.staticfiles’,

‘django.contrib.humanize’,

‘django_pyscss’,

‘openstack_dashboard.django_pyscss_fix’,

‘compressor’,

‘horizon’,

‘openstack_auth’,

]

(二):

import openstack_dashboard.enabled

import openstack_dashboard.local.enabled

from openstack_dashboard.utils import settings

INSTALLED_APPS = list(INSTALLED_APPS) # Make sure it’s mutable

settings.update_dashboards(

[

openstack_dashboard.enabled,
openstack_dashboard.local.enabled,
],
HORIZON_CONFIG,
INSTALLED_APPS,


)

Horizon这套面板的设计分成三层:Dashboard -> PanelGroup -> Panel,每个dashboard模块下都有一个dasbboard.py文件里面定义了属于当前dashboard的PanelGroup,和各个PanelGroup下的Panel,在Horizon模块被导入的时候会去依次遍历Dasboard→PanelGroup→Panel,所有的dashboard注册到Horizon命名空间下,各个panel注册到自己的dashboard命名空间下。

3. openstack中的不同模块-细致每一个panel的API的方法,在对应的模块下的handle方法中,

而模块在/openstack_dashboard/dashborads下,不同的功能模块,即模块(form)对应的类,

例子:

在当前代码路径下,/project普通用户的dashborad,可见很多的panel,以Volumes为例,可以看到它的子文件夹下,结构,



forms是表单,tables是一些控件,关键的处理方法在forms中,


每一个类对应一个处理方法,比如CreateForm对应的是Volume的创建,其handle方法,采用的是cinder-api调用。即在Horizon/openstack_dashborad下的api文件夹下,因此API的使用是写死的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: