暴露用户可见的卷类型额外规格¶
https://blueprints.launchpad.net/cinder/+spec/expose-user-visible-extra-specs
本规格建议定义一类用户可见的额外规格。当列出额外规格、显示卷类型或额外规格时,这些规格将向普通用户(keystone 项目中的成员或读者)展示。
问题描述¶
目前 Cinder 仅允许云管理员查看卷类型中的额外规格。这对于控制驱动程序使用的配置、选择特定后端或以其他方式暴露后端细节的规格来说是合理的。但对于后端无关的额外规格,例如 multiattach 或 RESKEY:availability_zones – 这些规格在用户选择用于创建卷的卷类型时,携带关键信息,这会造成问题。
针对此问题的传统解决方案是,云管理员应将这些关键信息添加到卷类型的 description 字段中,或在云的用户文档中提供这些信息。
无论人们如何看待这种解决方案对于人类用户是否足够,当最终用户是自动化代理时,它显然会失效。
用例¶
OpenShift 集群存储操作员是设置底层基础设施上 Kubernetes Storage Classes 的自动化代理。当该基础设施由 OpenStack 提供时,Cinder CSI 操作员将为每个 Cinder 卷类型创建一个 Storage Class。OpenShift 用户随后在动态配置用于容器化应用程序的 Persistent Volumes 时,在 Persistent Volume Claims 中引用这些 Storage Classes。
当通过具有 ReadWriteMany 访问模式的 Cinder CSI 配置持久卷时,持久卷声明应指定 block volumeMode(默认值为 filesystem)并引用与具有 "multiattach": "<is> True" 额外规格的 Cinder 卷类型对应的 Storage Class。
由于 OpenShift 管理员和代表他们运行的所有软件通常只是普通的 OpenStack 用户,而不是 OpenStack 管理员,因此他们目前无法发现与其 Storage Classes 对应的卷类型的额外规格,并且在为 OpenShift 用户“做好正确的事情”方面受到阻碍。
Cinder CSI 现在也具有 topology 功能,在设置与卷类型对应的 Storage Classes 时,能够查看 RESKEY:availability_zones 额外规格可能是有意义的。
提议的变更¶
在 Cinder 代码中定义一组 用户可见 额外规格,并修改 REST API 视图以显示额外规格,以便在基于策略的请求上下文中暴露这些规格。初始的 用户可见 额外规格集足以建立一个框架,并满足用例中描述的直接需求。该集合有意较小,并利用现有的额外规格。以下额外规格键应被视为 用户可见
multiattachRESKEY:availability_zonesreplication_enabled
用户可见 额外规格集将是 Cinder 代码中定义的固定列表,可以扩展,但只能通过增强代码来实现。未来的更新可以支持可以使用额外规格表示的其他卷特性。例如,让用户知道某个卷类型是否提供支持在线扩展的卷可能是有用的,但目前没有与该特性相关的额外规格。
REST API 行为将基于策略,不需要新的微版本。访问额外规格的现有策略将保持不变,但默认值将更改为授予授权用户的访问权限。新的策略将确定是否授予对所有额外规格的访问权限,或者仅授予对 用户可见 额外规格的访问权限。这些策略将允许用户查看额外规格,但视图将限制为被认为是 用户可见 的额外规格。新的策略将控制对所有额外规格的访问权限,包括那些是 用户可见 的规格。
访问额外规格的当前策略(及其默认值)是
策略 |
默认值 |
|---|---|
volume_extension:access_types_extra_specs |
仅限管理员 |
volume_extension:types_extra_specs:index |
仅限管理员 |
volume_extension:types_extra_specs:show |
仅限管理员 |
建议的策略及其新的默认值将是
策略 |
默认值 |
|---|---|
volume_extension:access_types_extra_specs |
任何授权用户 |
volume_extension:types_extra_specs:index |
任何授权用户 |
volume_extension:types_extra_specs:show |
任何授权用户 |
volume_extension:types_extra_specs:read_sensitive |
仅限管理员 |
新的 volume_extension:types_extra_specs:read_sensitive 策略将控制是否授予对所有额外规格的访问权限,或者是否限制为仅 用户可见 额外规格。在此规格中,新的策略将简称为 read_sensitive。
备选方案¶
构建一个新的 API 以返回卷类型中的用户可见功能和特性,而无需将其作为“额外规格”暴露。虽然这种替代方案也可以解决问题,但它需要编写、测试和记录更多的代码。
完全通过策略控制每个单独额外规格的暴露。我们认为,这样做需要对现有的 REST API 进行重大更改,而且也不可取。存在明确的后端无关能力和特性的例子,这些能力和特性是任何有权创建卷的用户应有的业务,因此用户应合理期望能够发现这些信息,而无需让云管理员为它们逐个构建策略。
引入新的 volume_extension:types_extra_specs:read_sensitive 策略,但现有策略保持默认值为仅限管理员。缺点是这将要求云管理员修改 用户可见 额外规格的默认策略,以便它们可用于非管理 API 请求。但是,整个前提是 用户可见 额外规格,按定义,旨在对用户可见。云管理员不应需要选择加入才能从该功能中受益。希望保留当前行为(用户无权查看任何额外规格)的云管理员,可以通过显式将这些策略设置为仅限管理员(以前的默认值)来执行此操作。
volume_extension:access_types_extra_specs
volume_extension:types_extra_specs:index
volume_extension:types_extra_specs:show
数据模型影响¶
无
REST API 影响¶
受此规格影响的 REST API 是
/v3/{project_id}/types
/v3/{project_id}/types/{volume_type_id}
/v3/{project_id}/types/{volume_type_id}/extra_specs
/v3/{project_id}/types/{volume_type_id}/extra_specs/{key}
以下示例记录了具有两个额外规格的卷类型的行为
multiattach(一个用户可见额外规格)volume_backend_name(只有在上下文满足read_sensitive策略时才可见)
GET /v3/{project_id}/types¶
此 REST API 返回一个卷类型列表,以下示例仅显示单个卷类型。当上下文不满足 read_sensitive 策略时,extra_specs 字段包含在内,但仅存在 用户可见 条目。
策略 |
上下文 |
|---|---|
volume_extension:access_types_extra_specs |
True |
volume_extension:types_extra_specs:read_sensitive |
False |
{
"volume_types": [
{
"id": "6685584b-1eac-4da6-b5c3-555430cf68ff",
"qos_specs_id": null,
"name": "vol-type-001",
"description": "volume type 0001",
"os-volume-type-access:is_public": true,
"is_public": true,
"extra_specs": {
"multiattach": "<is> True"
}
}
]
}
当 read_sensitive 策略得到满足时(默认情况下,只有管理员才能满足),将返回完整的 extra_specs 列表。
策略 |
上下文 |
|---|---|
volume_extension:access_types_extra_specs |
True |
volume_extension:types_extra_specs:read_sensitive |
True |
{
"volume_types": [
{
"id": "6685584b-1eac-4da6-b5c3-555430cf68ff",
"qos_specs_id": null,
"name": "vol-type-001",
"description": "volume type 0001",
"os-volume-type-access:is_public": true,
"is_public": true,
"extra_specs": {
"multiattach": "<is> True",
"volume_backend_name": "SecretName"
}
}
]
}
GET /v3/{project_id}/types/{volume_type_id}¶
REST API 显示指定的卷类型的详细信息,行为与 /v3/{project_id}/types API 类似。
extra_specs字段将包含任何用户可见额外规格。当
read_sensitive策略得到满足时,将返回完整的extra_specs列表。
GET /v3/{project_id}/types/{volume_type_id}/extra_specs¶
该策略将更新为允许任何授权用户访问此 API。但是,与上述类似,对于非 read_sensitive 请求,extra_specs 列表将限制为那些是 用户可见 的规格。
策略 |
上下文 |
|---|---|
volume_extension:types_extra_specs:index |
True |
volume_extension:types_extra_specs:read_sensitive |
False |
{
"extra_specs": {
"multiattach": "<is> True"
}
}
如果指定的卷类型没有定义的 用户可见 额外规格,则将返回一个空字典。
{
"extra_specs": {}
}
如果由管理员发出请求,响应将是完整的额外规格集(与当前行为无变化)。
策略 |
上下文 |
|---|---|
volume_extension:types_extra_specs:index |
True |
volume_extension:types_extra_specs:read_sensitive |
True |
{
"extra_specs": {
"multiattach": "<is> True",
"volume_backend_name": "SecretName"
}
}
GET /v3/{project_id}/types/{volume_type_id}/extra_specs/{key}¶
当指定的 extra-specs {key} 位于 用户可见 集中时,无论请求者是否满足 read_sensitive 策略,都将返回该值。
策略 |
上下文 |
|---|---|
volume_extension:types_extra_specs:show |
True |
volume_extension:types_extra_specs:read_sensitive |
N/A |
{
"multiattach": "<is> True"
}
对于非 用户可见 额外规格的请求的响应将取决于上下文。如果请求满足 read_sensitive 策略,则返回适当的响应。
策略 |
上下文 |
|---|---|
volume_extension:types_extra_specs:show |
True |
volume_extension:types_extra_specs:read_sensitive |
True |
{
"volume_backend_name": "SecretName"
}
但是,如果请求不满足 read_sensitive 策略,则 API 将返回 404 NOTFOUND。返回 404(而不是 403)可以防止泄露 read_sensitive 额外规格键的名称。
策略 |
上下文 |
|---|---|
volume_extension:types_extra_specs:show |
True |
volume_extension:types_extra_specs:read_sensitive |
False |
{
"itemNotFound": {
"code": 404
"message": "Volume Type 6685584b-1eac-4da6-b5c3-555430cf68ff has no extra specs with key volume_backend_name."
}
}
安全影响¶
无。 用户可见 额外规格集是硬编码的,不包括暴露后端细节的额外规格。
Active/Active HA 影响¶
无。REST API 层更改,没有锁定或排除或服务重启影响。
通知影响¶
无 – 不涉及异步操作。
其他最终用户影响¶
Cinderclient 和 OSC 和 Horizon 不需要更改。普通用户将看到一些新信息,但不需要新字段。
性能影响¶
无
其他部署者影响¶
对 OpenStack 部署工具或部署计划/设计没有影响。
开发人员影响¶
对 OpenStack 开发没有影响,超出此更改的范围。
实现¶
负责人¶
主要负责人:abishop
工作项¶
定义用户可见的额外规格列表。
定义
read_sensitive策略,并修改控制访问额外规格的现有默认策略规则,以允许访问任何授权用户。根据此规格更新 API 响应。
修改单元测试,以检查在没有
read_sensitive授权的情况下,是否准确且仅暴露用户可见的额外规格。Tempest 测试
依赖项¶
测试¶
cinder-tempest-plugin 中的新 tempest 测试
文档影响¶
在 Cinder Administration 中添加一个部分,定义和列出用户可见的额外规格。描述新的
read_sensitive策略,并解释策略设置,这些设置将为操作员提供“传统”行为。更新 API 参考
参考资料¶
无