私有卷类型

https://blueprints.launchpad.net/cinder/+spec/private-volume-types

Cinder 卷类型对所有用户可见,无论其项目如何。

此蓝图建议引入私有卷类型。

问题描述

某些卷类型应该仅受限制。例如,正在尝试新技术时的测试卷类型,或为特殊需求提供的超高性能卷,大多数用户不应能够选择这些卷。

用例

提议的变更

Nova 中的 flavor 的 is_public 标志采用了类似的方法。我们应该利用 Nova 中完成的工作并将其移植到 Cinder 卷类型中。

目前卷类型没有与之关联的所有者。出于各种原因,此功能不建议引入所有者,其中之一是无法找到现有卷类型的原始所有者。

建议的方法是 Nova 中已经存在的方法

  • 卷类型默认是公开的

  • 通过在创建时将 is_public 布尔字段设置为 False,可以创建私有卷类型。

  • 可以通过添加或删除项目来控制对私有卷类型的访问。

  • 没有项目的私有卷类型仅对具有 admin 角色/上下文的用户可见。

备选方案

目前没有已知的替代方法来限制对卷类型的访问。

数据模型影响

数据库模式更改

  • 将在 volume_types 表中添加一个新的 is_public 布尔列。

  • 将创建一个新的 volume_type_projects 表,用于存储具有对特定卷类型访问权限的项目。对于每个 volume_type_id 和 project_id 组合,volume_type_projects 表中将有一条记录。这将是一种多对多关系。

mysql> DESC volume_types;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| created_at   | datetime     | YES  |     | NULL    |       |
| updated_at   | datetime     | YES  |     | NULL    |       |
| deleted_at   | datetime     | YES  |     | NULL    |       |
| deleted      | tinyint(1)   | YES  |     | NULL    |       |
| id           | varchar(36)  | NO   | PRI | NULL    |       |
| name         | varchar(255) | YES  |     | NULL    |       |
| qos_specs_id | varchar(36)  | YES  | MUL | NULL    |       |
| is_public    | tinyint(1)   | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

mysql> DESC volume_type_projects;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| created_at     | datetime     | YES  |     | NULL    |                |
| updated_at     | datetime     | YES  |     | NULL    |                |
| deleted_at     | datetime     | YES  |     | NULL    |                |
| volume_type_id | varchar(36)  | YES  | MUL | NULL    |                |
| project_id     | varchar(255) | YES  |     | NULL    |                |
| deleted        | tinyint(1)   | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

数据库数据迁移

  • 现有的卷类型将被标记为公开 (is_public=1)

REST API 影响

  • 扩展卷类型创建响应以包含 is_public 字段

  • 扩展卷类型列表以包含 is_public 字段

  • 扩展卷类型详细信息以包含 is_public 字段

  • 添加列出具有对特定卷类型访问权限的项目列表的功能

  • 添加向特定卷类型添加/删除项目访问权限的功能

  • 添加新扩展的策略

安全影响

此更改引入了私有卷类型概念。

通知影响

其他最终用户影响

  • 应更新 Horizon 以支持此新扩展。

  • 应更新 python-cinderclient 以允许使用此新扩展。

建议的 python-cinderclient shell 接口

type-access-add --volume-type <type> --project-id <project_id>
   Add type access for the given project.

type-access-list --volume-type <type>
   Print access information about the given type.

type-access-remove --volume-type <type> --project-id <project_id>
   Remove type access for the given project.

性能影响

该扩展在所有返回的卷中添加了一个 is_public 字段。

应特别注意不要为每个卷列表生成 N 个请求。可以通过 API 层的缓存机制轻松解决此问题。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

mgagne

其他贡献者

工作项

  • 实现 os-volume-type-access Cinder 扩展

  • 向 python-cinderclient 添加对 os-volume-type-access 扩展的支持

  • 向 Horizon 添加对 os-volume-type-access 扩展的支持

依赖项

测试

  • Nova 中 flavor 已经存在的单元测试将被移植到 Cinder 卷类型中。

  • 应将用例添加到 Tempest。

文档影响

  • 需要记录新的 os-volume-type-access Cinder 扩展。

参考资料