搁置状态下的卷操作

https://blueprints.launchpad.net/nova/+spec/volume-ops-when-shelved

目前,附加、分离和交换卷操作在实例暂停、停止和软删除时允许,但在实例被搁置时不允许。这些操作在实例被搁置时是可行的,因此我们应该启用它们。

问题描述

在实例处于搁置 (shelved) 或搁置卸载 (shelved_offloaded) 状态时,不允许附加、分离和交换卷操作。从用户的角度来看,这与这些操作可以在其他非活动状态的实例上执行的事实相矛盾。

用例

作为云用户,我希望能够从我的搁置实例中分离卷并在其他地方使用它们,而无需先取消搁置实例。

作为云用户,我希望能够对搁置实例执行与实例停止、暂停或软删除时相同的卷操作。

提议的变更

搁置实例可以处于两种可能的状态:搁置 (shelved) 和搁置卸载 (shelved_offloaded)(忽略搁置和取消搁置过程中的过渡)。在搁置状态下,实例仍然位于主机上但处于非活动状态。在搁置卸载状态下,实例已被从主机移除,并且那里使用的资源已被释放。

在搁置状态下对实例执行卷操作类似于任何其他状态,只要实例位于主机上。可以通过在计算 API 中为此状态允许这些操作来启用这些操作。现有的计算管理器代码已经处理这种情况;它只是在 API 中被禁用了。

搁置卸载状态有所不同。在这种情况下,实例不在任何主机上,因此附加和分离函数需要在 API 中以与用于删除卷的分离代码相同的方式实现。这些操作将仅执行管理块设备映射并向 cinder 注册的步骤。任何实际的附加到主机的操作都将在实例取消搁置时如常完成。

计算 API 附加卷代码向托管计算管理器发出 RPC 调用,以选择设备的名称,其中包括调用 virt 驱动程序。由于实例已卸载,因此无法执行此操作,因为它不在主机上。

实际上,设备名称在实例启动时设置,并且不能保证用户提供的名称会被尊重。因此,对于搁置卸载状态的新附加方法将推迟名称选择,直到实例取消搁置。这避免了完全调用计算管理器的需要。

备选方案

唯一明确的替代方案是不允许在实例搁置时附加或分离卷。

数据模型影响

无。

REST API 影响

当实例处于搁置和搁置卸载状态时,将允许附加、分离和交换操作。 不再返回现有的 HTTP 错误 409(冲突),而是返回值将与其它有效状态相同。

此更改需要 API 微版本递增。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

pmurray

其他贡献者

andrea-rosa-m

工作项

需要进行以下更改

  1. 更改计算 API 中附加、分离和交换函数的保护,以便在实例处于搁置状态时允许它们。

  2. 添加在 API 本地执行的附加、分离和交换卷函数,当实例处于搁置卸载状态时。

  3. 添加代码以处理取消搁置时的设备名称(在搁置卸载状态下附加的设备将推迟名称选择到取消搁置)。

  4. 更改附加、分离和交换函数的保护,以便在实例处于搁置卸载状态时允许它们。

依赖项

此规范是允许在搁置卸载状态下附加和分离启动卷的一步(参见 [1])。但此规范本身也提供了有用的功能。 此规范增加了由于冲突的并行操作而导致竞态条件的机会,重要的是要注意这些竞态条件并非由此更改引入,而是已经存在于 nova 中,并且将由不同的更改来解决,请参阅 [2] 以获取更多信息。

测试

大部分附加和分离功能可以使用单元测试进行测试。特别是,搁置状态与关机或停止状态相同。

需要为搁置卸载状态下的新附加和分离函数添加新的单元测试。

将添加一个 tempest 测试,以检查搁置、分离/附加卷然后取消搁置的序列是否会导致正在运行的实例,并且所有预期卷都已正确附加。

文档影响

此规范将影响云用户。他们现在能够对搁置实例执行卷操作。

参考资料

[1] https://blueprints.launchpad.net/openstack/?searchtext=detach-boot-volume

[2] https://review.openstack.org/216578

历史

修订版

发布名称

描述

Mitaka

引入