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

本文详细介绍了OpenStackDashboard项目Horizon的易用性和复杂性,阐述了其基于Django框架的部署架构、技术栈、数据流走向以及与OpenStack服务API的交互。此外,文章探讨了Horizon的设计哲学,包括页面元素模块化、子面板可插拔等特点,并解释了如何自定义Dashboard和面板,以及如何实现实时通信特性。
部署运行你感兴趣的模型镜像

Horizon Is Easy, Horizon Is Complex

如果要用一句话来概括Openstack Dashboard项目Horizon:它是一个基于django webframework开发的标准的python wsgi程序。如果要再加一句废话,它一般会运行在webserver(apache/nginx)上。

Why Is It Easy?

说Horizon简单,是指它的部署架构简单,就是个单纯的基于django的网站,后台甚至没有使用数据库。不像Swift,Nova这些项目,有非常多的组件(xxx-server,xxx-api…),理清楚各个组件之间的关系,数据流的走向都要费一番功夫。Horizon用到的技术也比较传统,没有异步非阻塞,消息队列,websocket这些比较时髦的东西(目前没有),前端也只是bootstrap+jquery+less,没有什么很前卫的东西。

用户从登陆到看到虚拟机列表的这个过程的数据流走向:

Why Is It Complex?
Horizon的复杂性分成两方面看:

Horizon需要和几乎所有的OpenStack service api打交道, 而且各个服务可能就还有多个api版本,api多版本的兼容不是都能在client里完成的(比如Keystone),Horizon还需要针对各个api的多版本做兼容。
Horizon代码本身很复杂,抽象,利用了django相当多的高级特性,可以说把oop的概念运用到了极致,但这也为过度自定制Horizon带来了麻烦。

Design Philosophy
Horizon是基于django开发的,要说Horizon的设计,不得不说django,

Django focuses on automating as much as possible and adheres to the DRY(Don’t Repat Yourself) principle.
django的设计专注于代码的高度可重用,信奉DRY原则,一切面向对象,而Horizon可以说高度match了django的设计风格,good or bad就见仁见智了。

先说一点web开发的常识,网站程序基本有三部分组成,业务逻辑代码(Python),静态文件(js/css),模板(Python中的jinja,mako,nodejs中有jade), 用户向webserver发起请求之后,server程序找到当前url对应的模板,填充模板变量(输出成字符串形式的html源码),返回给浏览器,浏览器渲染页面。

如果是简单的程序,一个页面就对应一个模板,非常简单。一般一个网站有自己的统一风格,所有页面都会有一些相同的元素,每个页面单独写一遍很累赘,也不好维护,所以一般模板语言都有继承(extend),插入(include)等特性,来提高页面的复用率。

Horizon做得就更彻底一些,它将页面上所有元素模块化,网页中一些常见元素,表单,表格,标签页,全部封装成Python类,每个组件有自己对应的一小块html模板.当渲染整个页面的时候,Horizon先找到当前页面有多少组件,将各个组件分别进行渲染变成一段html片段,最后拼装成一个完整的html页面,返回浏览器。

简单总结Horizon的特点:

页面元素模块化
子面板可插拔
All in One(从部署上来说,Horizon只有它自己这一个组件)

Dive into Horizon

Some Concepts

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.

Some Code
Horizon的源码中,包含两个代码文件夹

horizon
openstack_dashboard
Horizon这个包是一些在django基础上写的通用组件,表格(table),标签页(tab),表单(form),面包屑导航(browser),工作流(workflow),这些代码和openstack的具体业务逻辑没有什么关系,如果做一个新的django项目,理论上可以复用Horizon这个包中的代码。horizon/base.py中还实现了一套dashboard/panel机制,使得Horizon面板上所有的dashboard都是”可插拔”的,所有的panel都是”动态加载”的。

openstack_dashboard/dashboards/中是各个面板的具体实现代码,其中包括各个面板的模板文件, 和后端service交互的业务逻辑代码等。

FAQ

Horizon怎么实现dashboard的可插拔?

之前说过,Horizon中的dashboard就是django的app,在openstack_dashboard/settings.py中的INSTALLED_APP变量定义了目前已有的四个dashboard:

openstack_dashboard.dashboards.project
openstack_dashboard.dashboards.admin
openstack_dashboard.dashboards.settings
openstack_dashboard.dashboards.router
如果自己按照Horizon自定制dashboard的流程写了新的dashboard也需要加到这个配置文件中,新面板就能正常显示。

每个dasboard是怎么找到自己拥有的panel的?

每个dashboard模块下都有一个dasbboard.py文件里面定义了属于当前dashboard的PanelGroup,和各个PanelGroup下的Panel,在Horizon模块被导入的时候会去依次遍历Dasboard→PanelGroup→Panel,所有的dashboard注册到Horizon命名空间下,各个panel注册到自己的dashboard命名空间下。

每个panel是怎么找到自己的模板的?

这需要理解django中的template loader概念,简单的说,template loader就是一个处理request的视图寻找自己的模板文件路径的方法,django自带了好几种template加载机制,Horizon用到了filesystem,app_directories这两种,另外自己自定义了一种(horizon.loaders.TemplateLoader),loader的定义在openstack_dashboard.settings中的TEMPLATED_LOADERS变量。

TEMPLATED_LOADERS = (
‘django.template.loaders.filesystem.Loader’,
‘django.template.loaders.app_directories.Loader’,
‘horizon.loaders.TemplateLoader’,
)
举例:

当点击左侧project(这是个dashboard)下的instance(这是个panel)标签时,页面会跳转到http://localhost/project/instances这个url,panel在的视图类中写了template_name=“project/instances/index.html”,查找这个文件的顺序是:

先找openstack_dashboard/templates
没找到再找openstack_dashboard/dashboards/project/templates/,这个目录不存在,还是没找到。
最后找openstack_dashboard/dashboards/project/instances/templates, 找了index.html这个文件。

怎么显示swift的面板?怎么显示heat的面板?

这里很好的体现了Horizon的动态特性,显不显示某panel,实际上并不由Horizon控制,而是由Keystone控制。一个后端的webservice需要集成进openstack的话,第一步是在Keyston处登记,在Keyston的service,endpoint这两张表内写入该service的的一些元数据信息(包括url地址)。

Horizon控制面板是否显示用了一套叫permission的机制,比如Container(swift的panel)要显示的条件是”openstack.services.object-store”。用户的登陆后的token中又service catalog信息,catalog中必须包含object-store这个service,满足,container这个panel就会注册到project这个dashboard之下,页面上就能显示,如果Keyston中没有swift的catalog信息,Horizon就不会注册container这个panel,swift的面板就不会显示。heat同理。

要了解permission的具体实现请看openstack_auth/backend.py 模块

普通用户看不到admin面板,这个是怎么实现的?

还是用到了上个问题提到的permission,Admin dashboard这个类中写的permission是”openstack.roles.admin”,则admin这个面板显示的条件是当前登录的用户有admin这个role,满足的用户就能看到admin dashbaord.

Horizon处理登录部分的代码在哪?

参看openstack_auth部分

Customize Horizon

自定义css
要对Horizon的css样式做自定制,可以修改openstack_dashboard/static/less 目录下的less文件。

自定义js
要对Horizon中js的行为做定制,可以修改horizon/static/horizon/js/ 目录下的文件,Horizon的js文件都是针对具体某个页面组件做的行为定制,比如form提交时的行为,tab切换的行为,所以都放在Horizon目录下而不在openstack_dashboard目录下。

添加新的dashboard和panel
Horizon自带了两条命令,方便快速得生成基础代码:

python manage.py startdash test_dash 自动生成一个叫test_dash的dashboard,之后将test_dash写入settings中的INSTALLED_APP中,Horizon就能加载此新面板
python manage.py startpanel test_panel -d openstack_dashboard.dashboards.admin –target auto 会在Horizon的admin dashboard下生成一个叫test_panel的子面板

Event Driven Horizon

Horizon目前的实现是比较传统的全刷新网站,openstack中有不少操作是异步的api,比如创建虚拟机,snapshot,volume等等。这些api被调用后资源会进入一个状态迁移的过程,Horizon在前端页面上实现状态的实时刷新,用的是ajax轮训的方式,这种方式效率比较低,也有延迟,目前也有bp要为Horizon引进real time的特性,相关bp:

support for realtime communicationi
Spec for “push”-based realtime communication
Use common RPC listener to consume messages
有一个实现草案:https://review.openstack.org/#/c/40198/1

原理是通过sock.io(python版基于tornado的ioloop实现)再写一个websocket的server.同时Horizon后台添加消息队列支持,监听openstack集群中的消息,监听到了自己需要的消息之后,通知websocket server,server再通知浏览器中的js.

不过这样做有一些问题,server上需要躲开一个端口专门处理websocket请求,还需要一个daemon监听消息队列的消息,这会增加Horizon的部署复杂度。社区决定将real time的实现放到I版做,这个实现草案中将整个Horizon本身也跑在了tornado server上,这里的性能问题有待商榷(主要是对eventlet的monkey_patch的原理有疑惑)。

参见:http://www.cnblogs.com/yuxc/p/3419102.html
转载以便学习

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

#修改成自己的ip openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.80.144 openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron true openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:123456@manager.node openstack-config --set /etc/nova/nova.conf api auth_strategy keystone openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://manager.node:5000/v3 openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers manager.node:11211 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name default openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name default openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova openstack-config --set /etc/nova/nova.conf keystone_authtoken password nv123456 openstack-config --set /etc/nova/nova.conf vnc enabled true openstack-config --set /etc/nova/nova.conf vnc server_listen 0.0.0.0 openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address '$my_ip' openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://manager.node:6080/vnc_auto.html openstack-config --set /etc/nova/nova.conf glance api_servers http://manager.node:9292 openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp openstack-config --set /etc/nova/nova.conf placement region_name RegionOne openstack-config --set /etc/nova/nova.conf placement project_domain_name Default openstack-config --set /etc/nova/nova.conf placement project_name service openstack-config --set /etc/nova/nova.conf placement auth_type password openstack-config --set /etc/nova/nova.conf placement user_domain_name Default openstack-config --set /etc/nova/nova.conf placement auth_url http://manager.node:5000/v3 openstack-config --set /etc/nova/nova.conf placement username placement openstack-config --set /etc/nova/nova.conf placement password pm123456控制节点是manager.node,计算节点是master.node
最新发布
06-21
### 配置 OpenStack Nova 服务的相关参数 在 OpenStack 中,`openstack-config` 命令可以用来设置配置文件中的参数。以下是针对 `Nova` 服务的各个参数配置方法: #### 配置 `my_ip` 通过以下命令设置 Nova 的 IP 地址: ```bash openstack-config --set /etc/nova/nova.conf DEFAULT my_ip <your-ip-address> ``` 这将指定 Nova 使用的 IP 地址[^1]。 #### 集成 Neutron 启用 Neutron 并设置防火墙驱动程序: ```bash openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver ``` 上述命令启用了 Neutron,并禁用了防火墙功能[^3]。 #### 设置认证策略 启用的 API 和认证策略可以通过以下命令进行配置: ```bash openstack-config --set /etc/nova/nova.conf api enabled_apis osapi_compute,metadata openstack-config --set /etc/nova/nova.conf api auth_strategy keystone ``` 这确保了仅允许经过 Keystone 认证的用户访问 Nova API[^4]。 #### 消息队列配置 设置消息队列的传输 URL: ```bash openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://<user>:<password>@<rabbitmq-host>:5672/ ``` 此命令定义了 RabbitMQ 的连接信息[^3]。 #### Keystone 认证令牌 配置 Keystone 认证令牌相关参数: ```bash openstack-config --set /etc/nova/nova.conf keystone_authtoken www_authenticate_uri http://<controller-ip>:5000/v3 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://<controller-ip>:5000/v3 openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers <controller-ip>:11211 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova openstack-config --set /etc/nova/nova.conf keystone_authtoken password <nova-password> ``` 这些参数确保了 Nova 能够正确地与 Keystone 进行身份验证[^4]。 #### VNC 设置 配置 VNC 相关参数以支持远程控制台访问: ```bash openstack-config --set /etc/nova/nova.conf vnc enabled True openstack-config --set /etc/nova/nova.conf vnc vncserver_listen 0.0.0.0 openstack-config --set /etc/nova/nova.conf vnc vncserver_proxyclient_address <compute-node-ip> openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://<controller-ip>:6080/vnc_auto.html ``` 这为计算节点上的虚拟机实例启用了 VNC 控制台访问[^1]。 #### Glance API 配置 设置 Glance API 的地址: ```bash openstack-config --set /etc/nova/nova.conf glance api_servers http://<controller-ip>:9292 ``` 此命令指定了 Glance API 的地址,以便 Nova 可以获取镜像信息。 #### 并发控制 配置并发控制参数以限制线程和进程数量: ```bash openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp ``` 这设置了锁路径以避免多线程冲突[^2]。 #### Placement 服务配置 确保 Placement 服务被正确配置: ```bash openstack-config --set /etc/nova/nova.conf placement region_name RegionOne openstack-config --set /etc/nova/nova.conf placement project_domain_name Default openstack-config --set /etc/nova/nova.conf placement project_name service openstack-config --set /etc/nova/nova.conf placement auth_type password openstack-config --set /etc/nova/nova.conf placement auth_url http://<controller-ip>:5000/v3 openstack-config --set /etc/nova/nova.conf placement username placement openstack-config --set /etc/nova/nova.conf placement password <placement-password> ``` 这些参数确保了 Nova 能够与 Placement 服务交互以管理资源分配。 ### 示例代码 以下是一个完整的脚本示例,用于批量配置上述参数: ```bash #!/bin/bash # 定义变量 MY_IP="<your-ip-address>" RABBITMQ_USER="<user>" RABBITMQ_PASSWORD="<password>" RABBITMQ_HOST="<rabbitmq-host>" CONTROLLER_IP="<controller-ip>" NOVA_PASSWORD="<nova-password>" PLACEMENT_PASSWORD="<placement-password>" # 配置 my_ip openstack-config --set /etc/nova/nova.conf DEFAULT my_ip $MY_IP # 配置 Neutron openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver # 配置认证策略 openstack-config --set /etc/nova/nova.conf api enabled_apis osapi_compute,metadata openstack-config --set /etc/nova/nova.conf api auth_strategy keystone # 配置消息队列 openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://$RABBITMQ_USER:$RABBITMQ_PASSWORD@$RABBITMQ_HOST:5672/ # 配置 Keystone 认证令牌 openstack-config --set /etc/nova/nova.conf keystone_authtoken www_authenticate_uri http://$CONTROLLER_IP:5000/v3 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://$CONTROLLER_IP:5000/v3 openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers $CONTROLLER_IP:11211 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova openstack-config --set /etc/nova/nova.conf keystone_authtoken password $NOVA_PASSWORD # 配置 VNC openstack-config --set /etc/nova/nova.conf vnc enabled True openstack-config --set /etc/nova/nova.conf vnc vncserver_listen 0.0.0.0 openstack-config --set /etc/nova/nova.conf vnc vncserver_proxyclient_address $MY_IP openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://$CONTROLLER_IP:6080/vnc_auto.html # 配置 Glance API openstack-config --set /etc/nova/nova.conf glance api_servers http://$CONTROLLER_IP:9292 # 配置并发控制 openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp # 配置 Placement openstack-config --set /etc/nova/nova.conf placement region_name RegionOne openstack-config --set /etc/nova/nova.conf placement project_domain_name Default openstack-config --set /etc/nova/nova.conf placement project_name service openstack-config --set /etc/nova/nova.conf placement auth_type password openstack-config --set /etc/nova/nova.conf placement auth_url http://$CONTROLLER_IP:5000/v3 openstack-config --set /etc/nova/nova.conf placement username placement openstack-config --set /etc/nova/nova.conf placement password $PLACEMENT_PASSWORD ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值