向 create_export 调用中添加连接器对象

https://blueprints.launchpad.net/cinder/+spec/add-create-export-connector

目前 Cinder 中有相当数量的卷驱动程序使用 initialize_connection 来完成将卷作为目标导出到发起方(nova 计算主机)的工作。 驱动程序这样做的一个原因是 create_export 方法 API 中没有传递连接器对象。 本规范概述了将连接器对象添加到标准卷驱动程序 API 的 create_export 中。

问题描述

今天 Cinder 中有许多驱动程序在 initialize_connection 内部执行卷目标导出,而不是在 create_export 方法中。 这其中的一个原因是,对这两种方法之间的区别存在文档化的理解。 阻止驱动程序在 create_export 内部执行工作的另一个问题是,create_export 缺少来自发起方的连接器对象。 一些后端需要连接器对象,其中包含发起方信息,才能从其阵列导出目标。 因此,驱动程序最终将所有导出代码移动到 initialize_connection 中,因为这是唯一具有连接器对象驱动程序调用的方法。

Cinder 驱动程序在 initialize_connection 中执行卷目标导出的另一个问题是,Nova 在其他不涉及附加卷的过程(例如实时迁移)期间会重复调用 initialize_connection。 Nova 将调用驱动程序的 initialize_connection,只是为了获取已导出卷的 connection_information,而不是因为它想要附加卷。

用例

主要用例是附加卷。 当有人调用 Cinder 附加卷时,最终会调用卷管理器的 initialize_connection 方法。 卷管理器的 initialize_connection 方法首先调用 create_export,目的是要求驱动程序创建从阵列导出到发起方的目标。 然后卷管理器调用驱动程序的 initialize_connection 以获取目标信息,以传回给调用者,以发现显示的卷。

提议的变更

拟议的更改很简单。 将已经存在的连接器对象添加到对 create_export 的调用中。 这使得连接器对象在 create_export 时间对所有驱动程序普遍可用。 然后,每个维护者都可以逐步更改每个驱动程序,以在 create_export 时间执行目标导出,而不是在 initialize_connection 时间执行。

备选方案

我们可以什么都不做,并要求每个驱动程序维护者在 initialize_connection 内部执行任何创建导出的操作时更加小心,如果它们已经存在的话。 这基本上使 create_export 对于所有这些驱动程序来说都是无用的和空操作。 我更希望每个驱动程序都按其预期的方式使用每个方法,以便更一致地审查所有 Cinder 中的驱动程序。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

如果驱动程序开发人员将创建导出的操作移动到 create_export 中,那么对 initialize_connection 的任何调用都应该更快,具体取决于驱动程序。

其他部署者影响

开发人员影响

一旦连接器对象在 create_export 内部可用,驱动程序就可以将现有的导出创建代码从 initialize_connection 迁移到 create_export。 审查人员还应在现有和未来的审查中寻找这一点,并且不应批准忽略 create_export 的驱动程序。

实现

负责人

主要负责人

walter-boring

工作项

首先是更新基础 driver.py 的 create_export 方法。 然后,每个定义 create_export 的其他驱动程序都必须接受新的连接器对象。

然后,卷管理器对 create_export 的调用需要传递连接器。

依赖项

测试

所有单元测试都需要更新,以注意新的连接器对象参数。 驱动程序的单元测试也需要更新。

文档影响

参考资料

由于尝试使 Nova 实时迁移与 cinder 卷一起工作所做的努力,已经进行了大量的研究。 存在一个 etherpad,讨论了 Nova、Cinder 交互的已知问题。 该 etherpad 还列出了由于在 initialize_connection 内部创建导出而可能存在问题的 Cinder 驱动程序。