from nova ironic to horizon(5)

来源:互联网 发布:sql列转行函数 编辑:程序博客网 时间:2024/05/18 13:46

前面我们已经知道要添加或者修改horizon代码主要修改在horizon/openstack_dashboard/dashboards/下的api,以及对应的dashboard中,

例如我们在dashboards中添加testmodule,对应的有:

templates/testmodeule 目录用于放置模板

_init__

forms.py   存放表单,比如要弹出式表单,让用户输入数据

models.py  基本上不用,模型抽象层

urls.py   url映射关系

views.py 视图

tables.py  dashboard在左,右边一般是表的形式展示数据,表结构,表方法,row方法定义等在此

panel.py, 在dashboard上注册panel

发生响应的流程为:

1.页面操作触发tables action

2.url.py中解析,找到对应的views或执行特定的action

3.views中特定的view绑定template或者form,并在form中填写完成

4.执行handle进行逻辑处理 (对row 的action,例如update或者delete操作无须view的参与)

5.调用openstack_dashboard/api/xxx.py 执行具体的逻辑

6.调用api中的client,例如novaclient 去callopenstack提供的服务

7.返回显示


看一个table定义的例子:

class MyTable(BaseTableClass):
    column_one = tables.Column("property name",
                         link=("url"),
                         verbose_name=_("Show Name"))
    Column_two = tables.Column("property name", verbose_name=_("Show Name"))
        
    class Meta:
        name =
        row_class = UpdateRow
        verbose_name = _("Physical Servers")
        columns = [
        table_actions = ()
        row_actions = ()

定义一个MyTable,Metaclass定义class的元数据,name是表明,row_class=UpdateRow定义每一行数据获取与更新的类,每一行数据是什么从哪里来,

verbose_name是显示在UI上的表明,columns定义每一列数据的属性名(返回在表中显示的数据是一个dict,此处属性名是dict中的key值),table_actions

是表的操作,比如创建flavor或者image等,row_action则是每一行的操作定义(有时候admin和普通用户可以进行的操作是不一样的,因此可以在这里进行不同

row action实现)

表中的操作一般说来分为两类LinkAction和BatchAction,其中LinkAction大多用于需要弹出form的情况:

table action就会变成表头上的按钮,row action则是表格最后一列的action下拉选项

class TestAction(tables.LinkAction):
   
    name = "Multi Assign"
    verbose_name = _("Show Name")   #显示的按钮上的字
    url = "horizon:xxx"    #点击按钮时候执行的操作,可以通过url到某个view,再到form,或者执行具体操作
    classes = ("ajax-modal", "btn-edit")#按钮的风格

    def allowed(self, request, datum=None): #一般link actin和具体的row data无关,allowed重载基本都返回True或者不重载

        return True   

--------------------------------------------------------------

class TestBatchAction(tables.BatchAction):
    name = ""
    action_present = _("")#进行时。。。
    action_past = _("") #完成action后message显示的前缀,应该还有别的意思,我不care,所以未深究
    data_type_singular = _("") #show message时候,单个和多个item被操作时显示的单复数
    data_type_plural = _("")  #
    classes = ("btn-danger", "btn-reboot")     #按钮风格
    success_url = reverse_lazy("") #action成功后重定向到什么操作
    
    def allowed(self, request, datum):
       #对row action来说这里决定某一行是否可以执行该操作,对多行操作的table action来说走handle
    
    def action(self, request, obj_id):

       #单行操作

    def handle(self, request, table, obj_ids):     

       #多行数据操作


还有一个常用的是workflow,前面已经提到过,参照flavor和subnet的创建很容易理解。

总的来说,Horizon在Django的基础上对openstack的各种操作做了很好的封装,而且随着版本的演进越来越好,修改起来也更加容易,

再说就必须和我的项目说上了,不敢说细:)

跟着项目走就对了


0 0
原创粉丝点击