模块管理排序

目前模块的执行顺序是任意的,但操作员可能希望控制模块的执行顺序,以确保正常功能。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/module-management-ordering

问题描述

Trove 现在支持模块管理,即可以将包含有效负载的“模块”应用于正在运行的 Trove 实例。这允许最终用户“自带许可证”用于数据存储(等等),只要存在相应的驱动程序插件即可。最初的实现没有考虑到必须先应用一个模块才能应用另一个模块的情况(例如,如果必须按正确的顺序应用多个许可证)。

操作员确保“admin”模块在用户模块之前应用的能力也缺乏。

本规范解决了这些不足之处。

提议的变更

将创建一个用于指定“优先级”模块的方法,以及一种对模块应用顺序进行排序的方式。需要在创建和更新的有效负载中添加两个新的属性“priority_apply”和“apply_order”。此外,当具有管理员凭据的用户创建模块时,将添加一个 is_admin 标志作为自动属性。这将允许在驱动程序插件侧更好地控制安全问题等。

“priority_apply”的默认值为 False,“apply_order”的默认值为 5。这将允许在未提供选项的情况下,在之前或之后对模块进行排序。

配置

不需要新的配置更改。

数据库

将在 Trove 模式的 modules 表中添加新列

类型

允许空值

描述

priority_apply

tinyint(1)

此模块是否应在所有非优先级模块之前应用。仅管理员选项。

apply_order

int(11)

应应用模块的顺序。值在 0-9 之间,较小的顺序号先应用。优先级模块也可以这样排序。

is_admin

tinyint(1)

此模块是由具有管理员凭据的用户创建或更新的。设置此标志后,只有管理员用户才能随后更新该模块。

创建具有“优先级”的模块需要管理员凭据。所有优先级模块将在非优先级模块之前应用,并遵循相同的 apply_order 序列。

例如,给定具有以下优先级/顺序的模块,它们将按以下顺序应用

==============      ===========
Priority Apply      Apply Order
==============      ===========
Yes                 0
Yes                 4
Yes                 9
No                  0
No                  1
No                  9
==============      ===========

公共 API

将在 module-create 和 module-update ReST API 的有效负载中添加以下新选项

请求

POST /v1.0/modules (or PATCH /v1.0/modules/{module_id})
{
    <current payload>,
    'priority_apply': True,
    'apply_order': 5
}

响应

{
    "module": {
        <current payload>,
        'priority_apply': True,
        'apply_order': 5
    }
}

响应代码

The response codes will remain the same

is_admin 标志将自动设置,因此无需在有效负载中传递它。如果非管理员创建的模块由管理员更新,则将设置 is_admin 标志,但前提是启用“仅管理员”选项。一旦模块被指定为“admin”,则只有具有管理员凭据的用户才能从那时起对其进行修改。

公共 API 安全

预计此更改不会引入任何安全问题。

Python API

将向模块创建和更新方法添加新的参数,以方便排序。

def module_create(self, module_type, name, description, contents,
                  datastore, datastore_version='all', auto_apply=False,
                  all_tenants=False, visible=True, live_update=False,
                  priority_apply=False, apply_order=5):
    """Create a new module."""

def module_update(self, module, module_type=None, name=None,
                  description=None, contents=None, datastore=None,
                  datastore_version=None, auto_apply=None,
                  all_tenants=None, visible=None, live_update=None,
                  priority_apply=False, apply_order=5):
    """Update an existing module."""

CLI (python-troveclient)

以下 Trove CLI 命令将支持两个新的参数:priority_apply 和 apply_order。priority_apply 将是一个需要管理员凭据的标志,apply_order 将限制为 0-9 之间的整数。

  • module-create 创建一个新的模块资源。

  • module-update 更新特定模块的模块详细信息

    资源。

内部 API

内部 API 将更改,即新的字段将包含在模块结构中。预计不会进行任何编码更改。

Guest Agent

在 Guest Agent 中,模块将根据优先级和顺序值进行排序。除了 is_admin 标志现在将从模块有效负载(如果存在)中获取,而不是从其他属性推断得出之外,预计不会进行其他更改。

备选方案

Dashboard 影响 (UX)

模块详细信息面板需要有两个新的属性:priority-apply 和 apply-order。第一个是一个标志(默认值为 false),第二个限制为 0 到 9 之间的整数值。这些应该添加到 python 调用以创建或更新模块中。

实现

负责人

主要负责人

[peterstac]

里程碑

Newton

工作项

将使用以下任务完成这项工作

  • 客户端(Python 和 CLI)更改

  • Guest Agent 更改以确保模块正确排序

升级影响

预计不会出现升级问题,但是为了使该功能正常工作,需要更新 Trove 数据库。

依赖项

无。

测试

场景测试将得到增强,以包括排序(包括至少一个优先级模块)。可能难以测试是否遵守了排序(因为这需要某种依赖关系,并且只有 ping 驱动程序插件),因此这可能只能通过单元测试来处理。

文档影响

应该将模块现在可以排序的事实添加到文档中。

参考资料

附录