支持服务器附加卷的 delete_on_termination

https://blueprints.launchpad.net/nova/+spec/support-delete-on-termination-in-server-attach-volume

此蓝图建议在卷附加期间支持传递 delete_on_termination,以便在删除服务器时可以删除附加的卷。

问题描述

目前,nova 已经支持卷附加 API,但在附加卷的同时,无法配置数据卷在实例销毁时是否可以被删除。在配置服务器处理数据卷以销毁实例时,这有点不方便。

用例

在大规模环境中,系统中创建了大量的资源,有时一个实例需要附加更多的数据卷。因此,用户需要为每个实例设置附加卷的处理模式。在销毁实例时,可以一起删除数据卷,清除无效数据,并释放存储空间。

提议的变更

为卷附加 API 添加一个新的微版本,以支持配置实例销毁时是否删除数据卷。

在同一个微版本中,在显示附加卷时,将 delete_on_termination 添加到 GET 响应中。

有关详细信息,请参阅 REST API 影响 部分。

备选方案

用户在删除服务器后手动清理数据卷,就像他们今天需要做的那样。

数据模型影响

REST API 影响

URL: /v2.1/servers/{server_id}/os-volume_attachments

  • 请求方法: POST (附加卷)

    delete_on_termination 参数添加到请求体中,其语义/模式与初始服务器创建 block_device_mapping_v2 对象相同。

    {
      "volumeAttachment": {
        "volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
        "delete_on_termination": true
      }
    }
    

    如果未指定,则 delete_on_termination 字段的默认值为 False

  • 请求方法: GET (列出卷附件)

    delete_on_termination 字段添加到附加卷的响应负载中。

    {
      "volumeAttachments": [
        {
          "device": "/dev/sdd",
          "id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
          "serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
          "tag": "foo",
          "volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
          "delete_on_termination": false
        },
        {
          "device": "/dev/sdc",
          "id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
          "serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
          "tag": null,
          "volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
          "delete_on_termination": true
        }
      ]
    }
    

URL: /servers/{server_id}/os-volume_attachments/{volume_id}

  • 请求方法: GET (显示卷附件)

    delete_on_termination 字段添加到附加卷的响应负载中。

    {
      "volumeAttachment": {
        "device": "/dev/sdc",
        "id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
        "serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
        "tag": null,
        "volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
        "delete_on_termination": true
      }
    }
    

注意

PUT /servers/{server_id}/os-volume_attachments/{volume_id} 不属于本次提议的更改范围,因为该 API 今天仅由 libvirt 驱动程序实现“交换卷”操作。 [1] 修改 PUT API 超出了此规范的范围。如果用户希望更改非根附加卷的 delete_on_termination 值,他们可以通过分离并使用更新后的 delete_on_termination 值重新附加卷来执行此操作。

安全影响

通知影响

其他最终用户影响

python-novaclient 和 python-openstack client 需要更新,以支持在附加卷和列出/显示附加卷时新的 delete_on_termination 参数。

性能影响

其他部署者影响

开发人员影响

升级影响

根据实现情况,不应有升级影响。今天,当将卷附加到非搁置卸载服务器时,BlockDeviceMapping 记录在 nova-compute 服务中创建。当将卷附加到搁置卸载服务器时,BDM 在 API 服务中创建。为了避免尝试将具有 delete_on_termination=true 的卷附加到运行在较旧的计算服务上的服务器时出现问题,实现应仅在 API 中设置该字段,而不是在计算服务中设置。

实现

负责人

主要负责人

张斌

工作项

  • 在 POST 和 GET os-volume_attachments API 中添加 delete_on_termination 支持。

  • 在 python-novaclient 和 python-openstackclient 中添加 delete_on_termination 支持。

  • 添加相关测试

依赖项

测试

  • 添加相关的单元测试,用于负面场景,例如尝试在旧的微版本中指定 delete_on_termination,传递具有无效值(如 null)的 delete_on_termination 等。

  • 添加相关的功能测试,用于正常场景,例如 API 示例。

由于使用 CinderFixture 的树内功能测试足以测试此功能,因此不需要 Tempest 测试。

文档影响

更新受影响 API 的 API 参考。

参考资料

历史

修订

发布名称

描述

Train

引入