SPResult 接口返回值 Detail 字段类型不符合预期

问题描述

/redfish/v1/Managers/1/SPService/SPResult/1 接口,内层 Detail 字段类型不符合预期,影响工具的功能;

除了最后一个 NICOK 的 Detail 是字符串外,其余对象的 Detail 字段都是数组,这种类型差异明显是不符合规范的,Detail 字段按接口定义应全部为数组才对;

[
    {
        "@odata.context": "/redfish/v1/$metadata#hwSPResult.HwSPResult",
        "@odata.id": "/redfish/v1/Managers/1/SPService/SPResult/1",
        "@odata.type": "#hwSPResult.v1_0_0.HwSPResult",
        "Id": "1",
        "Name": "SP Result",
        "Status": "Finished",
        "Diagnose": {
            "DiagFinished": true,
            "Operate": "Diagnose",
            "Detail": [
                {
                    "DurationMinutes": "",
                    "Detail": [
                        {
                            "DiagnoseResult": "Successful",
                            "CPUID": "20-D0-0F-48-00-00-00-00",
                            "Status": "Populated, Enabled",
                            "ClockSpeed": "2900 MHz",
                            "Manufacturer": "HiSilicon",
                            "Name": "CPU1",
                            "Qty": "64 cores/128 threads",
                            "Model": "Kunpeng 920 7268T"
                        },
                        {
                            "DiagnoseResult": "Successful",
                            "CPUID": "20-D0-0F-48-00-00-00-00",
                            "Status": "Populated, Enabled",
                            "ClockSpeed": "2900 MHz",
                            "Manufacturer": "HiSilicon",
                            "Name": "CPU2",
                            "Qty": "64 cores/128 threads",
                            "Model": "Kunpeng 920 7268T"
                        },
                        {
                            "DiagnoseResult": "Successful",
                            "CPUID": "20-D0-0F-48-00-00-00-00",
                            "Status": "Populated, Enabled",
                            "ClockSpeed": "2900 MHz",
                            "Manufacturer": "HiSilicon",
                            "Name": "CPU3",
                            "Qty": "64 cores/128 threads",
                            "Model": "Kunpeng 920 7268T"
                        },
                        {
                            "DiagnoseResult": "Successful",
                            "CPUID": "20-D0-0F-48-00-00-00-00",
                            "Status": "Populated, Enabled",
                            "ClockSpeed": "2900 MHz",
                            "Manufacturer": "HiSilicon",
                            "Name": "CPU4",
                            "Qty": "64 cores/128 threads",
                            "Model": "Kunpeng 920 7268T"
                        }
                    ],
                    "Remark": "CPUOK",
                    "Device": "CPU",
                    "Mode": "Quick",
                    "Status": "Successful",
                    "Progress": "100",
                    "EndTime": "2026-02-06 03:25:03",
                    "StartTime": "2026-02-06 03:09:28",
                    "Description": "Diagnose CPU successfully",
                    "UsedTime": "15:34"
                },
                {
                    "Detail": [
                        {
                            "PartNumber": "M321R4GA3BB6-CQKET",
                            "Manufacturer": "Samsung",
                            "ClockSpeed": "4800 MT/s",
                            "Name": "DIMM000",
                            "Type": "DDR5",
                            "DiagnoseResult": "Successful",
                            "Capacity": "32GB",
                            "DiagnoseMessage": "",
                            "SerialNumber": "80CE042407491E8F26"
                        },
                        {
                            "PartNumber": "M321R4GA3BB6-CQKET",
                            "Manufacturer": "Samsung",
                            "ClockSpeed": "4800 MT/s",
                            "Name": "DIMM100",
                            "Type": "DDR5",
                            "DiagnoseResult": "Successful",
                            "Capacity": "32GB",
                            "DiagnoseMessage": "",
                            "SerialNumber": "80CE042407491D3005"
                        },
                        {
                            "PartNumber": "M321R4GA3BB6-CQKET",
                            "Manufacturer": "Samsung",
                            "ClockSpeed": "4800 MT/s",
                            "Name": "DIMM200",
                            "Type": "DDR5",
                            "DiagnoseResult": "Successful",
                            "Capacity": "32GB",
                            "DiagnoseMessage": "",
                            "SerialNumber": "80CE042407491E7835"
                        },
                        {
                            "PartNumber": "M321R4GA3BB6-CQKET",
                            "Manufacturer": "Samsung",
                            "ClockSpeed": "4800 MT/s",
                            "Name": "DIMM300",
                            "Type": "DDR5",
                            "DiagnoseResult": "Successful",
                            "Capacity": "32GB",
                            "DiagnoseMessage": "",
                            "SerialNumber": "80CE042407491D394F"
                        }
                    ],
                    "Remark": "MEMOK",
                    "Device": "Memory",
                    "Mode": "Quick",
                    "Status": "Successful",
                    "Progress": "100",
                    "EndTime": "2026-02-06 03:26:50",
                    "StartTime": "2026-02-06 03:25:09",
                    "Description": "Diagnose memory successfully",
                    "UsedTime": "01:43"
                },
                {
                    "Detail": [
                        {
                            "Manufacturer": "SAMSUNG",
                            "DiagnoseMessage": "SMART Error Log is not exist in Smartctl inf o.\nSMART overall-health self-assessment test result is not exist in Smartctl info.\nVendor Specific SMART Attributes with Thresholds is not exist in Smartctl info.. Failed to start the hard disk self-test.",
                            "Interface": "SATA",
                            "Name": "Disk12",
                            "Firmware": "JXTC604Q",
                            "Capacity": "447.132 GB",
                            "Model": "SAMSUNG MZ7L3480HCHQ-00B7C",
                            "DiagnoseResult": "Healthy",
                            "SerialNumber": "S6KLNG0T703568"
                        },
                        {
                            "Manufacturer": "SAMSUNG",
                            "DiagnoseMessage": "Disk is unaccessible from operating system. Failed to start the hard disk self-test.",
                            "Interface": "SATA",
                            "Name": "Disk13",
                            "Firmware": "JXTC104Q",
                            "Capacity": "447.132 GB",
                            "Model": "SAMSUNG MZ7L3480HCHQ-00B7C",
                            "DiagnoseResult": "Unknown",
                            "SerialNumber": "S6KLNE0T145306"
                        }
                    ],
                    "Remark": "DISKE02",
                    "Device": "Disk",
                    "Mode": "Quick",
                    "Status": "Failed",
                    "Progress": "100",
                    "EndTime": "2026-02-06 03:27:18",
                    "StartTime": "2026-02-06 03:27:13",
                    "Description": "Failed to diagnose disk.[S6KLNE0T145306]",
                    "UsedTime": "00:00"
                },
                {
                    "Detail": "",
                    "Remark": "NICOK",
                    "Device": "NIC",
                    "Mode": "Full",
                    "Status": "Successful",
                    "Progress": "100",
                    "EndTime": "2026-02-06 03:27:32",
                    "StartTime": "2026-02-06 03:27:22",
                    "Description": "Diagnose NIC successfully",
                    "UsedTime": "00:00"
                }
            ]
        }
    }

]

请帮忙确认现象出现的原因,没有在开源部分找到 SP 交互相关的代码

环境信息

openUBMC:930 基线

SP 版本:

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

结论

该问题是由于 SPService 返回的 Detail 字段在不同设备间类型不一致,且 BMC 层未做强制类型校验与统一处理 所致,属于典型的 data type inconsistency 问题。

根本原因

SP 在处理 NIC 诊断结果时,将 Detail 设置为空字符串而非空数组,BMC 直接透传该异常数据,违反了 Redfish 接口的数据一致性规范。

解决方案

从 SP 端统一输出格式,并在 BMC 接口层增加类型约束与校验,确保对外暴露的 Redfish API 响应结构一致、类型合规。

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

SPResult 接口返回值 Detail 字段类型不符合预期问题分析

问题描述

GET /redfish/v1/Managers/1/SPService/SPResult/1 接口返回的响应中,Diagnose 数组下的多个对象中 Detail 字段存在类型不一致问题:

  • 前三个对象(CPU、Memory、Disk)的 Detail 字段为数组类型,包含详细的诊断信息。
  • 第四个对象(NIC)的 Detail 字段为空字符串类型 "",而非预期的数组。

根据接口规范,所有 Detail 字段应保持类型一致性,统一为数组类型。当前混合使用数组和字符串的行为违反了 Redfish 接口的数据类型一致性原则。


问题现象

示例响应结构:

"Diagnose": {
  "Detail": [
    {
      "Device": "CPU",
      "Detail": [ ... ]     // 数组类型 ✅
    },
    {
      "Device": "Memory",
      "Detail": [ ... ]     // 数组类型 ✅
    },
    {
      "Device": "Disk",
      "Detail": [ ... ]     // 数组类型 ✅
    },
    {
      "Device": "NIC",
      "Detail": ""          // 字符串类型 ❌
    }
  ]
}

尽管 "Status""Successful",但 Detail 字段未按统一格式返回数据,导致客户端解析困难或失败。


原因分析

1. 接口响应数据类型不一致的根本原因

Detail 字段的类型冲突属于典型的 data type inconsistency(数据类型不一致)问题,在系统层面已有类似问题记录。如知识库中所述:

data type inconsistency 是一种技术问题,表现为预期与实际返回的数据类型不符,例如 None vs 字符串,或期望对象/数组却返回字符串。

相关实体如 ProductSerialNumberMajorVersionCopyrightDocSupportFlag 等均曾出现类似问题,其错误表现为:期望为字典或空值(null),但实际返回为字符串或布尔值

本案例中 Detail 字段的问题与此完全一致——预期为数组类型,实际返回为空字符串


2. 可能的实现逻辑缺陷

结合 Interfaces.RspBody 配置机制,Detail 的值来源于 Statements 中的动态生成逻辑。可能存在以下配置或代码问题:

  • NIC 诊断模块未正确构建 Detail 数组,直接赋值为空字符串(可能是初始值或默认值)。
  • 数据映射配置中未对 Detail 字段强制指定类型,导致不同子模块返回格式自由化。
  • Lua 脚本(如 Formula)在处理 NIC 结果时未统一包装成数组,而是返回了原始字符串或空值。

文档中提到:

RspBody 定义了响应体结构,其值通常来自 Statements/Devices() 等函数调用,用于生成集合资源数组。数组中的每个元素代表一个子资源

但在 NIC 场景下,开发者可能错误地将 Detail 设为占位符字符串,而非初始化为 [] 空数组。


3. 缺乏类型校验机制

Type 关键字用于定义数据类型校验基础,支持字符串或数组形式声明允许的类型。

若接口未通过 Type: array 显式约束 Detail 字段的类型,则无法阻止非法字符串赋值。此外,若未启用严格的 JSON Schema 校验,此类错误难以在运行时拦截。

文档指出:

Type 是数据类型校验的基础,可以是字符串或数组。若输入数据类型不匹配,应输出 nil 或拒绝请求。

但当前系统显然未对此类场景进行校验。


4. SP 与 BMC 间通信逻辑缺失

用户反馈:未在开源部分找到 SP 交互相关代码

这表明 SP(Smart Provisioning)服务与 BMC 之间的接口逻辑可能是闭源或未完整发布。SPResult 数据由 SP 提供,经 BMC 封装后通过 Redfish 暴露。若:

  • SP 返回给 BMC 的 NIC 诊断结果 Detail 为空字符串;
  • BMC 没有做类型规范化处理,直接透传原始数据;

则会引发此问题。因此,问题根源可能在于 SP 端的数据构造不符合 BMC 接口契约


解决建议

:white_check_mark: 1. 统一响应数据类型

确保所有设备类型的 Detail 字段均为数组类型。即使无细节信息,也应返回空数组 [] 而非空字符串。

{
  "Device": "NIC",
  "Status": "Successful",
  "Detail": []   // ✅ 正确做法
}

:white_check_mark: 2. 强化接口映射配置类型声明

在接口映射配置文件中显式声明 Detail 字段类型为数组:

"Detail": {
  "Type": "array",
  "items": { ... }
}

或通过 Formula 强制转换:

"Formula": "if type(data) == 'string' then {} else data end"

:white_check_mark: 3. 加入响应前校验逻辑

Statements 处理流程中加入类型检查,对非数组类型的 Detail 进行清洗或日志告警。

:white_check_mark: 4. 推动 SP 与 BMC 接口契约标准化

建议制定明确的 SP → BMC 数据交互模型,规定字段名、类型、必选项等,并在两端实现校验。


结论

该问题是由于 SPService 返回的 Detail 字段在不同设备间类型不一致,且 BMC 层未做强制类型校验与统一处理 所致,属于典型的 data type inconsistency 问题。

根本原因

SP 在处理 NIC 诊断结果时,将 Detail 设置为空字符串而非空数组,BMC 直接透传该异常数据,违反了 Redfish 接口的数据一致性规范。

解决方案

从 SP 端统一输出格式,并在 BMC 接口层增加类型约束与校验,确保对外暴露的 Redfish API 响应结构一致、类型合规。

相关链接:

  1. redfish获取SPService的DeviceInfo时部分字段缺失数据
  2. 【iTestSmart】ipmi接口设置SmartCooling模式,日志显示成功,但结果Fail。
  3. 【公示中,下次评议时间7.28】网卡驱动规范v0.1
  4. Atlas 300V pro NPU卡信息显示不全
  5. 模型规范定义v1.0 | 文档中心 | openUBMC

/redfish/v1/Managers/1/SPService/SPResult/1接口Detail 字段类型不一致问题已在SP 1.17.0版本解决,建议使用当前SP最新发布版本1.20.0