select_destinations() 调度器 RPC API 方法,用于传递 RequestSpec 对象

https://blueprints.launchpad.net/nova/+spec/sched-select-destinations-use-request-spec-object

select_destinations() 调度器 RPC API 方法更改为使用 nova.objects.request_spec.RequestSpec 对象,而不是嵌套字典。

问题描述

调度器的主要接口,select_destinations() 方法,接受一个 request_spec 参数和一个 filter_properties 参数,它们都是嵌套字典。嵌套的 request_spec 字典是在 nova.scheduler.utils.build_request_spec() 中构建的,该函数由 nova-conductor 在请求调度器查找放置一个或多个请求虚拟机实例之前调用。嵌套的 filter_properties 字典主要是在 nova.compute.api._build_filter_properties() 方法中构建的,该方法在请求调度器查找计算节点之前调用,但也可以在其他地方构建,并且需要保持一致性。

之前的蓝图引入了一个 nova.objects.request_spec.RequestSpec 对象,它可以模拟多个实例启动的整个请求。但是,调度器 RPC API 尚未更改为使用这个新对象。相反,nova-scheduler 在其 _schedule() 方法中构建 RequestSpec 对象,通过查看 request_spec 字典参数手动填充请求规范属性。

用例

这是一项纯粹的重构工作,旨在清理 Nova 和调度器之间的所有接口,以便在下一个周期中可以拆分调度器。

项目优先级

此蓝图是围绕“调度器”重构的全局努力的一部分,旨在帮助其在下一个周期中拆分。这被定义为本 Kilo 周期中的第三优先级。

提议的变更

RequestSpec 对象将被修改,以添加 filter_properties 字段。select_destinations() 调度器 RPC API 方法将被更改为消耗一个 nova.objects.request_spec.RequestSpec 对象,而不是两个嵌套字典。RPC API 将被递增,并且将添加翻译代码块,以允许较旧的 nova-conductor worker 继续传输字典 request_specfilter_properties 参数。

备选方案

无。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

除了使调度器调用接口逐渐更容易阅读和理解之外,没有其他影响。

实现

我们将通过添加先前在 filter_properties 字典中提供的新的字段来递增 RequestSpec 对象版本。新的 RequestSpec 对象应如下所示

class RequestSpec(base.NovaObject):

   """Models the request to launch one or more instances in the cloud."""

   VERSION = '1.1'

   fields = {
       'image': fields.DictOfStringsField(nullable=False),
       # This should eventually be deconstructed into component parts
       'instance_properties': fields.ObjectField('Instance'),
       'instance_type': fields.ObjectField('Flavor', nullable=True),
       'num_instances': fields.IntegerField(nullable=False, default=1),
       'force_hosts': fields.StringField(nullable=True),
       'force_nodes': fields.StringField(nullable=True),
       'pci_requests': fields.ListOfObjectsField('PCIRequest', nullable=True),
       'retry': fields.ObjectField('Retry', nullable=True),
       'limits': fields.ObjectField('Limits', nullable=True),
       'group': fields.ObjectField('GroupInfo', nullable=True),
       'scheduler_hints': fields.DictOfStringsField(nullable=True)

   }

PCIRequest、Retry、Limits 和 GroupInfo 对象将相应地创建。

我们将递增调度器 RPC API 的版本,并在 select_destinations 方法中插入翻译块,以处理较旧的 nova-conductor 节点发送旧样式的字典 request_specfilter_properties 参数到较新的 nova-scheduler 节点,该节点期望一个 RequestSpec 对象。

nova-conductor 管理器代码然后将被更新为构建一个 RequestSpec 对象,以传递给 select_destinations() 调度器 RPC API,而不是调用 nova.scheduler.utils.build_request_spec()build_request_spec() 方法然后将被删除。

所有用于更新 filter_properties 字典的调用都将被替换为设置附加的 RequestSpec 对象中的字段。

request-spec-objects 蓝图中添加的代码,该代码在 FilterScheduler._schedule() 方法中构建了一个 RequestSpec 对象,然后将被删除,因为它不再需要,因为 request_spec 参数已经是一个对象。

负责人

主要负责人

bauzas

工作项

  • 通过添加与 filter_properties 相关的新的字段来递增 RequestSpec 对象

  • 递增调度器 RPC API select_destinations() 方法,使其接受一个 RequestSpec 对象,而不是 request_spec 参数的字典。在同一个补丁中,修改 conductor 管理器以构建一个 RequestSpec 对象,并将其传递给 select_destinations(),而不是字典。删除 filter_scheduler.FilterScheduler._schedule() 中构建 RequestSpec 对象 的代码,因为该对象现在正在传递给 select_destinations()

  • 删除 nova.scheduler.utils.build_request_spec 函数。

依赖项

此蓝图依赖于以下蓝图的完成

  • request-spec-object

测试

将添加新的 request spec 对象单元测试。调度器的现有单元测试将在将过滤器转换为使用新的 request_spec 对象模型而不是其当前自由形式的 filter_properties 字典的补丁集中进行修改。

文档影响

将提供一部分此蓝图,以提供有关新的放置规范类的开发人员参考资料。

参考资料

此蓝图是整体工作的一部分,旨在清理、版本化和稳定 nova-api、nova-scheduler、nova-conductor 和 nova-compute 守护程序之间涉及调度和资源决策的接口。

有关 Kilo 目标所有蓝图的列表,请参阅 https://wiki.openstack.org/wiki/Gantt/kilo#Tasks