限制数据库实例的卷类型

不同的卷类型具有不同的成本和性能特征。操作员希望能够像限制数据库到特定的 Nova flavor 一样,将特定的数据库限制到特定的卷类型。

Launchpad Blueprint: https://blueprints.launchpad.net/trove/+spec/associate-volume-type-datastore

问题描述

操作员可以创建不同的卷类型,用户可以在创建实例请求中指定卷类型。操作员希望能够像限制 Nova flavor 一样,限制可以用于特定 datastore-version 的卷类型。

提议的变更

将 flavor 与 datastore 关联的实现 1 2 创建了一个通用的框架,用于指定 datastore-version-metadata。这些 metadata 存储在数据库中的一个名为 datastore_version_metadata 的表中。

 CREATE TABLE `datastore_version_metadata` (
              `id` varchar(36) NOT NULL,
              `datastore_version_id` varchar(36) DEFAULT NULL,
              `key` varchar(128) NOT NULL,
              `value` varchar(128) DEFAULT NULL,
              `created` datetime NOT NULL,
              `deleted` tinyint(1) NOT NULL,
              `deleted_at` datetime DEFAULT NULL,
              `updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UQ_datastore_version_metadata_datastore_version_id_key_value` (
              `datastore_version_id`,`key`,`value`),
CONSTRAINT `datastore_version_metadata_ibfk_1`
FOREIGN KEY (`datastore_version_id`)
REFERENCES `datastore_versions` (`id`)
ON DELETE CASCADE)

CREATE TABLE `datastore_versions` (
             `id` varchar(36) NOT NULL,
             `datastore_id` varchar(36) DEFAULT NULL,
             `name` varchar(255) DEFAULT NULL,
             `image_id` varchar(36) NOT NULL,
             `packages` varchar(511) DEFAULT NULL,
             `active` tinyint(1) NOT NULL,
             `manager` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ds_versions` (`datastore_id`,`name`),
CONSTRAINT `datastore_versions_ibfk_1`
FOREIGN KEY (`datastore_id`)
REFERENCES `datastores` (`id`))

CREATE TABLE `datastores` (
             `id` varchar(36) NOT NULL,
             `name` varchar(255) DEFAULT NULL,
             `default_version_id` varchar(36) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`))

代码通过在 datastore_version_metadata 表中使用 ‘flavor’ 键来填充 flavor 到 datastore-version 的映射。我们建议通过在同一个表中添加 ‘volume-type’ 键来扩展此功能。

我们扩展了 trove-manage 命令,并提供了两个新命令来添加和删除 volume-type 映射。此外,建议添加两个新命令来列出现有的关联。这些列表命令将利用现有的方法(列出 datastore 版本 flavor 关联)。

将进行更改以添加新的映射,有关详细信息,请参阅下面的公共 API 部分。该端点将提供给定 tenant_id、datastore 和 datastore 版本允许的所有卷类型的列表。

通过添加新的异常类,将提供合适的错误消息。一个错误是给定 datastore-version 和 volume-type 之间缺少映射,另一个是存在映射的情况。

datastore 版本 metadata 模型 (trove/datastore/models.py) 具有处理现有 flavor 映射的代码。此代码将被重构,以扩展 metadata 映射以同时支持 volume type。

将在 WSGI 端点中引用的服务类将被添加。

由于我们将扩展现有的 metadata 功能,因此不需要新的数据库表。

在实例创建期间,将添加一个检查来检查是否指定了 volme 类型。如果提供的卷类型未被发现是指定 datastore 版本的有效卷类型,将报告错误。

目前卷类型支持不扩展到集群创建 API。

由于此更改将返回卷类型信息,因此将添加 VolumeType 和 VolumeTypes 的服务、模型和视图。

如果未配置 datastore/version/volume-type,则允许 cinder 已知的 所有 volume-type。

将提供一个 python-troveclient 命令来列出 datastore/version/volume-type 关联。它将调用新的公共 API 并显示结果。

将提供一个 trove-manage 命令来列出 datastore/version/volume-type 关联。它将仅列出数据库中的关联,而不会与有效的 cinder volume-type 相交。

trove-manage 命令不执行任何验证,它不会检查 cinder 是否实际知道指定的 volume-type。并且 volume-type 一旦在 trove 中定义,以后可能会被 cinder 删除。因此,有可能 trove metadata 表中的卷类型关联会变得陈旧。因此,实现依赖于定义的映射和允许的映射的概念。

定义的映射是用户在 metadata 表中指定的内容。允许的映射是定义的映射和有效的 cinder volume type 的交集。

如果 datastore 不支持卷,则此规范中描述的所有检查都是无效的。

当用户为特定的 datastore 和版本定义了映射时(并且启用了卷支持),我们会查看是否存在任何允许的映射。如果没有,则会生成一个不同的错误消息,指示找不到有效的卷类型。

如果有定义的卷类型,我们会确保指定了卷类型并且它是允许的卷类型之一。

还将添加新的 API 来列出 cinder 中所有可用的卷类型,以及显示指定卷类型的详细信息。

将添加测试来执行新的代码路径。

问题

  1. 在当前的 flavor 实现中(用作此 volume_type 实现的模板),list_datastore_version_flavor_associations (datastore/models.py) 方法返回的值与在 create() 调用中找到的将接受的 flavor 之间存在差异。

    这已通过调用 datastore/models 方法来列出有效的卷类型关联来解决。

  2. 卷类型从未与实例一起存储,因此在显示实例时,无法确定创建时指定的 volume_type。

  3. volume_type 在 create 调用中不是必需的。如果 datastore/version/volume_type 存在关联,并且 create 中未指定 volume_type,则将使用 cinder 默认值。另一种选择是使 volume_type 成为必需的,这将是对 API 的更改。

    如已实现,如果在 create 中指定了 volume_type,则它必须在允许的卷类型列表中。猜测卷类型是另一种选择,如果允许多个卷类型,则必须提供默认值。这尚未实现。

配置

数据库

不需要数据库更改。

公共 API

此更改将添加以下公共 API

列出所有卷类型

此 API 将返回 cinder 报告的所有卷类型。

请求

GET /{tenant_id}/volume-types

响应

{
    "volume_types": [
        {
            "is_public": true,
            "description": "Example volume type",
            "id": <id>,
            "name": "example_volume_type"
        }
    ]
}

显示卷类型详细信息

此 API 将返回 cinder 报告的指定卷类型的详细信息。

请求

GET /{tenant_id}/volume-types/{id}

响应

{
    "volume_type": {
        "is_public": true,
        "description": null,
        "id": "53c71e3d-ef8f-4967-8b16-8a0ee6380d66",
        "name": "lvmdriver-1"
    }
}

列出允许的 datastore 版本卷类型

此 API 将返回给定 tenant_id、datastore 和 datastore vesion 支持的所有卷类型。如果未配置关联,则返回 cinder 已知的 所有卷类型。

请求

GET /{tenant_id}/datastores/{datastore}/versions/{version_id}/volume-types

响应

{
    "volume_types": [
        {
            "is_public": true,
            "description": "Example volume type",
            "id": <id>,
            "name": "example_volume_type"
        }
    ]
}

公共 API 安全

此更改没有 API 安全问题。

Python API

没有更改。

CLI (python-troveclient)

trove-manage 命令将是唯一受影响的命令,如上所述。

内部 API

无。

Guest Agent

备选方案

考虑到的一个替代方案是将 datastore 与支持的卷类型关联(而不是 datastore-version)。这将导致几乎完全重新实现为 flavor 创建的 metadata 链接方案。

Dashboard 影响 (UX)

创建对话框卷类型下拉菜单将根据所选 datastore 版本过滤,以仅显示有效值。

实现

负责人

主要负责人

mvandijk

里程碑

完成目标里程碑

N-Release-1

工作项

如“Proposed Change”部分中详细描述。

升级影响

没有升级影响。我们没有添加或更改任何现有表的结构。现有的代码无法创建可能与此提议的功能冲突的映射(所有现有代码都使用 ‘flavor’ 键创建映射)。

依赖项

测试

将添加新的测试。

文档影响

是的,将提供有关添加、删除和列出映射的机制的文档。

附录