支持在服务器上重新配置 delete_on_termination

https://blueprints.launchpad.net/nova/+spec/destroy-instance-with-datavolume

该蓝图建议允许在实例启动后更改卷的 delete_on_termination 属性,或在交换卷期间设置新卷的 delete_on_termination

问题描述

目前,nova 支持在创建实例时配置根磁盘和数据卷的 delete_on_termination(参考卷附加 API [1]),但创建实例后不允许更新它。

用例

在大型环境中,系统中可能会创建大量资源,有时需要从生产环境中清理一些废弃的实例。

负责清理生产环境的管理员可能与创建实例的用户不同,因此能够更改 delete_on_termination 属性以保留重要数据同时释放计算资源,或释放存储空间并清理敏感数据是可取的。

作为管理员用户,我期望在交换卷期间能够设置 delete_on_termination

最终用户希望能够在虚拟机生命周期的任何时候决定卷的保留或销毁策略。

提议的变更

为支持配置在实例销毁时是否删除附加卷,为带有卷附加的服务器模型添加一个新的微版本。在请求体中添加 delete_on_termination 属性。URL 中的 volume_id 参数是将被设置为 delete_on_termination 的卷。

将交换卷策略的规则名称更改为 os_compute_api:os-volumes-attachments:swap,并使原始策略的规则名称 (os_compute_api:os-volumes-attachments:update) 允许更新卷附加 API。

为更新卷 API 添加“rule:system_admin_or_owner”策略。

更改后,更新卷附加 API 将具有两个策略,一个用于常规更新(当前仅 delete_on_termination),另一个用于管理员,允许更改卷 ID(即交换卷)以及其他属性。换句话说,交换策略是更新策略的超集。

备选方案

通过卷附加 API 配置 delete_on_termination(参考卷附加 API [1]),如果您想使用数据卷更改该值,只需分离并使用新值重新附加即可。

如果您从 nova 创建根卷并设置 delete_on_termination=True 的卷启动服务器,但如果您想在服务器删除后保留根卷,您可以创建服务器的快照。

另一种选择是添加一个 PATCH 卷附加 API,允许在请求体中使用 delete_on_termination 属性来支持更新附加的卷,但这会破坏 nova API 并引入新的 PATCH 方法。

数据模型影响

REST API 影响

配置附加到实例的卷的 delete_on_termination

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

  • 请求方法: PUT (更新卷附加)

    delete_on_termination 参数添加到请求体。

  • 更新卷附加 API 的请求体

    {
        "volumeAttachment": {
           "volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
           "delete_on_termination": true
        }
    }
    

    除了 volumeId 之外,在新微版本中,只有 delete_on_termination 才能从当前值更改。否则,将返回 400。

为更新卷附加 API 添加“rule:system_admin_or_owner”策略角色。

安全影响

通知影响

其他最终用户影响

python-novaclient 将更新以支持更改 delete_on_termination 标志。

性能影响

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

zhangbailin

功能联络人

功能联络人

zhangbailin

工作项

  • 添加一个新的微版本,该版本启用允许在 PUT 请求期间更新 delete_on_termination 的代码。

  • 更改更新卷附加 API 的原始策略角色名称。

  • 为更新卷附加 API 添加新的策略。

  • 更改 python-novaclient 以支持此微版本。

  • 添加相关的测试。

依赖项

测试

  • 添加相关的单元测试,用于负面场景,例如尝试使用旧的微版本调用更新卷附加 API 来更新附加的卷,传递无效的 delete_on_termination 值(如 null)等。

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

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

文档影响

添加关于此微版本的文档描述。

参考资料

关于柏林论坛的此功能的讨论

关于上海论坛的此功能的讨论

历史

修订

发布名称

描述

Ussuri

引入