添加 BuildRequest 对象¶
https://blueprints.launchpad.net/nova/+spec/add-buildrequest-obj
为了在使用 cells 时维护 API 合同,我们需要存储足够的信息来满足实例 show 请求。
问题描述¶
当发出 API 请求来构建实例时,我们需要遵守特定的响应合同。这意味着我们需要存储请求中的某些信息,例如镜像、flavor、名称、uuid 等… 在 cellsv2 设置中,这提出了一个挑战,因为这些信息当前将存储在实例表中,但我们尚未知道将它们放在哪个 cell 实例表中。
用例¶
运营商希望将他们的部署划分为 Cell,以实现扩展、故障域和构建原因。在划分后,我们需要维护当前的 API 合约。
提议的变更¶
将添加一个新的对象,该对象将包含一个 RequestSpec 对象作为字段,并将所有实例 show 所需的额外细节作为其他字段。
将在 api 数据库中添加一个新的表来存储 RequestSpec 中不存在的字段。
备选方案¶
RequestSpec 对象可以扩展以容纳所有这些数据。但这会使一个旨在告知调度决策的对象变得臃肿,并包含不必要的用于该任务的数据。
可以向 api 数据库添加一个实例表。这与此处提出的方案类似,但可能会导致混淆,因为它具有临时性。BuildRequest 对象将非常类似于一个实例,但将清楚地表明它不是实际的实例。
数据模型影响¶
将在 ‘nova_api’ 数据库中添加一个新的表来存储 BuildRequest 字段。该表需要存储诸如 availability_zone、power_state、task_state、uuid、key_name、metadata、security_groups 等… 这些项目将作为版本化的字段字典存储。
表结构如下所示:
CREATE TABLE `build_request` (
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`instance_uuid` varchar(36) NOT NULL,
`project_id` varchar(255) NOT NULL,
`request_obj` text NOT NULL
)
instance_uuid 和 project_id 将被索引。
一旦实例已被写入 cell 数据库,应该删除此条目,因为 show 请求现在可以从实例表满足。这意味着这些数据是短期的,因此可以放心地进行未来的更改,而无需担心向后兼容性。
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
将会产生额外的数据库写入操作。
其他部署者影响¶
尚未调度实例的实例将存在于此新表中。部署者需要了解这一点,以便进行适当的调试。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
alaski
- 其他贡献者
无
工作项¶
让 nova-api 将 BuildRequest 信息写入此表
如果实例尚未映射到 cell,让 nova-api 响应 list/show 请求,并使用 BuildRequest 对象。
在 cell 数据库中创建实例后(在调度器交互规范中介绍),删除此数据库行。
依赖项¶
无
测试¶
由于这被设计为 Nova 的内部重构,没有用户可见的更改,因此当前的 Tempest 或功能测试应该足够。在某个时候,我们希望研究如何测试多个 Cell 或潜在地在 API 中公开 Cell 的概念,然后我们将解决测试要求。
文档影响¶
将编写文档,描述实例构建的流程以及这如何影响它。
参考资料¶
https://etherpad.openstack.org/p/kilo-nova-cells https://etherpad.openstack.org/p/nova-cells-scheduling-requirements
历史¶
发布名称 |
描述 |
|---|---|
Liberty |
引入 |
Mitaka |
部分实现。 |
Newton |
重新提出。 |