进入horizon界面,结构不复杂,核心的东西在页面左右两边,左侧像是导航,右侧是具体内容,不同用户登陆后,左侧看到的是不一样的,admin和普通user是有区别的,
在于能否操作admin的动作。
引用自:http://www.cnblogs.com/yuxc/p/3419102.html
Horizon这套面板的设计分成三层:Dashboard → PanelGroup → Panel
Horizon中现有的dashboard有4个:
-
project 普通用户登陆后看到的项目面板
-
admin 管理登陆后可见,左侧的管理员面板
-
settings 右上角的设置面板,里面可设置语言,时区,更改密码
-
router(配置文件中将profile_support打开可见),ciso nexus 1000v的管理面板,我并未亲自试验
每一个dashboard都是django中的一个app,django中的app可以理解成对业务逻辑模块化的一种手段,里面可以包含自己独有的url设定,模板,和业务逻辑代码.
每个dashboard下定义了一系列的PanelGroup,虚拟机管理对应到界面上就是一个PanelGroup(Manage Compute), 里面有一系列的子panel(Overview, Instances, Volumes…)。Swift,heat,neutron的管理面板各自都是一个PanelGroup,底下有各自的子panel.
这里的目录结构和Dashboard → PanelGroup → Panel的层级结构是对应的,比如admin.networks包中有agents, ports, subnets等和horizon上子Panel对应起来。
horizon中各个面板的具体实现代码,其中包括各个面板的模板文件, 和后端service交互的业务逻辑代码等都在这个目录下。
各个Dashboard相当于Django项目中的一个app,那个这些app是怎么注册到installed_apps中的呢:
在openstack_dashboard中的settings.py中:
INSTALLED_APPS = [
'openstack_dashboard',
....
}
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,
)
INSTALLED_APPS[0:0] = ADD_INSTALLED_APPS
而在enabled中:
_10_project.py, _20_admin.py等等中有:
ADD_INSTALLED_APPS = ['openstack_dashboard.dashboards.project']
ADD_INSTALLED_APPS = [
'openstack_dashboard.dashboards.admin',
]
....
到这里各个dashboard作为app被注册(可以细究update_dashboards函数)。
在各dashboard中,例如admin下通过dashboard.py定义GroupPanel,Panel(check以下code就能明白)
点击子Panel时,在openstack_dashboard/dashboards/xxx/GroupPanel/Panel,中的urls.py,不同url会对应到不同的view,例如:
url(r'^$', views.IndexView.as_view(), name='index'),
http://ip_address:9000/project/instances/对应上述的url,对应
class IndexView(tables.DataTableView):
table_class = project_tables.InstancesTable
template_name = 'project/instances/index.html'
page_title = _("Instances")
def has_more_data(self, table):
return self._more
def get_data(self):
marker = self.request.GET.get(
project_tables.InstancesTable._meta.pagination_param, None)
search_opts = self.get_filters({'marker': marker, 'paginate': True})
# Gather our instances
try:
instances, self._more = api.nova.server_list(
self.request,
search_opts=search_opts)
except Exception:
self._more = False
......
这里我们知道了使用的template,知道了数据来源(api.nova.server_list, 使用novaclient call)
从前台到后台连起来了。
事实上panel的显示,用户可以看见的不同dashboard跟keystone有关,http://www.cnblogs.com/yuxc/p/3419102.html有所提及,可以深究
本文深入解析了OpenStack Horizon控制面板的结构与实现机制,包括其三层设计:Dashboard、PanelGroup和Panel,以及如何通过Django应用程序进行管理和组织。
6864

被折叠的 条评论
为什么被折叠?



