节点标签

https://bugs.launchpad.net/ironic/+bug/1526266

本规范旨在添加对节点标签的支持。

问题描述

Ironic 应该为每个节点提供标签字段,该字段可用于将节点划分为若干组。然后我们可以通过标签进行列表查询,以获取具有相同属性(如硬件规格)的节点组。

提议的变更

  • 添加允许用户为节点添加、删除和列出标签的 API。

  • 在节点列表 API 中添加标签过滤参数,以允许基于一个或多个字符串标签搜索节点。

备选方案

当前的 chassis 对象在某种程度上可以作为节点分组的替代方案。

数据模型影响

将在对象模型中添加一个新的 ironic.objects.tags.NodeTagList 对象。

Python 对象模型中的 ironic.objects.tags.NodeTagList 字段将按需填充(即不立即加载)。

标签应定义为 Unicode 字符串,长度不超过 255 个字符,并在此字段上建立索引。

标签是附加到实体上的字符串,用于将其分类到组中。为了简化指定标签列表的请求,标签名称中不允许使用逗号字符。

对于数据库模式,以下表结构就足够了

CREATE TABLE node_tags (
    node_id INT(11) NOT NULL,
    tag VARCHAR(255) CHARACTER SET utf8 NOT NULL,
    PRIMARY KEY (node_id, tag),
    KEY (tag),
    FOREIGN KEY (node_id)
      REFERENCES nodes(id)
      ON DELETE CASCADE,
)

REST API 影响

我们将遵循 API 工作组关于标签的规范,而不是自行发明。

将支持寻址单个标签。

RPC API 影响

状态机影响

客户端 (CLI) 影响

添加标签 CRUD 操作命令

  • ironic node-tag-list <node uuid>

  • ironic node-tag-update <node uuid> <op> <tags>

<op> 操作:‘add’ 或 ‘remove’

对于单个标签:* ironic node-tag-add <node uuid> <tag> * ironic node-tag-remove <node uuid> <tag>

在 node-list 命令中添加标签列表过滤支持

  • ironic node-list –tag tag1 –tag tag2

  • ironic node-list –tag-any tag1 –tag-any tag2

  • ironic node-list –not-tag tag3

多个 –tag 将用于以 AND 表达式过滤结果,而 –tag-any 用于 OR 表达式,允许通过 –not-tag 选项进行排除标签。

驱动程序 API 影响

Nova 驱动程序影响

标签信息可用于 nova,但本规范不将其考虑在内,可能会在以后解决。

Ramdisk 影响

N/A

安全影响

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

niu-zglinux

工作项

  • 添加 node_tags 表并进行迁移。

  • 添加用于 node 标签 CRUD 操作的 DB API 层。

  • 添加了用于 node 标签列表过滤支持的 DB API 层。

  • 添加 NodeTag、NodeTagList 对象以及 Node 对象中的新 tags 字段。

  • 添加用于 node 标签 CRUD 操作的 REST API。

  • 添加用于 node 标签列表过滤支持的 REST API。

  • python-ironicclient 的添加和修改。

依赖项

测试

添加单元测试。添加 tempest API 测试。

升级和向后兼容性

添加数据库迁移脚本。

文档影响

Ironic API 和 python-ironicclient 需要更新以配合此更改。

参考资料

  1. https://specs.openstack.org/openstack/api-wg/guidelines/tags.html