支持每个驱动程序的传感器计量

https://blueprints.launchpad.net/ironic/+spec/support-per-driver-sensor-meters

此蓝图旨在修改 Ironic Conductor 的 _send_sensor_data 接口实现,以支持将来自 IPMI 以外的提供商的传感器计量发送到 Ceilometer。

问题描述

当前 _send_sensor_data 的实现方式在很多方面都特定于 IPMI。Conductor 仅会在已部署(具有 instance_uuid)的节点上获取传感器,并且 Conductor 发送到 Ceilometer 的通知会通过硬件.ipmi.metrics 事件类型发送到 IPMI 特定的 Ceilometer 插件。

我希望能够通过实现 iLO 特定的 driver.management.get_sensors_data() 接口来提供来自 iLO 管理驱动程序的健康(以及潜在的其他)传感器信息。iLO 管理驱动程序提供的传感器信息不应被视为 IPMI 传感器。此外,即使节点尚未用软件部署,平台健康信息也应可用。

提议的变更

Ironic Conductor 的 _send_sensor_data 例程应始终在每个轮询间隔调用基础驱动程序.management.get_sensors_data 例程。由基础管理 get_sensors_data 例程负责确定是否适合为其管理的节点收集传感器信息。如果驱动程序确定不适合收集节点的传感器信息,则驱动程序应简单地返回一个空传感器列表。

Conductor 无需解释传感器提供商是谁,即可将传感器信息发送到计量系统。

我将 Conductor 在传感器计量中的作用如下

  • 以可指定的时间间隔调用管理驱动程序读取传感器

  • 使用管理驱动程序返回的传感器中提供的信息创建每个计量的命名。这将确保跨多个提供商的计量命名一致。它还将支持未来与其他计量系统(如 Monasca)的计量命名一致性。

  • Conductor 必须在发送到计量系统的消息中包含 Ironic 节点 UUID,以便在接收到消息时,Ironic 节点 UUID 将包含在创建的传感器计量中。

在当前实现中,每个计量的命名不是 Conductor 的责任,而是计量系统插件的责任。

我希望提出一个通用的 Ceilometer 传感器通知插件,该插件无需修改即可支持新的传感器类型。要创建这样一个插件,需要 Ironic Conductor 以足够的信息格式化传感器计量,以便计量系统插件无需执行任何传感器数据转换即可为每个传感器计量创建样本。为了实现这一点,Ironic Conductor 需要实现 Ceilometer 插件当前执行的一些操作,例如传感器计量命名、资源 ID 命名和传感器读取解析。此外,Ceilometer 通知插件添加的任何传感器字段(如“node”)都需要由 Ironic Conductor 创建。

我希望在驱动程序返回的传感器字典中引入一个每个传感器提供商 ID 字段,以便传感器资源_metadata 的使用者可以识别提供传感器的驱动程序。该字段将命名为“sensor_provider”,并且对于每个驱动程序设置为唯一的文本值。对于 ipmitool 驱动程序,该值为“ipmi”,对于 HP iLO 驱动程序,该值为“ilo”。将此字段添加到每个传感器记录需要更改实现 get_sensors_data 接口的每个驱动程序。

为了支持这些 Conductor 更改,需要一个新的 Ceilometer 通知插件,并且需要更改 Ceilometer 中的传感器命名。请参阅“依赖项”部分,了解与创建通用传感器 Ceilometer 插件相关的 Ceilometer 蓝图。

备选方案

可以为每个传感器提供商创建一个额外的 Ceilometer 插件,但这需要在每个插件中进行大量的代码复制。此外,Conductor 需要具有从生成传感器的 Ironic 驱动程序到应将传感器发送到的适当 Ceilometer 插件的映射。

通用传感器 Ceilometer 通知插件和支持多个提供商的 Conductor 更改可以在不更改当前定义的 Ceilometer 计量命名的情况下实现。这可以通过将传感器提供商名称放在 Ceilometer 计量名称中来实现。例如,对于 iLO 驱动程序提供的温度传感器,可以使用 hardware.ilo.temperature。

数据模型影响

REST API 影响

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

安全影响

其他最终用户影响

要支持提供商无关的计量命名,需要更改 Ceilometer 中传感器的用户可见计量名称。新的提供商无关命名将与 Juno 版本中用于传感器计量的名称不兼容。以下是 Ceilometer 插件在 Juno 中为传感器创建的计量名称示例。

| Name                     | Resource ID
| hardware.ipmi.current    | IronicNodeUUID-power_meter_(0x16)
| hardware.ipmi.temperature| IronicNodeUUID-16-system_board_(0x15)

该提议是从计量名称中删除 ipmi 组件字符串,以便计量名称变得提供商无关。将上述转换为提议的计量命名将导致 Ceilometer 中的以下计量名称。

| Name                | Resource ID
| hardware.current    | IronicNodeUUID-power_meter_(0x16)
| hardware.temperature| IronicNodeUUID-16-system_board_(0x15)

Ceilometer 中还实现了使用 ipmi 组件字符串在计量名称中的非 Ironic 传感器轮询代理。这些轮询代理也可以更新为遵守提议的 ironic 命名。对这些轮询代理的影响是删除轮询代理生成的计量名称中的“.ipmi”标识符,如上所示。IPMI 和 Intel Node manager 轮询代理生成的计量名称示例如下

| Name                          | Resource ID
| hardware.ipmi.current         | CONF.host-IPMI_SensorID
| hardware.ipmi.temperature     | CONF.host-IPMI_SensorID
| hardware.ipmi.node.temperature| CONF.host
| hardware.ipmi.node.power      | CONF.host

注意:即使“hardware.ipmi.node.*”计量看起来像是 IPMI 传感器类型,但实际上它们是特定于供应商的 Intel Node Manager 传感器。

修改轮询代理以更改其传感器命名约定不在本规范定义的范围之内。

可扩展性影响

性能影响

其他部署者影响

将 Conductor 更改为向新的通用传感器 Ceilometer 插件发送通知消息,需要与 Conductor 联合更新 Ceilometer,如果 Ironic 到 Ceilometer 的传感器计量已启用。

开发人员影响

Conductor 将依赖于一个通用的 Ceilometer 插件才能进行传感器计量。对 Ceilometer 和 Ironic Conductor 的更改的开发人员协调对于操作验证是必要的。

实现

负责人

主要负责人

<jmank@hp.com>

其他贡献者

<None>

工作项

  • 更改 Conductor 以删除所有与 IPMI 传感器相关的假设。

  • 更改 get_node_info_list 查询,使其不再基于关联为 true 进行过滤,并将 instance_uuid 检查移动到 ipmitool 和 ipminative 驱动程序中。

  • 创建一个 SensorMetrics 基类和一个 CeilometerSensorMetrics 派生类来实现计量命名、传感器打包和传感器发布。Conductor 将在初始化时实例化一个 CeilometerSensorMetrics 类,并从 Conductor 的 _send_sensor_data 定期计时器例程调用 SensorMetrics send_sensors 接口。

SensorMetrics 类的目的是封装针对目标计量系统所需的任何传感器数据转换。

@six.add_metaclass(abc.ABCMeta)
class SensorMetrics(object):
    @abc.abstractmethod
    def send_sensors(self, context, task, sensors):
        """Send Sensors in the list to the metering system

        : param context: request context
        : param task: TaskManager instance with shared lock
        : param instance_uuid: Running instance UUID or None if not
                               deployed
        : param sensors: List of Sensors to send to metering system
        """

依赖项

这项工作依赖于以下 Ceilometer 蓝图和规范。

测试

需要添加单元测试来验证新的代码路径。我还计划对 ProLiant 平台进行测试以验证其功能。

升级和向后兼容性

对 Conductor 的这些更改需要安装 Ceilometer 通用传感器通知插件,如果为 Conductor 启用了传感器数据消息的发送(通过“send_sensors_data=true”)。如果升级 Ironic 而未添加通用传感器通知插件,则将发送传感器数据消息,但它们不会显示为 Ceilometer 中的计量。需要更新文档,以说明 Ironic Conductor 传感器数据发送依赖于 Ceilometer 的通用通知插件。

如果采用新的计量命名方案,先前已存在于 Ceilometer 数据库中的先前的传感器将保留其先前的命名,因此升级到新的 Conductor 和通用传感器 Ceilometer 插件会导致传感器命名不连续。此外,任何基于 Juno 传感器计量方案的现有的 Ceilometer 传感器计量查询都需要更改为使用 Kilo 传感器计量方案。

文档影响

需要对 docs/source/deploy/install-guide.rst 进行文档更改,以涵盖可见的功能更改以及与 Ceilometer 的升级依赖关系。

参考资料