Horizon学习笔记

云计算Openstack Horizon OpenStack是一个开源的云计算平台,提供了构建和管理云计算环境所需的软件工具。而Horizon则是OpenStack的一个关键组件,它是基于Web的用户界面,为用户提供了一种直观、便捷的方式来管理和使用OpenStack资源。 阅读详情

Horizon吊炸天!之前,一直认为horizon只不过是一个面板,没啥好研究的,而且我对django又不是很熟,一直懒的看horizon,今晚硬着头皮看了下去,没想到,越看越有劲,眼睛差点跟不上我的思路了!我觉得horizon牛不在对django的运用,而是对事物高度的抽象能力:D


程序的入口点在horizon/openstack_dashboard/urls.py中:

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


然后由Horizon这个单例的Site对象,开始加载urls,自动发现并注册dashboard,然后对每一个dashboard,再自动发现并注册panel:

Horizon._lazy_url

程序的入口看起来那么平常不过,进入之后发现这大千世界,让人惊叹不已!!!




可以在horizon/base/_urls()方法中,一窥全貌:

```
    def _urls(self):  
        """Constructs the URLconf for Horizon from registered Dashboards."""
        urlpatterns = self._get_default_urlpatterns()
        self._autodiscover() # 自动发现并注册dashboard,其实就是从INSTALL_APPS中加载dashboard
        
        # Discover each dashboard's panels.
        for dash in self._registry.values():
            dash._autodiscover()  # 自动发现并注册panel,这个是根据路径来发现的
            
        # Allow for override modules
        if self._conf.get("customization_module", None):
            customization_module = self._conf["customization_module"]
            bits = customization_module.split('.')
            mod_name = bits.pop()
            package = '.'.join(bits)
            mod = import_module(package)
            try: 
                before_import_registry = copy.copy(self._registry)
                import_module('%s.%s' % (package, mod_name))
            except Exception:
                self._registry = before_import_registry
                if module_has_submodule(mod, mod_name):
                    raise
                 
        # Compile the dynamic urlconf.
        for dash in self._registry.values():
            urlpatterns += patterns('',
                    url(r'^%s/' % dash.slug, include(dash._decorated_urls)))
                    
        # Return the three arguments to django.conf.urls.defaults.include
        return urlpatterns, self.namespace, self.slug
```

默认的,一个HorizonSite中有三个Dashboard: project, admin, setting,在HorizonSite的autodiscover过程中,注册在HorizonSite中:
```
(Pdb) pp self._registry
{<class 'openstack_dashboard.dashboards.project.dashboard.Project'>: <Dashboard: project>,
 <class 'openstack_dashboard.dashboards.admin.dashboard.Admin'>: <Dashboard: admin>,
 <class 'openstack_dashboard.dashboards.settings.dashboard.Settings'>: <Dashboard: settings>}
```

然后再对每一个Dashboard进行autodiscover,将Panel注册在Dashboard中,从上面的类图中可以看到Dashboard和HorizonSite都是Registry的子类,它们都具有**注册**的能力:
```
(Pdb) pp self._registry.values()[0]._registry
{<class 'openstack_dashboard.dashboards.project.overview.panel.Overview'>: <Panel: overview>,
 <class 'openstack_dashboard.dashboards.project.containers.panel.Containers'>: <Panel: containers>,
 <class 'openstack_dashboard.dashboards.project.instances.panel.Instances'>: <Panel: instances>,
 <class 'openstack_dashboard.dashboards.project.network_topology.panel.NetworkTopology'>: <Panel: network_topology>,
 <class 'openstack_dashboard.dashboards.project.images_and_snapshots.panel.ImagesAndSnapshots'>: <Panel: images_and_snapshots>,
 <class 'openstack_dashboard.dashboards.project.networks.panel.Networks'>: <Panel: networks>,
 <class 'openstack_dashboard.dashboards.project.access_and_security.panel.AccessAndSecurity'>: <Panel: access_and_security>,
 <class 'openstack_dashboard.dashboards.project.firewalls.panel.Firewall'>: <Panel: firewalls>,
 <class 'openstack_dashboard.dashboards.project.volumes.panel.Volumes'>: <Panel: volumes>,
 <class 'openstack_dashboard.dashboards.project.routers.panel.Routers'>: <Panel: routers>,
 <class 'openstack_dashboard.dashboards.project.loadbalancers.panel.LoadBalancer'>: <Panel: loadbalancers>,
 <class 'openstack_dashboard.dashboards.project.vpn.panel.VPN'>: <Panel: vpn>,
 <class 'openstack_dashboard.dashboards.project.database_backups.panel.Backups'>: <Panel: database_backups>,
 <class 'openstack_dashboard.dashboards.project.stacks.panel.Stacks'>: <Panel: stacks>,
 <class 'openstack_dashboard.dashboards.project.databases.panel.Databases'>: <Panel: databases>}
```

在注册每一个Panel的时候,还会将每一个Panel的template路径,保存到loaders模块中:
```
(Pdb) pp loaders.panel_template_dirs
{'admin/defaults': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/defaults/templates',
 'admin/flavors': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/flavors/templates',
 'admin/hypervisors': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/hypervisors/templates',
 'admin/images': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/images/templates',
 'admin/info': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/info/templates',
 'admin/instances': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/instances/templates',
 'admin/metering': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/metering/templates',
 'admin/networks': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/networks/templates',
 'admin/overview': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/overview/templates',
 'admin/projects': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/projects/templates',
 'admin/routers': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/routers/templates',
 'admin/users': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/users/templates',
 'admin/volumes': '/opt/stack/horizon/openstack_dashboard/dashboards/admin/volumes/templates',
 'project/access_and_security': '/opt/stack/horizon/openstack_dashboard/dashboards/project/access_and_security/templates',
 'project/containers': '/opt/stack/horizon/openstack_dashboard/dashboards/project/containers/templates',
 'project/database_backups': '/opt/stack/horizon/openstack_dashboard/dashboards/project/database_backups/templates',
 'project/databases': '/opt/stack/horizon/openstack_dashboard/dashboards/project/databases/templates',
 'project/firewalls': '/opt/stack/horizon/openstack_dashboard/dashboards/project/firewalls/templates',
 'project/images_and_snapshots': '/opt/stack/horizon/openstack_dashboard/dashboards/project/images_and_snapshots/templates',
 'project/instances': '/opt/stack/horizon/openstack_dashboard/dashboards/project/instances/templates',
 'project/loadbalancers': '/opt/stack/horizon/openstack_dashboard/dashboards/project/loadbalancers/templates',
 'project/network_topology': '/opt/stack/horizon/openstack_dashboard/dashboards/project/network_topology/templates',
 'project/networks': '/opt/stack/horizon/openstack_dashboard/dashboards/project/networks/templates',
 'project/overview': '/opt/stack/horizon/openstack_dashboard/dashboards/project/overview/templates',
 'project/routers': '/opt/stack/horizon/openstack_dashboard/dashboards/project/routers/templates',
 'project/stacks': '/opt/stack/horizon/openstack_dashboard/dashboards/project/stacks/templates',
 'project/volumes': '/opt/stack/horizon/openstack_dashboard/dashboards/project/volumes/templates',
 'project/vpn': '/opt/stack/horizon/openstack_dashboard/dashboards/project/vpn/templates',
 'settings/password': '/opt/stack/horizon/openstack_dashboard/dashboards/settings/password/templates',
 'settings/user': '/opt/stack/horizon/openstack_dashboard/dashboards/settings/user/templates'}
```

接下来就是最关键的urlpatterns,整个horizon所有的路径,并不是写到一个url.py文件中的,而是分散在每一个dashboard, 每一个panel中,有层级的关系。首先找dashboard的url,到每一个dashboard,再找每一个panel的url,所以url的路径关系为: ./dashboard/panel
urlpatterns in site:
```
(Pdb) pp urlpatterns
[<RegexURLPattern user_home ^home/$>,
 <RegexURLPattern jsi18n ^i18n/js/(?P<packages>\S+?)/$>,
 <RegexURLPattern set_language ^i18n/setlang/$>,
 <RegexURLResolver <module 'django.conf.urls.i18n' from '/usr/local/lib/python2.7/dist-packages/django/conf/urls/i18n.pyc'> (None:None) ^i18n/>,
 <RegexURLPattern qunit_tests ^qunit/$>,
 <RegexURLResolver <RegexURLResolver list> (admin:admin) ^admin/>,
 <RegexURLResolver <RegexURLResolver list> (settings:settings) ^settings/>,
 <RegexURLResolver <RegexURLResolver list> (project:project) ^project/>]
```


urlpatterns in dashboard
```
(Pdb) pp urlpatterns[-1].urlconf_name
[<RegexURLResolver <RegexURLPattern list> (instances:instances) ^instances/>,
 <RegexURLResolver <RegexURLPattern list> (routers:routers) ^routers/>,
 <RegexURLResolver <RegexURLPattern list> (databases:databases) ^databases/>,
 <RegexURLResolver <RegexURLPattern list> (firewalls:firewalls) ^firewalls/>,
 <RegexURLResolver <RegexURLPattern list> (containers:containers) ^containers/>,
 <RegexURLResolver <RegexURLPattern list> (access_and_security:access_and_security) ^access_and_security/>,
 <RegexURLResolver <RegexURLPattern list> (network_topology:network_topology) ^network_topology/>,
 <RegexURLResolver <RegexURLPattern list> (database_backups:database_backups) ^database_backups/>,
 <RegexURLResolver <RegexURLPattern list> (loadbalancers:loadbalancers) ^loadbalancers/>,
 <RegexURLResolver <RegexURLPattern list> (vpn:vpn) ^vpn/>,
 <RegexURLResolver <RegexURLPattern list> (volumes:volumes) ^volumes/>,
 <RegexURLResolver <RegexURLPattern list> (stacks:stacks) ^stacks/>,
 <RegexURLResolver <RegexURLPattern list> (networks:networks) ^networks/>,
 <RegexURLResolver <RegexURLPattern list> (images_and_snapshots:images_and_snapshots) ^images_and_snapshots/>,
 <RegexURLResolver <RegexURLPattern list> (overview:overview) >]
```


urlpatterns in panel
```
(Pdb) pp urlpatterns[-1].urlconf_name[-1].urlconf_name
[<RegexURLPattern index ^$>, <RegexURLPattern warning ^warning$>]
```


Openstack架构构建及详解(6)--Dashboard组件,java单例模式面试题 如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了《Java中高级核心知识全面解析》[外链图片转存中…(img-nkEJSYYa-1711151280226)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。 阅读详情

相关推荐

VMware Horizon 7 安装部署教程

一.VMware Horizon 7介绍通过Horizon,IT部门可以在数据中心部署虚拟化环境,并将这些环境交付给员工。最终用户可以获得熟悉的个性化环境,并且可以在企业或家庭网络中的任何地方访问此环境。将桌面数据全部至于数据中心,管理员可以进行集中式管理,同时还能提高效率、增强安全性、降低成本(用户可以使用落后的PC或瘦客户机访问虚拟桌面环境)。二.VMware H...

weixin_33938733的博客 7336

Horizon 源码阅读(一)—— Horizon 整体介绍

一、写在前面        这篇文章主要介绍一下Openstack Horizon — juno项目的整体情况,关于这方面的内容网上已经有很多相关的介绍,我在这里只作为一个知识的搬运工,把一些分散的内容加上个人的理解形成一篇介绍性博文,由于能力和时间有限,错误之处在所难免,欢迎指正! 如果转载,请保留作者信息。 邮箱地址:jpzhang.ht@gmail.com 二、Horizon

JP.Zhang 7122

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

horizon服务

一、horizon 介绍: 理解horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , 管理员可以使用通过 WEB UI 对 Openstack 整体云环境进行管理 , 并可直观看到各种操作结果与运行状态。 DashBoard 与其他组件的关系 登陆 Dashboard...

weixin_34259232的博客 1087

horizon— Web管理界面

Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , 管理员可以使用通过 WEB UI 对 Openstack 整体云环境进行管理 , 并可直观看到各种操作结果与运行状态。 登陆 Dashboard 界面 启动客户端浏览器,于地址栏输入:http://Horizone_...

Sky_fantasy_的博客 2929

horizon源码

openstack中关于horizon源码

horizon学习小结

1、写在前面                 工作中

晓飞趋势 2210

SRAM compiler中 Number of banks 设置

的值时,需要考虑应用的性能需求、功耗要求和面积限制。设计者应根据具体的应用场景选择合适的bank数量,以优化整体系统性能。bank是一种用于分离存储器访问的设计结构,允许同时对不同的存储区域进行读写操作,从而提高存储器的并发访问性能。选项用于指定 SRAM 存储器的 并发存储区域。在 SRAM 编译器中,

hzmscut的博客 1872

【亲测免费】 Horizon:一站式云原生应用生命周期管理平台

Horizon:一站式云原生应用生命周期管理平台 项目介绍 Horizon 是一个基于 Kubernetes 的云原生应用生命周期管理平台。它旨在提供一套完整且高效的工具集,帮助开发者和运维团队轻松地部署、管理和迭代应用。通过集成 CI/CD 流水线、应用模板、以及对多环境的支持,Horizon 实现了从代码到生产环境的一键式部署,大大简化了企业级应用开发的复杂度。 项目快速启动 环境准备 确保...

gitblog_00908的博客 1125

金融数据自动化:从同花顺API到Excel的智能转换之旅

本文详细介绍了如何利用同花顺API实现金融数据自动化处理,并将其智能转换为Excel格式的全流程。通过Python编程和Excel高级技巧,读者可以掌握从数据获取、清洗到输出的完整解决方案,大幅提升金融数据分析的效率和准确性。文章特别强调了同花顺API的使用技巧和Excel自动化输出的最佳实践。

sql99的博客 462

Glue)《Multi-omics single-cell data integration and regulatory inference with graph-linked embedding》

论文引入GLUE框架,通过知识引导图(guidance graph)显式建模跨层调控交互,桥接特征空间,实现准确、鲁棒、可扩展的整合。近年来,单细胞测序技术(如scATAC-seq用于染色质可及性、snmC-seq用于DNA甲基化、scRNA-seq用于转录组)允许同时探测多个组学层,揭示细胞异质性和调控机制。GLUE优于现有方法:桥接特征空间,避免信息丢失,支持多组学和调控推断。用于整合未配对的单细胞多组学数据(如scRNA-seq、scATAC-seq和snmC-seq),并同时进行调控交互推断。

m0_58293236的博客 1152

Openstack学习笔记(十二)-Horizon学习笔记(二)

Horizon Is Easy, Horizon Is Complex如果要用一句话来概括Openstack Dashboard项目Horizon:它是一个基于django webframework开发的标准的python wsgi程序。如果要再加一句废话,它一般会运行在webserver(apache/nginx)上。Why Is It Easy?说Horizon简单,是指它的部署架构简单,就是个

Forlogenの解忧杂货铺 3625

从音频录制到智能手表:Sigma-Delta ADC是如何在低功耗场景下‘欺骗’噪声的?

本文深入解析Sigma-Delta ADC在智能穿戴设备中的低功耗高精度实现原理,重点介绍其通过过采样和噪声整形技术‘欺骗’噪声的独特方法。以TWS耳机和医疗级健康监测为例,展示该技术如何在有限功耗预算下实现专业级信号采集,为消费电子设计提供关键解决方案。

weixin_30825581的博客 389

Openstack学习笔记(十五)-Horizon源代码学习笔记(五)

horizon的源代码框架1.整体目录 2.horizon目录 3.openstack-dashboard目录 在了解了horizon代码的结构后对于整体学习代码的实现有很大帮助, 接下来要对具体的代码有个具体的认知。未完…….

Forlogenの解忧杂货铺 2483

计组实验之四路表决器

请在之前四路表决器电路实现的基础上,继续用连接线 联接CD4511,将投票为1的票数总和显示到一个 LED上,思考如何做?由于我们需要通过显示字形来直接看出有几个1,在这里,我们最多有四个1,即显示字形最多到4就行,所以我们需要将有几个1用2进制数来表示,下面给出了相关电路图。显示输入插口,按真值表(自拟)要求,逐次改变输入变量, 测量相应的输出值,验证逻辑功能, 与表3-1 进行比较, 验证所设计的逻辑电路是否符合要求。用实验结果与真值表3-1和3-2进行比对,可以得出,我们实验结果是正确的。

szyugly的博客 1万+

AutoSAR配置与实践(基础篇)3.2 BSW中的I/O架构和模块详解

车门位置传感器(Sensor SWC)输出的电流信号经过了一系列处理,如先被转化为电压信号,后又经ADC转换为数字信号,但是IoHwAb模块对上层隐藏了这一系列处理过程,并将数据直接抽象为它的输出接口,即车门开关状态接口。Sensor SWC 使用RTE接口直接从IoHwAb模块封装的车门开关状态,SWC它并不关心ECU硬件是如何实现的传感器电流采集,也不关心MCU ADC采样精度(如10/12位)IoHwAb把采集的电压抽象为开关状态,使得Sensor SWC不依赖具体的ECU硬件。

nihaoljq2010的博客 1300

Openstack学习笔记(十一)-Horizon学习笔记(一)

一、 Django1.1 Django介绍Django是一个基于Python的高效的Web开发框架,它提供了通用的Web开发模式的高度抽象;目的是为了可以简便的、快速的开发数据库驱动的网站,强调代码的复用,多个组件可以很方便的以“插件”的形式存在于整个框架中。 1.2 组成部分 1. 对象关系映射:以python类的形式定义数据模型,将模型和关系数据库连接起来,将得到一个易使用的数据库API;

Forlogenの解忧杂货铺 5778

LeRobot 入门教程(十)LIBERO 机器人终身学习评估

LIBERO是一项专注于机器人终身学习(LLDM)的基准测试平台,包含130项任务,分为5大套件(空间推理、物体操作、目标约束等)。LeRobot框架已集成LIBERO,支持单/多套件评估,并兼容SmolVLA模型。训练需使用预处理数据集(HuggingFaceVLA/libero),观测数据需符合规范(8维状态+双摄像头图像)。该平台采用MuJoCo模拟,支持无头服务器运行,旨在推动机器人持续学习算法的发展与标准化评估。

2506_90492529的博客 1663

给horizon添加分配指定floating IP的功能

适应版本:E 使用方法: 如下图所示,若要分配指定的floatingIP,可在里输入指定IP;若不要分配指定的floating IP,“IP地址”栏为空,直接点“分配IP”按钮。 修改过程 1./usr/share/pyshared/horizon/dashboards/nova/access_and_security/floating_ips/forms.py:Flo

epugv的专栏 6036

【002】C++ 语言核心:关键字深度解析与分类指南

auto:自动类型推导bool:布尔类型break:跳出循环或switch语句case:switch语句分支char:字符类型class:定义类const:常量continue:结束当前循环,开始下一次循环default:switch语句默认分支delete:删除对象do:do-while循环double:双精度浮点数类型else:if语句的否定分支enum:枚举类型explicit:显式构造函数export:导出符号extern:声明外部变量或函数。

Lion_Long的博客 1250

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Openstack学习笔记(十三)-Horizon学习笔记(三)

http://www.cnblogs.com/junneyang/p/5257360.html

Forlogenの解忧杂货铺 1503

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VMware horizon view 6.0学习笔记一

先完成如下的操作服务: 创建域控服务器; 安装数据库; 安装esxi 5.5; 安装vcenter; 安装composer server; 安装connection server;

1664

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

局部路径规划Receding Horizon Planner学习笔记(date20210503)

前提条件 进行完全局路径规划,得到全局路径G0 参数定义 基本变量的定义,其余变量在之后的内容中定义 变量名 解释 C configuration space船的位置状态空间 x 船的位置状态,x属于C Cobst 与障碍物有冲突(如重合)的状态集合,包含于C Cfree 与障碍物不冲突的状态集合,为C去除Cobst的闭集 S 传感器数据 G0 全局参考路径 adj(G0) 临近路径G0且在C附近区域的路径集合 V 由状态所组成的顶点集合(用于有向图) E 由

qq_44043868的博客 2954

Openstack学习笔记(十四)-Horizon学习笔记(四)

Horizon是OpenStack的一个子项目,用于提供一个Web前端控制台(称为Dashboard),以此来展示OpenStack的功能。通常情况下,我们都是从Horizon、Dashboard开始来了解OpenStack的。实际上,Horizon并不会为OpenStack添加任何一个新的功能,它只是使用了OpenStack部分API功能,因此,我们可以扩展Horizon的功能,扩展Dashboa

Forlogenの解忧杂货铺 1872

学习笔记_王隆杰_VMware Horizon View 6.0桌面虚拟化与应用虚拟化

VMware Horizon View 6.0桌面虚拟化与应用虚拟化(笔记) 传统桌面虚拟设想:1.无固定IP; 2.无法下次冷开机 daas 桌面即服务 SaaS 应用虚拟化:只推送应用 2.Horizon View 6和实验环境简介 view agent : view代理 即可以发布VM也可以发布物理机的远程桌面 sec server(secunty server) :安全服务器,主要负责外网用户到内网VM的IP转换 conn server(connect sever):连接服务器,负责用户和虚拟

wwwwzz的博客 1449

考研英语阅读学习笔记

丰锋的博客 1207
上一篇: Python单元测试——深入理解unittest
下一篇: Ceilometer Distributed Alarm
hackerain
博客等级 码龄16年 753粉丝 220原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值