私有卷类型¶
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 扩展。