Openstack中Dashboard的二次开发

openstack二次开发 postman调用openstack restful api Restful api 是openstack各服务调用的接口,简单理解为可以通过网络去调用的函数。postman是一款前端调用工具,测试后端接口的时候往往是使用该工具去验证。在openstack的使用中,可以使用postman调用openstack restful接口。这里要区别命令行和restful接口,命令行的使用是调用restful来实现的。所以,不管是命令行还是horizon都是调用了openstack中restful api去实现相应的功能。 这次项目主要是根据openstack 的 dashb 阅读详情

原文:Tutorial: Building a Dashboard using Horizon

除了原文中翻译的内容,还有自己添加的一部分内容


本教程讨论如何使用Horizon中多样的组件(主要是tables和tabs)来建立一个dashboard和panel,包括和后端的数据交互。

做为一个例子,我将创建一个有一个实例标签的panel,这个标签有一个能和Nova的API进行数据交换的table。

注:本教程假设你已经搭建好了环境,这里有很多有帮助的教程。比如你可能想从Horizon quickstart guide或者Django tutorial这些教程开始。


1 创建一个dashboard控制面板


1.1 快速版本

Horizon提供了一套自定义管理命令来创建一个典型的基于dashboard的结构。下列命令产生了大部分的模板代码:

mkdir openstack_dashboard/dashboards/mydashboard

./run_tests.sh -m startdash mydashboard \
              --target openstack_dashboard/dashboards/mydashboard

mkdir openstack_dashboard/dashboards/mydashboard/mypanel

./run_tests.sh -m startpanel mypanel \
               --dashboard=openstack_dashboard.dashboards.mydashboard \
               --target=openstack_dashboard/dashboards/mydashboard/mypanel

你会注意到这些mydashboard和mypanel的目录下会自动的生成相关的文件。


1.2 结构

如果你用tree mydashboard 命令,你会看到如下的结构

mydashboard
├── dashboard.py
├── dashboard.pyc
├── __init__.py
├── __init__.pyc
├── mypanel
│   ├── __init__.py
│   ├── panel.py
│   ├── templates
│   │   └── mypanel
│   │       └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── static
│   └── mydashboard
│       ├── css
│       │   └── mydashboard.css
│       └── js
│           └── mydashboard.js
└── templates
    └── mydashboard
        └── base.html

对于本教程,我们将不会处理关于 static 文件夹或者 tests.py 文件,就放在那里不用管就好了。

我们将继续增加我们自己的dashboard。


1.3 定义一个dashboard

打开 dashboard.py 文件,你会看到以下代码已经被自动生成了:

from django.utils.translation import ugettext_lazy as _

import horizon


class Mydashboard(horizon.Dashboard):
   name = _("Mydashboard")
   slug = "mydashboard"
   panels = ()           # Add your panels here.
   default_panel = ''    # Specify the slug of the dashboard's default panel.


horizon.register(Mydashboard)

如果你想让你的dashboard的名字可以在其他地方看到,你可以修改 dashboard.py 文件中的name参数,比如你想把名字改为My Dashboard

name = _("My Dashboard")

dashboard类通常会包括name(dashboard对外所呈现的名称)和一个slug(被其它组件引用的内部名称), panel列表和默认的panel等等。下面的章节会涉及到如何增加一个panel



2. 创建一个panel


我们将创建一个panel并将它命名为My Panel.

2.1 结构

mypanel的文件夹在 openstack_dashboard/dashboards/mydashboard 下,它的结构如下:

mypanel
 ├── __init__.py
 ├── models.py
 ├── panel.py
 ├── templates
 │   └── mypanel
 │     └── index.html
 ├── tests.py
 ├── urls.py
 └── views.py


2.2 定义一个panel

上面指定的panel.py文件有一个特殊的意义,在一个dashboard中,dashboard类中指定的”panels属性”列出任何模块名字,将自动在 panel.py文件中查找相应的记录。

打开 panel.py 文件中,会看到一些自动生成的代码:

from django.utils.translation import ugettext_lazy as _

import horizon

from openstack_dashboard.dashboards.mydashboard import dashboard


class Mypanel(horizon.Panel):
    name = _("Mypanel")
    slug = "mypanel"


dashboard.Mydashboard.register(Mypanel)

一旦定义了它,我们还需要在dashboard中注册它,通常在panel.py文件末尾:

dashboard.Mydashboard.register(Mypanel)

如果你想让panel的名字在其他地方也可以看到,你可以修改 panel.py 文件中的name参数,比如你可以把名字修改为 My Panel:

name = _("My Panel")

再次打开 dashboard.py 文件,在 Mydashboard class 上方插入如下代码,这段代码定义了 Mygroup 类并且增加了一个名为mypanel的panel

class Mygroup(horizon.PanelGroup):
    slug = "mygroup"
    name = _("My Group")
    panels = ('mypanel',)

修改Mydashboard 类使其包含Mygroup ,并设置mypanel为默认的panel:

class Mydashboard(horizon.Dashboard):
   name = _("My Dashboard")
   slug = "mydashboard"
   panels = (Mygroup,)  # Add your panels here.
   default_panel = 'mypanel'  # Specify the slug of the default panel.

完整的 dashboard.py 文件如下:

from django.utils.translation import ugettext_lazy as _

import horizon


class Mygroup(horizon.PanelGroup):
    slug = "mygroup"
    name = _("My Group")
    panels = ('mypanel',)


class Mydashboard(horizon.Dashboard):
    name = _("My Dashboard")
    slug = "mydashboard"
    panels = (Mygroup,)  # Add your panels here.
    default_panel = 'mypanel'  # Specify the slug of the default panel.


horizon.register(Mydashboard)


3 Tables,Tabs,Views


我们从table开始,把table和tab整合到一起,最后把它们统一合成到一个视图(view)中。

3.1 定义一个Table

Horizon提供了一个SelfHandlingForm DataTable 类,简化了绝大多数显示数据给最终用户的工作。我们将略去这里的结构,但是这里有很多的capabilities(不会翻译了。。)

创建一个tables.py 文件并增加如下代码:

from django.utils.translation import ugettext_lazy as _

from horizon import tables


class InstancesTable(tables.DataTable):
    name = tables.Column("name", verbose_name=_("Name"))
    status = tables.Column("status", verbose_name=_("Status"))
    zone = tables.Column('availability_zone',
                          verbose_name=_("Availability Zone"))
    image_name = tables.Column('image_name', verbose_name=_("Image Name"))

    class Meta:
        name = "instances"
        verbose_name = _("Instances")

有几件事情发生了,我们创建了一个table子类,定义了四列。每列定义了它访问实例类的属性作为第一个参数,由于我们希望所有的事情都是可以被翻译的,我们给每列一个 verbose_name 标记它们可以被翻译。

最后我们添加了一个Meta类来定义一些描述table的元数据。


3.2 向table添加action

Horizon提供了三种基本的可以呈现table数据的action类:

在基本的action的基础上,还提供了一些扩展的action类:

现在,我们创建并向table添加一个“filter action”。我们需要编辑上面的table.py文件,添加了“filter action”后,我们将只能看到filter域中规定的字段。先定义一个FilterAction类:

class MyFilterAction(tables.FilterAction):
    name = "myfilter"

然后,我们将这个action加入到table中:

class InstancesTable:
    class Meta:
        table_actions = (MyFilterAction,)

完整的table.py文件看起来应该是这样:

from django.utils.translation import ugettext_lazy as _

from horizon import tables


class MyFilterAction(tables.FilterAction):
    name = "myfilter"


class InstancesTable(tables.DataTable):
    name = tables.Column('name', \
                         verbose_name=_("Name"))
    status = tables.Column('status', \
                           verbose_name=_("Status"))
    zone = tables.Column('availability_zone', \
                         verbose_name=_("Availability Zone"))
    image_name = tables.Column('image_name', \
                               verbose_name=_("Image Name"))

    class Meta:
        name = "instances"
        verbose_name = _("Instances")
        table_actions = (MyFilterAction,)


3.3 定义tabs

因为我们有了table,可以接收数据,我们可以直接得到一个视图,这种情况下,我们同样适用Horizon的TabGroup类,它给我们一个干净、简化的tabs接口来显示我们的可视化数据。

在mypanel目录下创建tabs.py 文件,让我们整合table与tab,完整的代码如下:

from django.utils.translation import ugettext_lazy as _

from horizon import exceptions
from horizon import tabs

from openstack_dashboard import api
from openstack_dashboard.dashboards.mydashboard.mypanel import tables


class InstanceTab(tabs.TableTab):
    name = _("Instances Tab")
    slug = "instances_tab"
    table_classes = (tables.InstancesTable,)
    template_name = ("horizon/common/_detail_table.html")
    preload = False

    def has_more_data(self, table):
        return self._has_more

    def get_instances_data(self):
        try:
            marker = self.request.GET.get(
                        tables.InstancesTable._meta.pagination_param, None)

            instances, self._has_more = api.nova.server_list(
                self.request,
                search_opts={'marker': marker, 'paginate': True})

            return instances
        except Exception:
            self._has_more = False
            error_message = _('Unable to get instances')
            exceptions.handle(self.request, error_message)

            return []

class MypanelTabs(tabs.TabGroup):
    slug = "mypanel_tabs"
    tabs = (InstanceTab,)
    sticky = True

这个tab有一点复杂。tab处理tables的数据(以及所有有关的特性),同时它可以使用preload属性来指定这个tab该不该被加载,默认情况下为不加载。当有人点击它时,它将通过AJAX方式加载,在绝大多数情况下保存我们的API调用。

此外,table的展示是由一个可重复使用的模板控制的,horizon/common/_detail_table.html 一些翻页的代码已经被增加进去了,来处理大量的实例列表。

最后,这个代码引进了错误处理,horizon.exceptions.handle() 这个函数是一个集中的错误处理机制,被广泛的使用。


3.4 把他们整合到一个视图(view)中

在Horizon中,有很多基于类的预建视图,我们试着给所有通用整合组件提供起始点。

打开 views.py 文件,代码看起来应该是这样:

from horizon import views


class IndexView(views.APIView):
    # A very simple class-based view...
    template_name = 'mydashboard/mypanel/index.html'

    def get_data(self, request, context, *args, **kwargs):
        # Add data to the context here...
        return context
class IndexView(tabs.TabbedTableView):
    tab_group_class = mydashboard_tabs.MypanelTabs

在引入合适的包之后,完整的 views.py 文件是这样的:

from horizon import tabs

from openstack_dashboard.dashboards.mydashboard.mypanel \
    import tabs as mydashboard_tabs


class IndexView(tabs.TabbedTableView):
    tab_group_class = mydashboard_tabs.MypanelTabs
    template_name = 'mydashboard/mypanel/index.html'

    def get_data(self, request, context, *args, **kwargs):
        # Add data to the context here...
        return context



4. URLs


自动生成的 url.py 文件如下:

from django.conf.urls import patterns
from django.conf.urls import url

from openstack_dashboard.dashboards.mydashboard.mypanel.views \
    import IndexView


urlpatterns = patterns(
    '',
    url(r'^$', IndexView.as_view(), name='index'),
)

调整引入的包 IndexView ,增强文件的可读性

from openstack_dashboard.dashboards.mydashboard.mypanel import views

用下面的代码来替代已经存在的 url pattern

url(r'^$',
    views.IndexView.as_view(), name='index'),

完整的url.py 文件如下:

from django.conf.urls import patterns
from django.conf.urls import url

from openstack_dashboard.dashboards.mydashboard.mypanel import views


urlpatterns = patterns('',
    url(r'^$',
        views.IndexView.as_view(), name='index'),
)



5. Template(模板)


打开 mydashboard/mypanel/templates/mypanel directory 目录下的 index.html 文件,它自动生成了如下代码:

{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Mypanel" %}{% endblock %}

{% block page_header %}
    {% include "horizon/common/_page_header.html" with title=_("Mypanel") %}
{% endblock page_header %}

{% block main %}
{% endblock %}
openstack学习记录(一) horizon二次开发部署(juno) 在虚拟机中部署了openstack(juno)版本,想要在物理机上调试查看horizon代码,过程如下: 编译器 pycharm 系统环境 Ubuntu14.04 , python .version() 2.7.6 django.version() 1.6.11 若没有django,先安装好django框架一:下载juno版本对应的horizon源码网址:https://releases 阅读详情

相关推荐

OpenStack(kilo)界面dashboard二次开发(一)-增加Panel

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

塔尖草的博客 5772

扩展OpenStack Dashboard简明教程

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

weixin_34106122的博客 687

华为OD机试双机位C卷-停车场收入统计 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 停车场收入统计,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 停车场收入统计。

qq_45776114的博客 2156

【星海出品】零基础dashboard二次开发

openstack二次开发 horzion

weixin_41997073的博客 1354

基于开源项目OpenStack4j进行二次开发(实现neutron API的封装)

文章目录前言一、封装openstack4j开发流程1.新增neutron接口对应的实体类及查询options类2.创建 API接口和实现类3.networkingService中定义接口名称、建立绑定关系4.添加单测5.功能代码目录结构6. 代码文件说明二、openstack4j代码打成jar包1. 选择OpenStack4j Parent 点击install(如果单测有报错的,可以选择跳过单测)2. 找到本地maven目录,找到打包成功的jar文件3.本地调试openStack4j代码 前言 对于neu

luckySnow的博客 3340

OpenStack(Rocky)的Dashboard二次开发

首先需要安装tox pip install tox

RBK的博客 777

OpenStack(kilo)界面dashboard二次开发(三)-增加Dashboard

前面的博文已经完成了panel与panelgroup的自定义增加,这篇博文将对Dashboard(一级菜单)的增加进行一个简单总结。 增加Dashboard(一级菜单) 增加Dashboard(一级菜单) 首先进入/usr/share/openstack-dashbaord/openstack_dashboard/dashboards目录,会看到如下的目录结构: ...

塔尖草的博客 4528

openstack dashboard二次开发

horizon是一个基于django webframework开发的标准的python wsgi程序. Horizon这套面板的设计分成三层:Dashboard → PanelGroup → Panel Horizon中现有的dashboard有5个: project 普通用户登陆后看到的项目面板 admin 管理登陆后可见,左侧的管理员面板 identit...

weixin_30654419的博客 534

OpenStack(kilo)界面dashboard二次开发(四)-国际化

openstack界面支持英语、简体中文、繁体中文等多种语言。用户可以在用户设置中进行设置。如果要对openstack进行二次开发,那么就一定要对界面上的标题、提示的内容等进行修改。 国际化 国际化 看下面两幅图,分别是简体中文、English的实例页面: openstack的界面采用的是django的架构,django国际化就是开发者对需要翻译的字符串进行标...

塔尖草的博客 4019

OpenStack Dashboard二次开发环境的搭建

openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更深层次的理解,当我们看到dashboard的时候,我们或许对openstack感觉有一点感性认识了。简单地理解Openstack和Hadoop一样是一套由多个软件组件协同分工来管理虚拟机的一套管理系统平台。dashboard可以理解为op

Enweitech Software Works 5235

Openstack Dashboard 二次开发

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

weixin_33743703的博客 207

OpenStack Dashboard二次开发--简明教程

问题导读1、如何理解Horizon的重要性?2、对Dashboard进行二次开发,需要什么?3、为什么需要在IndexView里定义好table_class和template_name的属性值和get_data()方法?Horizon简介HorizonOpenStack的一个子项目,用于提供一个Web前端控制台(称为Dashboard),以此来展示OpenStack的功 能。通常情况下,我们都是...

成字第0431879 3467

openstack二次开发 ui dashboard开发

Horizon作为OpenStack的Web界面,提供了丰富的可视化功能,让用户可以更加轻松地操作OpenStack平台。其中,主要包含如下功能: 1.用户认证:Horizon支持基于用户名和密码的认证方式,还提供了基于令牌的用户认证方式。 2.虚拟机管理:Horizon允许用户创建、启动、停止、重启虚拟机等操作,还提供了虚拟机列表、虚拟机快照等功能。 3.云存储管理:Horizon支持对云存储的创建、管理和删除操作,未来还会提供更多功能。 4.网络管理:Horizon可以对网络进行配置、控制和监控,从而

yuezhilangniao的博客 760

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

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

塔尖草的博客 3741

OpenstackHorizonDashboard上定制新页面

二次开发OpenstackHorizonDashboard上定制新页面前言:Horizon 提供可视化的 GUI 图形界面,让用户去操作这些项目使用的各种资源。那Horizon 的内部架构是怎么样的?我们如果要做二次开发,应该怎么去做?Openstack Horizon Dashboard 是一套基于Django Web 框架实现的Web界面。了解 Horizon 应首先去了解 Pytho...

spark_csdn的博客 3282

前端dashboard框架_Dashboard二次开发简明教程

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

weixin_39770226的博客 1207
上一篇: Python正则表达式指南
下一篇: Python 函数作用域
Violet-Guo
博客等级 码龄11年 585粉丝 226原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值