元数据定义标签目录

https://blueprints.launchpad.net/glance/+spec/metadefs-tags

此蓝图添加了基本标签目录,此前由于时间限制,它在 Juno 版本中被推迟。最初批准的规范包括在元数据定义目录中支持标签库。然而,在 Juno 版本结束时,原始规范被更新为移除标签,因为它们尚未实现。

此规范实际上是对原始批准的 Juno 规范中标签概念的简化。在原始 Juno 规范中,标签具有动态层次结构能力。此规范不包含标签层次结构,以简化规范。标签的这一方面将推迟到后续规范中。

已实现的 Juno 规范在此处供参考

https://github.com/openstack/glance-specs/blob/master/specs/juno/metadata-schema-catalog.rst

问题描述

使用 OpenStack 的一个挑战是在服务和不同类型的资源之间发现、共享和关联标签。我们认为这会影响最终用户和管理员。

例如,云运营商或供应商可能有一组预定义的“标签”,他们希望将其用作镜像和实例的起点。目前,OpenStack 没有为云运营商包含该基本标签集的机制。这意味着每个部署和每个项目最终都会拥有自己不同的标签集。这会导致不一致,也会给最终用户带来额外的麻烦,因为他们最终需要在每个项目中重新发明所有“标签”。

例如,标签“postgres”与“PostgreSQL”相同吗?如果使用基本的标签库,任何用户输入“pos”都会被提示已存在于标签库中的那个标签并选择它。未来基于标签的搜索将确保一致的结果。

术语

“元数据”一词可能变得非常冗余和令人困惑。这项提议的增强功能是设置为“标签”(仅名称)的附加元数据,跨各种工件和 OpenStack 服务。

不同的 API 可能会以不同的方式使用标签和键/值对。标签通常不用于驱动运行时行为。然而,键/值对通常被系统用于潜在地驱动运行时,例如调度、服务质量或驱动程序行为。

今天的一些元数据示例

Nova

Cinder

Glance

风味
  • 额外的规格

主机聚合
  • metadata

实例
  • metadata

  • tags

卷 & 快照
  • 镜像元数据

  • metadata

VolumeType
  • 额外的规格

  • qos 规格

镜像 & 快照
  • properties

  • tags

提议的变更

我们正在提议增强元数据定义目录。以下子部分详细介绍了对目录的增强。

标签

一个可能的标签目录,可用于帮助确保用户、资源类型和服务之间的一致性。因此,当用户要在资源上应用标签时,他们可以选择创建新标签或选择在系统其他类型的资源上已经使用过的标签。例如,相同的标签可以用于镜像、卷和实例。标签不区分大小写(BigData 等同于 bigdata,但不同于 Big-Data)。

备选方案

一个关键用例是使用通用目录协作标签。这补充了在所有服务中临时添加标签。我们认为元数据 API 也可以由跨服务的搜索索引器支持,以包含临时元数据以及定义的元数据。然而,这并非此蓝图的重点。

数据模型影响

这将使用关系数据库,并存在于现有的 Glance 元数据定义目录的同一数据库中。它将添加到现有模式中。

以下 DB 模式是初始建议的模式。我们将在代码审查期间改进并接受评论。

建议的基本模式

CREATE TABLE `metadef_tags` (
  `id`                     int(11) NOT NULL AUTO_INCREMENT,
  `namespace_id`           int(11) NOT NULL,
  `name`                   varchar(80) NOT NULL,
  `created_at`             timestamp NOT NULL,
  `updated_at`             timestamp
)

此版本不包含标签描述。

REST API 影响

在 REST API 中,所有内容都通过命名空间和名称引用,而不是合成 ID。这有助于实现可移植性(使用 JSON 进行导入/导出)。

API 应该允许粗粒度和细粒度访问信息,以便控制数据传输带宽要求。

使用命名空间的基本交互是

  1. 根据所需的过滤器获取带有概述信息的命名空间列表。

  2. 获取标签

常见响应代码

  • 创建 成功:201 Created

  • 修改成功:200 OK

  • 删除 成功:204 No Content

  • 失败:400 Bad Request,包含详细信息。

  • 禁止:403 Forbidden

  • 未找到:404 Not found 如果未找到特定实体

API 版本

所有 URL 都在 v2 Glance API 下。如果未明确指定,则假定 /v2/<url>

命名空间可以选择性地包含以下内容,除了基本字段。

  • resource_types

  • properties

  • 对象

  • tags

此规范添加了标签。

标签

列出命名空间中的所有标签

GET /metadefs/namespace/{namespace}/tags

通过添加查询参数进行过滤

limit          = Use to request a specific page size. Expect a response
                 to a limited request to return between zero and limit items.
marker         = Specifies the name of the last-seen tag.
                 The typical pattern of limit and marker is to make an initial
                 limited request and then to use the last tag from the
                 response as the marker parameter in a subsequent limited
                 request.

设计说明:我们希望有一种格式,允许在不更改基本响应的情况下添加其他信息,例如描述。因此,我们为每个标签使用了字典,而不是仅仅使用标签的平面列表。

示例正文

{
    "tags": [
        {
            "name": "Databases"
        },
        {
            "name": "BigData"
        },
        {
            "name": "MySQL",
        },
        {
            "name": "PostgreSQL",
        },
        {
            "name": "MongoDB",
        }
    ]
}
创建/替换特定命名空间中的所有标签

POST /metadefs/namespaces/{namespace}/tags/

在特定命名空间中添加标签

POST /metadefs/namespaces/{namespace}/tags/{tag}

删除特定命名空间中的标签

DELETE /metadefs/namespaces/{namespace}/tags/{tag}

删除特定命名空间中的所有标签

DELETE /metadefs/namespaces/{namespace}/tags

安全影响

通知影响

其他最终用户影响

我们打算通过 Horizon 公开此功能,并且正在进行相关的蓝图工作。

根据需要更新 python-glanceclient。

性能影响

预计没有。

当管理员想要将标签注释到镜像和实例等事物上时,预计会从 Horizon 调用此 API。他们将击中此 API 以获取可用标签或创建新标签。

其他部署者影响

新 API 的 DB 模式创建

默认/示例标签库将签入 Glance。

部署者可以自定义这些并提供适合其云部署的其他定义文件。

glance-manage 将包含加载标签。

开发人员影响

无(新 API)

实现

负责人

主要负责人

wayne-okuma

其他贡献者

评审人员

核心评审人

zhiyan

其他审核员

lakshmi-sampath travis-tripp

工作项

将对以下内容进行更改

  1. 数据库 API 层以添加对标签的 CRUD 操作的支持

  2. REST API 用于命名空间(添加标签)的 CRUD 操作

  3. REST API 用于标签的 CRUD 操作

  4. python-glanceClient 以支持操作

  5. glance-manage 以处理标签

依赖项

与 Glance 相同的依赖项。

测试

将为所有可能的代码添加单元测试,目标是尽可能地隔离功能。

将在可能的情况下添加 Tempest 测试。

文档影响

需要有关新 API 扩展和用法的文档

参考资料

Youtube summit 回顾 Graffiti Juno POC 演示,其中包含标签。

当前 glance 元数据定义目录文档。

简单的应用程序类别标签(无层次结构)

可以将镜像、卷和软件应用程序分配给一个类别。同样,flavor 或主机聚合可以“标记”为支持应用程序类别,例如“BigData”或“Encryption”。通过匹配类别,可以轻松地将支持该应用程序类别的 flavor 或主机聚合配对起来。

注意:如果资源类型不提供“标签”机制(仅键值对),则应添加一个蓝图以支持该类型资源的标签。在没有该蓝图的情况下,可以将一个键“tags”设置为资源上的逗号分隔的标签列表。