【问题求助】在客户定制仓新增REDFISH的一个易变属性,如何将其加入IgnoreEtags数组中

// 此模板仅供参考,如果不适用可以修改

问题描述

在客户定制仓新增REDFISH的一个易变属性,如何将其加入IgnoreEtags数组中

尝试过的解决方案

在定制仓找相关的例子,只找到了重新实现整个接口时可以进行配置IgnoreEtags;如果只是在config.json里面对一个uri GET操作新增一个属性,没有找到可以参考的例子,请问是否可以实现在config.json对IgnoreEtags进行配置

答案内容由AI生成,仅供参考:

总结与建议

方案 适用场景 推荐度
在 config.json 中使用 Property.Actions.Set 客户轻量级定制,仅需添加字段 :star::star::star::star:
在 mapping_config/*.json 中直接配置 IgnoreEtags 已复制完整接口配置 :star::star::star::star::star:(最可靠)
使用 Lua 脚本动态控制(如 custom_request_response.lua) 特殊逻辑处理 :star::star:

:white_check_mark: 结论:
即使只是通过 config.json 新增属性,也可以通过 Property.Actions.Set 机制实现对 Resources.IgnoreEtags 的配置。但如果已有定制映射文件,建议直接在 Resources 中显式声明 IgnoreEtags 数组,更清晰且不易出错。

点击此处查看详细分析解答

如何在客户定制仓中将新增的易变属性加入 IgnoreEtags 数组

问题概述

在客户定制仓中为 Redfish 接口新增一个易变属性(如秒级或分钟级频繁变化的属性)时,需要将其加入 Resources.IgnoreEtags 数组中,以避免在执行 PATCH 操作时因 ETag 验证失败而导致更新失败。


核心概念说明

什么是 IgnoreEtags?

  • Resources.IgnoreEtags 是 Redfish 接口中的一个配置项,用于指定哪些属性在进行 ETag 校验时应被忽略。
  • 对于频繁变化的属性(如实时温度、CPU 占用率、转速等),如果参与 ETag 校验,会导致 PATCH 请求经常因数据不一致而被拒绝。
  • 因此,必须将这类属性加入 IgnoreEtags 数组中,使其不参与 ETag 比对。

:white_check_mark: 注意规则:

  1. IgnoreEtags 的层级必须与 URI 层级一致。
  2. IgnoreEtags 中列出的属性必须存在于响应体(RspBody)中。

实现方法:在 config.json 中配置 IgnoreEtags

虽然默认情况下 IgnoreEtags 通常在接口映射配置文件(如 mapping_config 中的 .json 文件)中定义,但在客户定制场景下,可以通过定制仓的 config.json 实现对 IgnoreEtags 的增补或覆盖。

:white_check_mark: 是否可以在 config.json 中配置 IgnoreEtags?

可以!

通过以下方式可以在客户定制的 config.json 中实现对 IgnoreEtags 的配置:

方法一:通过全局变量替换机制(GlobalVariable + Uri Actions)

在 interface_config/config.json 中支持使用 GlobalVariable 和 Uri.Actions 进行字段替换和配置增强。

示例配置:在 config.json 中添加 IgnoreEtags
{
  "GlobalVariable": {
    "MyVolatileProp_IgnoreEtag": ["MyVolatileProp"]
  },
  "Property": {
    "Actions": [
      {
        "Target": "Chassis/:chassisid/MyApp",
        "Set": {
          "Resources": {
            "IgnoreEtags": "{{MyVolatileProp_IgnoreEtag}}"
          }
        }
      }
    ]
  }
}

:light_bulb: 说明:

  • 使用 Property.Actions.Set 可以在特定 URI 路径下注入或覆盖 Resources.IgnoreEtags 字段。
  • {{MyVolatileProp_IgnoreEtag}} 是通过 GlobalVariable 定义的数组,实现灵活管理。

方法二:通过定制映射文件覆盖原有配置(推荐用于复杂场景)

如果你已在定制仓中复制了标准接口配置文件(如 MyApp.json),可以直接修改其内容:

示例:mapping_config/Chassis/MyApp.json
{
  "Resources": [
    {
      "Uri": "/redfish/v1/Chassis/:chassisid/MyApp",
      "Interfaces": [
        {
          "Type": "GET",
          "RspBody": {
            "Id": "MyApp",
            "Name": "Custom Application",
            "MyVolatileProp": "${ProcessingFlow[0]/Destination/value}",
            "@odata.id": "/redfish/v1/Chassis/${Uri/chassisid}/MyApp"
          },
          "Resources": {
            "IgnoreEtags": [
              "MyVolatileProp"
            ]
          },
          "ProcessingFlow": [ ... ]
        }
      ]
    }
  ]
}

:white_check_mark: 此方式最直接有效,适用于你已经复制并定制了映射文件的场景。


易变属性识别标准(参考)

根据文档,以下类型属性属于易变属性,建议加入 IgnoreEtags:

属性类别 示例
实时监控数据 实时电压、电流、功率、温度
占用率指标 CPU占用率、内存占用率、磁盘IO
时间相关 时间戳、时长、进度
历史统计数据 功率历史、温度历史、占用率历史
硬件状态 转速、电池电量、能耗

:pushpin: 原则:凡是以秒级或分钟级频率变化的属性,都应考虑是否需要加入 IgnoreEtags。


验证方法

  1. 检查生成的接口响应中是否包含 IgnoreEtags 数组:

    {
      "Resources": {
        "IgnoreEtags": ["MyVolatileProp"]
      }
    }
    
  2. 测试 PATCH 接口行为:

    • 修改非 IgnoreEtags 属性,确认不会因 MyVolatileProp 值变化导致 428 Precondition Failed 错误。
    • 日志中可查看 Resources.IgnoreEtags 是否生效。
  3. 使用工具验证:

    • 使用 Postman 发送 GET 请求到 /redfish/v1/Chassis/1/MyApp
    • 检查返回体或内部映射逻辑是否包含 IgnoreEtags 配置

总结与建议

方案 适用场景 推荐度
在 config.json 中使用 Property.Actions.Set 客户轻量级定制,仅需添加字段 :star::star::star::star:
在 mapping_config/*.json 中直接配置 IgnoreEtags 已复制完整接口配置 :star::star::star::star::star:(最可靠)
使用 Lua 脚本动态控制(如 custom_request_response.lua) 特殊逻辑处理 :star::star:

:white_check_mark: 结论:
即使只是通过 config.json 新增属性,也可以通过 Property.Actions.Set 机制实现对 Resources.IgnoreEtags 的配置。但如果已有定制映射文件,建议直接在 Resources 中显式声明 IgnoreEtags 数组,更清晰且不易出错。


参考文档

当前暂不支持定制该字段

请问,还有问题吗?BMC当前不支持这个特性

没问题了

有试过这样配置么

现在不支持config.json里定制易变属性的屏蔽么?我看JD仓库的[1.80.47] - 2026-4-24 修改就是这种场景x

最搓的办法应该就是在定制仓搞个完整的json文件,比如power.json,然后再这个json文件加入你要新增或者变动的内容, 后面使用覆盖原有json文件的语法就可以了

这个方案治标不治本,而且假设原power.json里做了修改,你这里完全感知不到

放在rackmount中不就行了

那确实是有这个问题,不过我当时就是通过这样的方式解决的;