from nova ironic to horizon(2)

本文深入解析了OpenStack Horizon控制面板的结构与实现机制,包括其三层设计:Dashboard、PanelGroup和Panel,以及如何通过Django应用程序进行管理和组织。

进入horizon界面,结构不复杂,核心的东西在页面左右两边,左侧像是导航,右侧是具体内容,不同用户登陆后,左侧看到的是不一样的,admin和普通user是有区别的,

在于能否操作admin的动作。

引用自:http://www.cnblogs.com/yuxc/p/3419102.html

Horizon这套面板的设计分成三层:Dashboard → PanelGroup → Panel

Horizon中现有的dashboard有4个:

  1. project 普通用户登陆后看到的项目面板
  2. admin 管理登陆后可见,左侧的管理员面板
  3. settings 右上角的设置面板,里面可设置语言,时区,更改密码
  4. 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.

事实上打开openstack的源码在horizon/openstack_dashboard/dashboards/ 目录下,一共有五个目录,project,admin, router, setting, idetity, 点击各个目录,一下子就能明白,

这里的目录结构和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有所提及,可以深究


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值