Horizon的认识(个人理解)

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的认识(个人理解)_第1张图片
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为例,可以看到它的子文件夹下,结构,Horizon的认识(个人理解)_第2张图片
forms是表单,tables是一些控件,关键的处理方法在forms中,Horizon的认识(个人理解)_第3张图片
每一个类对应一个处理方法,比如CreateForm对应的是Volume的创建,其handle方法,采用的是cinder-api调用。即在Horizon/openstack_dashborad下的api文件夹下,因此API的使用是写死的。

你可能感兴趣的:(openstack)