搁置状态下的卷操作¶
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
工作项¶
需要进行以下更改
更改计算 API 中附加、分离和交换函数的保护,以便在实例处于搁置状态时允许它们。
添加在 API 本地执行的附加、分离和交换卷函数,当实例处于搁置卸载状态时。
添加代码以处理取消搁置时的设备名称(在搁置卸载状态下附加的设备将推迟名称选择到取消搁置)。
更改附加、分离和交换函数的保护,以便在实例处于搁置卸载状态时允许它们。
依赖项¶
此规范是允许在搁置卸载状态下附加和分离启动卷的一步(参见 [1])。但此规范本身也提供了有用的功能。 此规范增加了由于冲突的并行操作而导致竞态条件的机会,重要的是要注意这些竞态条件并非由此更改引入,而是已经存在于 nova 中,并且将由不同的更改来解决,请参阅 [2] 以获取更多信息。
测试¶
大部分附加和分离功能可以使用单元测试进行测试。特别是,搁置状态与关机或停止状态相同。
需要为搁置卸载状态下的新附加和分离函数添加新的单元测试。
将添加一个 tempest 测试,以检查搁置、分离/附加卷然后取消搁置的序列是否会导致正在运行的实例,并且所有预期卷都已正确附加。
文档影响¶
此规范将影响云用户。他们现在能够对搁置实例执行卷操作。
参考资料¶
[1] https://blueprints.launchpad.net/openstack/?searchtext=detach-boot-volume
历史¶
发布名称 |
描述 |
|---|---|
Mitaka |
引入 |