限制数据库实例的卷类型¶
不同的卷类型具有不同的成本和性能特征。操作员希望能够像限制数据库到特定的 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 中所有可用的卷类型,以及显示指定卷类型的详细信息。
将添加测试来执行新的代码路径。
问题¶
在当前的 flavor 实现中(用作此 volume_type 实现的模板),list_datastore_version_flavor_associations (datastore/models.py) 方法返回的值与在 create() 调用中找到的将接受的 flavor 之间存在差异。
这已通过调用 datastore/models 方法来列出有效的卷类型关联来解决。
卷类型从未与实例一起存储,因此在显示实例时,无法确定创建时指定的 volume_type。
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 版本过滤,以仅显示有效值。
升级影响¶
没有升级影响。我们没有添加或更改任何现有表的结构。现有的代码无法创建可能与此提议的功能冲突的映射(所有现有代码都使用 ‘flavor’ 键创建映射)。
依赖项¶
无
测试¶
将添加新的测试。
文档影响¶
是的,将提供有关添加、删除和列出映射的机制的文档。
参考资料¶
附录¶
无