支持修改卷镜像元数据

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/python-cinderclient/+spec/support-modify-volumn-image-metadata

此蓝图旨在支持修改卷镜像元数据,提供 Cinder API 以允许用户修改镜像属性或添加新属性。

Cinder 应该提供与 Glance 类似的受保护属性机制,这是 IRC 和邮件列表讨论中达成的共识。

问题描述

从镜像创建可启动卷时,镜像元数据(属性)会被复制到名为 volume_image_metadata 的卷属性中。

Cinder volume_image_metadata 是 Nova 查看并用于调度以及传递给各个计算驱动程序的可启动卷上的元数据。

Cinder volume_image_metadata 被 nova 用于诸如调度和设置设备驱动程序选项等目的。nova 将 volume_image_metadata 视为镜像上的属性。这些信息可能需要在卷从镜像创建后更改,此外,还需要使附加属性在调度程序中可用(如下部分所述)。因此,应该有一种方法来支持更改/更新镜像元数据。

用例

以下是一些如果设置了将影响 Nova 处理启动卷的运行时特性的元数据属性类型。其中许多属性很可能是一个用户决定基本上使用卷构建新镜像,但他们希望在构建过程中调整各种处理属性。或者他们可能只是有一个可启动卷,他们想修改其中一些属性。

超visor 选择:OpenStack Compute 支持许多超visor,尽管大多数安装仅使用一个超visor。对于具有多个受支持超visor的安装,您可以使用 ImagePropertiesFilter 调度不同的超visor。此过滤器计算节点满足实例镜像属性(也包括 volume_image_properties)上指定的任何架构、超visor 类型或虚拟机模式属性。

虚拟 CPU 拓扑:这为暴露给客户机的虚拟 CPU 实例提供了首选的 socket/core/thread 计数。这能够避免命中 OS 供应商对其产品施加的 vCPU 拓扑限制。另请参见:http://git.openstack.org/cgit/openstack/nova-specs/tree/specs/juno/virt-driver-vcpu-topology.rst

看门狗行为:对于 libvirt 驱动程序,您可以为每个 flavor 启用并设置虚拟硬件看门狗设备的行为。看门狗设备会监视客户机服务器,并在服务器挂起时执行配置的操作。看门狗使用 i6300esb 设备(模拟 PCI Intel 6300ESB)。如果未指定 hw_watchdog_action,则看门狗将被禁用。使用特定镜像的属性设置的看门狗行为将覆盖使用 flavor 设置的行为。

关机行为:许多事情即将到来:https://review.openstack.org/#/c/89650/12 Juno 中着陆的内容:默认情况下,客户机将获得 60 秒的时间来执行优雅关机。之后,虚拟机将被关闭。os_shutdown_timeout 属性允许覆盖允许客户机操作系统干净关机的时间量(单位:秒),然后再关机。值为 0(零)表示客户机将立即关机,没有客户机操作系统清理的机会。

最小 Flavor 要求:最小所需的 CPU、最小 RAM。这些被 Horizon UI 用于指导 flavor 选择。安装了新软件的可启动卷的用户可能在克隆到镜像之前,可以尝试设置最小要求。

新的 Horizon UI 将为管理员和用户提供有关镜像、flavor、卷的更多信息,利用元数据并从定义目录查找有关元数据的丰富信息以向用户和管理员显示信息。这可以包括有关卷上软件的元数据。

提议的变更

这仅影响单个卷,与卷类型无关

我们建议对 Cinder 进行更改以添加更新功能并提供新的 Cinder API 以允许用户更新镜像属性。

由于 Glance 对某些特定属性具有 RBAC(基于角色的访问控制),因此建议将 RBAC 配置文件从 Glance 复制到 Cinder,并将受保护的属性代码从 Glance 同步到 Cinder(Glance 乐于接受代码清理以使其更容易;我们可以考虑 OSLO 或将来其他方法,但这对于现在来说是一个繁重的过程,复制和粘贴就可以了)。

备选方案

关于受保护属性的策略,一个建议是从 Glance 到 Cinder 提供新的 API 以查询 Glance 中受保护或每个属性的属性,但这种方法似乎会增加 Glance 的负载。

数据模型影响

REST API 影响

由于仅镜像元数据被 nova 用于 VM 调度或设置设备驱动程序选项,因此我们建议在 Cinder 中添加新的 REST API 以用于卷的镜像元数据操作。

  • 更新引用卷的镜像元数据

常见 http 响应代码

  • 修改成功:200 OK

  • 失败:400 Bad Request,包含详细信息。

  • 禁止:403 Forbidden

    例如,没有权限更新特定的元数据

  • 未找到:501 Not Implemented

    例如,服务器不识别请求方法

  • 未找到:405 Not allowed

    例如,HEAD 不允许在此资源上

更新卷镜像元数据

  • 方法类型 PUT

  • API 版本

    PUT /v2/{project_id}/volumes/{volume_id}/image_metadata
    
  • JSON schema 定义

    {
       "image_metadata": {
           "key": "v2"
       }
    }
    

    要取消设置镜像元数据键值,仅指定键名。要设置镜像元数据键值,指定键值对。

安全影响

通知影响

其他最终用户影响

  • 我们打算通过 Horizon 公开此功能,并且正在进行相关的蓝图工作。

  • Glance 还需要与 Cinder 共享其属性保护代码,并在 Glance 的 IMPL 中进行一些代码清理。

  • 提供 Cinder API 以允许用户更新镜像属性。触发更新的 CLI-python API。

    # Sets or deletes volume image metadata
    cinder image-metadata  <volume-id> set <property-name = value>
    

性能影响

预计没有。

其他部署者影响

  • 将添加两个配置文件到 Cinder,即 property-protections- policies.conf 和 property-protections-roles.conf 这些文件默认情况下将被放在“/etc/cinder”中,可以通过 cinder.conf 配置或直接指向 devstack 中的 Glance 文件进行配置。

  • 部署者负责使配置文件与 Glance 的配置文件保持同步

  • 配置文件仅在系统上存在时才生效。因此,部署者有责任确保它们准确无误。否则,默认情况下,OpenStack 环境对 Cinder 没有影响。

开发人员影响

实现

负责人

主要负责人

Dave Chen (wei-d-chen)

其他贡献者

工作项

对 Cinder 的更改

  1. 定义 Cinder 中的属性保护配置文件(部署者需要使其与 Glance 的配置文件保持同步)

  2. 将属性保护代码从 Glance 同步到 Cinder(Cinder 将共享通用保护代码)

  3. 扩展现有的 volume_image_metadatas(VolumeImageMetadataController) 控制器扩展以添加更新功能。

  4. 在卷 API 中重用 update_volume_metadata 方法来更新镜像元数据,并通过引入新的常量“meta_type”来区分用户/镜像元数据

  5. 将 update_volume_image_metadata 方法添加到卷 API。

  6. 检查属性保护配置文件(property-protections-policies.conf 或 property-protections-roles.conf)以查看该属性是否具有更新保护。

  7. 更新 DB API 和驱动程序以允许镜像元数据更新。

对 Cinder python 客户端的更改

  1. 提供 Cinder API 以允许用户更新镜像属性。触发更新的 CLI-python API。

    # 设置或删除卷镜像元数据 cinder image-metadata <volume-id> set <property-name = value>

依赖项

与 Glance 相同的依赖项。

测试

将为所有可能的代码添加单元测试,目标是尽可能地隔离功能。

将在可能的情况下添加 Tempest 测试。

文档影响

由于 Glance 对属性具有基于角色的访问控制。我们可能希望在 Cinder 中更新 Glance 中受保护的属性。例如,许可证密钥被添加到 Glance,并在创建卷时复制到 Cinder。未经授权的用户不应在 Cinder 中更改它,因为这可能违反该镜像的计费策略。因此,建议采用与 Glance 类似的属性保护。

我们建议为属性保护定义两个示例配置文件,即 property-protections-roles.conf 和 property-protections-policies.conf。

  • property-protections-policies.conf 这是在使用策略规则进行属性保护时的模板文件。

    示例:使用 policy.json 中定义的 context_is_admin 策略规则限制所有属性交互仅对管理员开放。

    [.*]

    create = context_is_admin

    read = context_is_admin

    update = context_is_admin

    delete = context_is_admin

  • property-protections-roles.conf

    这是基于用户角色的属性保护时的模板文件。示例:允许管理员和具有计费角色的用户读取和修改以 x_billing_code_ 前缀开头的属性。

    [^x_billing_code_.*]

    create = admin,billing

    read = admin, billing

    update = admin,billing

    delete = admin,billing

请参阅此处,https://docs.openstack.org/developer/glance/property-protections.html 以获取格式的详细说明。

如果 Glance 中严格保护某个属性,例如许可证密钥,部署者应注意配置文件可能在 Cinder 和 Glance 之间不一致,部署者有责任使其与 Glance 的配置文件保持同步

还需要有关新 API 扩展和用法的其他文档。

参考资料

此蓝图实际上是 Graffiti 项目的一部分任务,许多概念已经为 OpenStack 的其他部分实现,但 Cinder 尚未实现(已为镜像、flavor、host aggregates 完成)

Youtube summit Graffiti Juno POC 演示回顾。

邮件列表中的讨论。

IRC 中的讨论。

依赖此功能的 Horizon 补丁集

Glance 中的属性保护介绍