openstack horizon 学习(2) navigation、dashboard、panels

本章的主要内容是如何用horizon的navigation结构添加一个应用的面板。

 

 

Horizon中提供了两种为应用添加panel的方法,一种是通过Pluggable Settings的方式,另一种是Django’s INSTALLED_APPS setting 方式。方式一是Horizon在Django框架基础上自主开发的方式,openstack中horizon的指导文档推荐使用方法一。而两种方式从功能上是等效的。本章重点分析pluggable setting这种方式,来看看它有多么cool吧。

当同时使用两种方式(setting dashboard和pluggable dashboard)时,setting dashboard的优先级是大于pluggable dashboard的,这个细节了解即可。为了避免不必要的麻烦,尽量不要两种方式混用。

先写一句总结的话,无论是添加一个Dashboard还是Panelgroup还是Panel。两步走:1.配置 2.根据配置填写相应的实例

然后不要急,在写如何添加dashboard和panel之前,先看看它们之间的关系:

panelgroup和panel一定是在某个dashboard下的,也就是创建一个panelgroup和panel必须指定一个已经存在了的dashboard。而panel指定panelgroup这个过程是不必须的,也就是panel可以直接在某个dashboard下。

接下来看添加dashboard、panelgroup、panel的共同步骤“配置”是什么。

引用官方文档中的说明:

Horizon allows dashboards, panels and panel groups to be added without modifying the default settings. Pluggable settings are a mechanism to allow settings to be stored in separate files. Those files are read at startup and used to modify the default settings.

The default location for the dashboard configuration files is openstack_dashboard/enabled, with another directory, openstack_dashboard/local/enabled for local overrides. Both sets of files will be loaded, but the settings in openstack_dashboard/local/enabled will overwrite the default ones. The settings are applied in alphabetical order of the filenames. If the same dashboard has configuration files in enabled andlocal/enabled, the local name will be used. Note, that since names of python modules can’t start with a digit, the files are usually named with a leading underscore and a number, so that you can control their order easily.

简单解释一下就是:每当开发者想要自主添加一个一个dashboard或panel时,可以不修改openstack_dashboard这个django应用的settings文件。代替之的操作是在openstack_dashboard下的enabled或openstack_dashboard/local/enable下写一个相应的python文件,告诉horizon在渲染dashboard时,请把这两个目录下添加的dashboard和panel也加进去。其中openstack_dashboard/local/enabled是对openstack_dashboard/enabled的一个override,如果在两个目录中配置了相同的dashboard,local下注册的dashboard是最终生效的。enable目录下的dashboard和panel是按照注册时填写的python文件的文件名的字典序添加的,所以当你看到enable下的目录python文件开头是_10_*.py _20_*.py,就应该不感到奇怪了吧,它完全是为了易于控制文件名的字典序而这样命名的。

接下来先看如何添加一个dashboard:

步骤1 “配置”:

 在openstack_dashboard/local/enable 创建一个python文件,如_04_test_dashboard.py:

1 # The slug of the dashboard to be added to HORIZON['dashboards']. Required.
2 DASHBOARD = 'test_dashboard'
3 
4 # A list of applications to be added to INSTALLED_APPS.
5 ADD_INSTALLED_APPS = [
6 'openstack_dashboard.dashboards.test',
7 ]

分析一下,首先需要填写'DASHBOARD'这个属性,它实际上是你想要添加的dashboard的slug。啰嗦一句,slug可以把它看成是key,dashboard的slug就是相当于标识了这个dashboard,而它和dashboar具体在浏览器中显示的名字不是一码事。然后另一个比较重要的就是'ADD_INSTALLED_APPS'这个列表,这个列表的作用是指定这个dashboard下的application的目录列表。为什么dashboard会跟APP联系?因为在horizon看来,一个panel和一个APP是对应的,而dashboard下是一组panel的集合,所以指定这个list是理所当然的了。APP_INSTALLED_APPS好像可以不必须指定,而博主目前不知道什么情况下不需要指定ADD_INSTALLED_APPS,所以这个基本也是必须的。

可能看到这里,有人会好奇究竟这个配置文件可以配置哪些内容。我暂且罗列一些可以配置的属性,而不具体一一分析。因为这样的属性实在太多了,多数暂时也用不到。本章旨在解决主要的问题——dashboard和panel的添加原理。如果对这些配置属性感兴趣,可以去horizon的开发主页去查。

following keys can be used in any pluggable settings file:

 1 ADD_EXCEPTIONS
 2 A dictionary of exception classes to be added to HORIZON['exceptions'].
 3 
 4 ADD_INSTALLED_APPS
 5 A list of applications to be prepended to INSTALLED_APPS. This is needed to expose static files from a plugin.
 6 
 7 ADD_ANGULAR_MODULES
 8 A list of AngularJS modules to be loaded when Angular bootstraps. These modules are added as dependencies on the root Horizon application hz.
 9 
10 ADD_JS_FILES
11 A list of javascript source files to be included in the compressed set of files that are loaded on every page. This is needed for AngularJS modules that are referenced in ADD_ANGULAR_MODULES and therefore need to be included in every page.
12 
13 ADD_JS_SPEC_FILES
14 A list of javascript spec files to include for integration with the Jasmine spec runner. Jasmine is a behavior-driven development framework for testing JavaScript code.
15 
16 ADD_SCSS_FILES
17 A list of scss files to be included in the compressed set of files that are loaded on every page. We recommend one scss file per dashboard, use @import if you need to include additional scss files for panels.
18 
19 AUTO_DISCOVER_STATIC_FILES
20 If set to True, JavaScript files and static angular html template files will be automatically discovered from the static folder in each apps listed in ADD_INSTALLED_APPS.
21 
22 JavaScript source files will be ordered based on naming convention: files with extension .module.js listed first, followed by other JavaScript source files.
23 
24 JavaScript files for testing will also be ordered based on naming convention: files with extension .mock.js listed first, followed by files with extension .spec.js.
25 
26 If ADD_JS_FILES and/or ADD_JS_SPEC_FILES are also specified, files manually listed there will be appended to the auto-discovered files.
27 
28 DISABLED
29 If set to True, this settings file will not be added to the settings.
30 
31 UPDATE_HORIZON_CONFIG
32 A dictionary of values that will replace the values in HORIZON_CONFIG.
values

 仅写配置是不够的,因为horizon在渲染页面的时候要有一个dashboard实例才能够进行渲染。

步骤二 “填写实例”

先在openstack_dashboard/dashboards下新建一个名叫test的module,因为上面ADD_INSTALLED_APPS指定的路径是test。dashboard和panelgroup的实例一般是写在dashboard module下的dashboard.py这个文件下,于是/openstack_dashboard/test_dashboard/dashboard.py:

 1 from django.utils.translation import ugettext_lazy as _
 2 import horizon
 3 
 4 class Test(horizon.Dashboard):
 5     name = _("TestDashboard")
 6     slug = "test_dashboard"
 7     panels = (TestPanels,)
 8     default_panel = 'test'
 9     permissions = ('openstack.roles.admin',)
10 
11 horizon.register(Test)

分析一下,dashboard实例实际上就是horizon.Dashboard的一个子类,name属性即界面上显示这个dashboard实际的名称。slug属性前面介绍过,实例中的slug与配置文件中的slug是对应的,所以一定要注意保持一致。panels元组的意义比较明显,值得注意的是这里面的元素可以是panlegroup也可以是panel,TestPanel是一个panelgroup,具体定义见后文。default_panel意义也很明显,它需要指明一个panel的slug。permissions是权限控制,只有以admin身份登录才可以看到这个dashboard。permissions不是必须指明的。最后一步调用register实例化。

 

panelgroup的添加和dashboard是类似的,代码如下:

1.配置

/openstack_dashboard/local/enable/_05_test_panel_group.py

1 PANEL_GROUP = 'test_panel_group'
2 PANEL_GROUP_NAME = 'Test Panelgroup'
3 PANEL_GROUP_DASHBOARD = 'test_dashboard'

'PANEL_GROUP_DASHBOARD'是指定panelgroup是在哪个dashboard下的,属性的值应该是某个dashboard的slug

2.根据配置写实例

/openstack_dashboard/dashboards/test/dashboard.py

1 class TestPanels(horizon.PanelGroup):
2     slug = "test_panel_group"
3     name = _("TestPanelGroup")
4     panels = ('test',)

 

有了上面的基础,panel的添加也是类似的,不过panel逻辑上就是一个具体的应用。所以第二步的实例一般是写在具体应用目录的panel.py这个文件中的,先在/openstack_dashboard/dashboards/test下新建一个module,test1。

1.配置

/openstack_dashboard/local/enable/_06_test_panel.py

1 PANEL = 'test'
2 PANEL_DASHBOARD = 'test_dashboard'
3 PANEL_GROUP = 'test_panel_group'
4 ADD_PANEL = 'openstack_dashboard.dashboards.test.test1.panel.Test'

panel的配置跟dashboard和panelgroup不同,需要指定ADD_PANEL这个属性,这个属性的作用是指定第二步中的需要被实例的类名。如果不指明ADD_PANEL则不能正确添加这个panel。这里可能有人疑问为什么dashboard和panelgroup可以通过slug的对应关系找到实例的类,而panel不能效法这么去做。这个问题我也是疑问的,想要搞明白还需再往深层看,问题暂时先放这里,欢迎大牛指点。

2.根据配置写实例

/openstack_dashboard/dashboards/test/test1/panel.py

 1 from django.utils.translation import ugettext_lazy as _  # noqa
 2 import horizon
 3 from openstack_dashboard.dashboards.admin import dashboard
 4 
 5 class Test(horizon.Panel):
 6     name = _("Test")
 7     slug = 'test'
 8     permissions = ('openstack.roles.admin',)
 9 
10 dashboard.Admin.register(Test)

最后随便在test1这个module下的urls.py和views.py随便写点视图层代码,更复杂的视图层逻辑将在后面章节讲解。

 

最后我们来启动server看一下效果:

在最最后,博主做了个实验,分析了一下Pluggable Settings这种添加dashboard和panel方式到底做了什么。

首先,在server启动前,找到openstack_dashboard里的settings.py里的INSTALLED_APPS列表,看看它都有什么:

然后在server启动后,写了一个视图函数display_view:

 1 from django import http
 2 from openstack_dashboard import settings
 3 
 4 def display_view(request):
 5     apps = settings.INSTALLED_APPS
 6     apps.sort()
 7     html = []
 8     for i in apps:
 9         html.append('<tr><td>APP:</td><td>%s</td></tr>' % i)
10     return http.HttpResponse('<head>print INSTALLED_APPS:</head> <table>%s</table>' % '\n'.join(html))

打印下目前的INSTALLED_APPS变成了什么:

INSTALLED_APPS列表在server启动后,界面渲染前,添加了一些新的项。而这些项与horizon中的dashboard是一一对应的,刚刚写的test也里面。所以稍加分析和思考不难知道,其实Pluggable Settings这种方式是在INSTALLED_APPS读取前先读取openstack_dashboard/enable和openstack_dashboard/local/enable中的.py配置文件,解析这些配置,然后动态添加到INSTALLED_APPS中,再渲染界面。它的实质与直接修改配置文件中的INSTALLED_APPS本质并无区别。

但不觉得可扩展性提高了么?加入这么一个看似简单的机制,所有APP变得像零件一样变得可拔插。不觉得有些函数式编程的味道么,即便是修改或删除dashboard或panel,也可以不修改代码,而是定义一个新的配置。扯多了……

本章讲的很粗略,很多内容写的并不完善,可能也有很多错误在里面,通过以后的学习再慢慢细化和改正。

转载于:https://www.cnblogs.com/mcflurry/p/4625674.html

OpenStack(kilo)界面dashboard的二次开发(一)-增加Panel 进入openstack这个领域大约有一年了,由于某些原因,对openstack各方面都有些了解,不过对openstack也就感觉刚刚入门而已。这期间对openstack的界面进行过一些定制,现在进行个梳理总结。博文中如有说得不对的地方请大家谅解,同时欢迎大家指正,共同提升。 基本认识 增加Panel 基本认识 openstackdashboard是允许用户管理open... 阅读详情

相关推荐

Sentaurus TCAD 实战指南:几何、掺杂与物理模型对Ion/Ioff的协同调控

本文详细介绍了Sentaurus TCAD在器件仿真中的实战应用,重点解析了Ion(开态电流)与Ioff(关态电流)的协同优化方法。通过几何结构设计、掺杂工程和物理模型选择三大要素的精细调整,实现器件性能的显著提升。文章结合28nm和7nm工艺案例,展示了如何平衡Ion与Ioff的矛盾关系,为TCAD工程师提供实用指导。

weixin_29159711的博客 113

Grafana表格配置以及Panel/Dashboard复制粘贴

Grafana是一个可视化工具,主要用于监控报表的可视化,支持各种表格以及插件灵活拓展多种数据源,更多参见:Grafana Grafana优点:1:Grafana支持更多插件扩展数据源;2:支持监控报警;3:丰富的可视化表格等。使用大概如下: 创建DashBoard 基于上面创建的Dashbord创建panel,一个panel就是一个可视化面板,在panel里面可以选择多种表格,例如:...

吟啸徐行 1万+

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流)

本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。

weixin_29185199的博客 305

Horizon dashboard的基本组成模块

Horizon可分为3层,由上到下分别为DashboardPanelGroup → Panel。从代码结构上看可以发现最上层是dashboards,它包含了4个主要的dashboard:project 普通用户登陆后看到的项目面板;admin 管理登陆后可见,左侧的管理员面板;settings 右上角的设置面板,里面可设置语言,时区,更改密码;router(配置文件中将profile_supp

赤焰军 4539

【Grafana】【四】DashboardPanel

设置Panel的title和description。Panel可以在Dashboard中改变大小和布局。填写Dashboard名字和Folder,保存。默认创建一个Graph类型的Panel。进入Manage页面,也可以看到。可以通过Plugins添加其他的。进入Home页面,可以看到。点击Apply应用当前设置。将Dashboard移入。点击该Dashboard。进入Edit Panel。对特定的Graph的设置。添加另外一个Panel。创建一个Folder。

鸟人的博客 2091

4.Grafana入门系列 —— DashboardPanel

如果保存退出,进入Home页面会看到刚刚创建的Dashboard。 Visualizations默认值是:Time series。 可以在Dashboard页面拖动和改变Panel页面大小,随意调整。 可以通过对Panel实现Edit操作进行具体项的修改。

ADbyCool的博客 740

Openstack Horizon 可插拔Panels 和 Groups

一、介绍 Horizon允许添加dashboards(仪表板)panels(面板)panel groups(面板组),而无需修改默认设置。 可插入设置是一种允许将设置存储在单独文件中的机制。 这些文件在启动时读取并用于修改默认设置。该博文基于OpenStack rocky版本。 dashboards(仪表板)配置文件的默认位置是openstack_dashboard/enabled,另一个目录...

JP.Zhang 1052

Spring Boot Admin DashboardPanel)面板监控管理内容详解

导航栏 WallBoard(大屏展示) Insights Details Metrics Environment(系统环境) Configuration Properties(配置文件) Scheduled Task(定时任务) Loggers(日志级别管理) JVM(管理JVM中的相关数据) JMX Threads(查看线程情况) Heap Dump(下载Dump文件) Web(Web相关数据) Mappings(后台接口) Http Traces(Http请求追踪) Audit Log(审计日志)

iioSnail的博客 2605

使用Horizon构建Dashboard

一、写在前面 继上篇博文,在这篇博文中举例说明扩展一个dashboard 以及 panel。类似这样的博文在网上较多,这里仅仅是回忆下,好久没有跟进OpenStack Horizon版本的代码,基于目前OpenStack rocky版本。 邮箱地址:jpzhang.ht@gmail.com 个人博客:https://jianpengzhang.github.io/ CSDN博客:http://bl...

JP.Zhang 2505

OpenStack(kilo)界面dashboard的二次开发(二)-增加PanelGroup

增加Panelgroup 上一博文开了一个头,简单的总结了下代码结构及Panel的增加,这一篇对Panelgroup的增加做一个详细的总结。 增加Panelgroup Panelgroup字面意思很好理解就是panel组,在openstack的界面中就是多个panel的集合。上一次的代码分析中其实已经有了对PanelGroup的简单介绍,这次就看看如何增加panelgr...

塔尖草的博客 3742

扩展OpenStack Dashboard简明教程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34106122的博客 687

浅谈Vue个性化dashBoard 布局

dashBoard布局在管理系统使用比较多;使用自己喜欢的方式进行自定义布局使用npm 安装npm install vue-grid-layout全局使用import vueGridLayout from 'vue-grid-layout'; Vue.use(vueGridLayout);局部使用var GridLayout = vueGridLayout.GridLayout; var GridI

Bloxed_shangyc的博客 7964

OpenStack Mitaka Horizon 主题开发

一、写在前面这篇文章主要介绍了OpenStack Mitaka Horizo主题的开发。这里只是说明horiozn主题包的开发逻辑,不具体阐述css、js、html文件的开发, 仅仅是说明horizon主题开发的方式,因为时间仓促以及个人理解有限,固有错误的地方请指出,后续将会不定期的完善,谢谢! 如果转载,请保留作者信息。 邮箱地址:jpzhang.ht@gmail.com 主题下载地址

JP.Zhang 1万+

Winform DevExpress控件库(三) 使用NavBarControl控件定制导航栏

NavBarControl控件:主要作用是制作包含多个选项组并且每个组里包含多个子选项的导航栏;位于 工具箱 -> Navigation & Layout(导航栏与布局类控件) 目录下;在工具箱输入名称NavBarControl检索,然后直接拖拽到面板上便可使用,最好是放在一个子容器里(比如PanelControl);NavBarControl控件常用属性描述:(选中NavBarControl控件

神码编程 5万+

AI漫剧分镜衔接连续性检测:基于光流的镜头运动一致性实践

本文提出基于光流法的AI漫剧分镜衔接一致性检测方案,通过分析相邻分镜间运动方向与速度变化,自动识别方向冲突、速度突变等连贯性问题。采用OpenCV的Farneback算法实现高效光流计算,结合可视化与批量检测流程,单集检测仅需约0.6秒,可嵌入生成流水线。对自建系统有技术指导,也推荐使用知漫剧(hy.jiaxunai.cn)一体化平台快速验证,支持国内直访,现提供免费体验额度。

2601_96218592的博客 213

Python typing库 助力 大型项目

为了解决动态类型的弊端,Python 官方推出了 typing 标准库

码刀攻城 257

用 DeepDraw 几何引擎开发建筑设计软件(十):推挤工具

SketchUp国产平替,源代码分享,DeepDraw引擎是 深度智绘科技(上海)有限公司 开发的3D建模引擎,完美替代SketchUp,官网https://www.archieast.com

weixin_42377388的博客 314

解决 Activiti UEL 表达式解析异常 TreeBuilderException

在Activiti工作流中,排他/包容网关条件表达式因嵌套${}导致UEL解析失败,抛出TreeBuilderException。根源在于UEL语法禁止表达式内再次使用${},且需避免XML特殊字符干扰。解决方案包括:移除内部定界符、使用CDATA包裹表达式、确保返回布尔值。建议通过正则扫描、IDE插件校验、编码规范(如单引号字符串、复杂逻辑外置)及测试验证,从源头预防此类问题。

小李同学的博客 507

【迅投 QMT】QMT如何实现布林带突破策略?Python指标与交易信号示例

本文介绍了 QMT 使用 Pandas 计算布林带,并判断价格突破上轨或下轨交易信号的方法。

Thom580的博客 77

Python进阶探索17 - Python中的深拷贝与浅拷贝

根据Python官方文档的定义,浅层与深层复制的区别仅与复合对象相关浅拷贝(Shallow Copy):构造一个新的复合对象,然后(在尽可能的范围内)将原始对象中找到的对象的引用插入其中。深拷贝(Deep Copy):构造一个新的复合对象,然后,递归地将在原始对象里找到的对象的副本插入其中。Python标准库copycopy.copy(x) # 返回 x 的浅拷贝copy.deepcopy(x) # 返回 x 的深拷贝copy在企业项目中,我们经常需要拷贝自定义类的实例。默认情况下,和。

【javatoai17819112191】→Java && python && AI Agent工程师 169

C++/Python联合编程

本文以 Mantissa 数学库为例,深度剖析 C++ 与 Python 联合编程全链路:基于 nanobind 实现 C++ 数值内核(Eigen 驱动)与 Python 交互的零拷贝互操作,通过 NumPy ndarray 对接内存布局,利用 CMake + scikit-build-core + Conan 构建打包,实现 eig_sym 与 matrix_sqrt 算子的高效绑定与分发。重点涵盖数据模型契约、内存所有权管理、异常翻译及运行时 DLL 定位,揭示“快算+易用”协同工程的核心实践。

m0_37772174的博客 502
上一篇: openstack horizon 学习(1) 总览
下一篇: URAL 1003,1004
didang2739
博客等级 码龄10年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值