【规范】Redfish接口设计合规性必检指南

背景

本文档旨在为Redfish接口设计提供全面的合规性审计指导,结合DMTF Redfish规范(DSP0266)和业界实践,涵盖协议基础、数据模型、安全性、扩展机制等关键维度,并针对常见设计缺陷提供解决方案。

合规审计条目

《标准化属性定义原则》

所有资源必须 100% 遵循 DMTF 发布的 Redfish Schema 定义,禁止任何形式的标准属性篡改;厂商扩展必须严格限定于 Oem/{{OemIdentifier}} 对象内,且需显示声明 @odata.type 标识 Schema 版本(例如:若 AccountService 资源实现了 1.3.0 版本引入的 ActiveDirectory 属性,则其 @odata.type 属性必须更新为对应的版本)。

《易变属性识别与Etag管理原则》

设计Redfish接口时,必须前置识别易变属性(如传感器读数、实时状态),并在接口映射的IgnoreEtags配置中显式声明这些属性,避免因高频数据变更引发事件风暴。

《Redfish资源连通性与可发现性原则》

所有资源必须构成以Service Root为起点的连通资源树,通过@odata.id绝对路径识别自身位置,确保客户端能通过标准方式遍历整个资源树,禁止出现不可达资源。资源关联必须严格遵循:

关联类型 适用场景 实现方式
嵌套资源 直接父子关系 父资源嵌套子资源@odata.id
集合成员 资源集合中的成员 Members数组引用
Links关联 跨层级/跨集合引用 Links对象引用

规范依据: Redfish DSP0266 6.1

《OEM自定义查询参数命名规范》

所有OEM自定义查询参数必须采用 OEM-<厂商唯一标识>-<参数名> 格式,参数名不得与标准Redfish查询参数(如:$select/$expand)同名,禁止包含 &、?、= 等解析冲突字符。
规范依据: Redfish DSP0266 7.3.1

《集合资源纯净性原则》

集合资源的核心职责是提供成员资源的导航服务,禁止响应体扩展 OEM 属性。
规范依据: Redfish DSP0266 9.3

《属性 OEM 扩展三通道隔离原则》

属性 OEM 扩展必须且仅能通过 OEM、 Links、 Actions 三个独立通道实现,三者均允许直接作用于任意标准资源(即使该资源未预定义 Links 或 Actions 字段)和自定义资源。严禁在 Oem 对象内部嵌套扩展 Links 或 Actions 字段,所有扩展必须严格遵循通道隔离。规则解析表:

扩展通道 扩展场景
Oem 数据属性扩展(添加厂商自定义状态/配置)
Links 资源关联扩展(添加导航链接/外部引用)
Actions 操作行为扩展(添加厂商专属操作命令)

规范依据: Redfish DSP0266 9.4

《Redfish枚举设计原则》

Redfish枚举设计约束:

  1. 类型强制:必须使用字符串类型(string),禁止使用数字或布尔值替代枚举。
  2. 状态数量策略:
    二元状态 → 优先采用布尔类型(boolean)
    三元及以上 → 必须使用枚举类型(enum)
  3. 值域纯净性:不建议定义 "unknown" (未知)、"other"(其他)等通用占位值,此类值会显著降低系统互操作性。

规范依据: Redfish DSP0266 9.5.2、Redfish DSP0266 9.7.1

《字符串属性未初始化值空字符串返回原则》

当Redfish接口的字符串属性由用户/外部服务配置且未设置初始值时,必须返回空字符串 "" 以标识属性受支持但未初始化;仅当服务端发生读取错误等异常时,才允许返回null表示错误状态。禁止使用N/A、 <Empty>等非标准占位符。

场景 返回值 语义
属性受支持且未初始化 "" 有效空值,等待用户配置
属性因故障无法读取 null 服务端错误状态
属性不受支持/未实现/集合资源部分实例不支持 不返回该属性 客户端应忽略

规范依据: Redfish DSP0266 9.5.3

《Redfish null值使用规范》

严格遵循Schema类型定义:所有属性的空值处理必须完全依据其在Redfish Schema中的类型定义,区分包含null类型与不包含null类型两种情况。

  1. Schema定义包含null类型的属性
场景 处理方式 示例
系统异常 返回null表示取值失败 “Temperature”: null(传感器读取失败)
数据未就绪 返回null表示临时状态 字符串例外:返回空串"" “PowerWatts”: null(功率数据获取中) “HostName”: “”(主机名未配置)
特殊语义 按Schema定义,null可具有业务含义 “PowerLimit”: null表示无功率限制
PATCH操作 允许使用null进行"重置"或"清除" PATCH {“Description”: null}
  1. Schema定义不包含null类型的属性
场景 处理方式 示例
系统异常 不返回该属性 省略异常属性而非返回null
数据未就绪 不返回该属性 临时不可用属性从响应中移除
PATCH操作 禁止设置为null 返回400 Bad Request错误

备注:在Web接口层面,系统异常和数据未就绪等临时状态均返回null

规范依据: Redfish DSP0266 9.5.1 、Redfish DSP0266 9.6.1

《量纲属性单位后缀强制标注原则》

当属性值包含物理量单位或特殊语义时,必须在属性名称后缀明确标注单位标识符,禁止无量纲属性(如 状态码、比率值)和枚举型属性(如HealthStaus)添加单位后缀。常见单位属性示例:

单位名称 标准后缀 示例属性
瓦特 Watts PowerWatts
伏特 Volts ReadingVolts
电量 kWh EnergykWh
摄氏度 Celsius TemperatureCelsius
每分转速 RPM RotationSpeedRPM
带宽 Mbps、Gbps PortSpeedMbps、LinkSpeedGbps
CPU速率 MHz ProcessorSpeedMHz
毫秒 Milliseconds SensorPollingIntervalMilliseconds
秒 Seconds KeepaliveIntervalSeconds
分钟 Minutes HeartbeatIntervalMinutes
小时 Hours PowerOnHours
天 Days PasswordExpirationDays
周 Weeks BackupIntervalWeeks
月 Months BillingCycleMonths
年 Years WarrantyYears
位 bit TransferInhibit
字节 Bytes MemoryBytes
Kibibyte KiB FreeStorageSpaceKiB
Mebibyte MiB MemorySizeMiB
Gibibyte GiB TotalSystemMemoryGiB
Tebibyte TiB TotalCapacityTiB
百分比 Percent PowerLoadPercent
计数 Count ProcessorCount
资源状态 State PowerState

规范依据: Redfish DSP0266 9.7.1

《复杂对象拆分子资源原则》

属性避免嵌套超过 5 层(Oem/{{OemIdentifier}} 不纳入层级计算)的JSON结构,复杂对象应拆分为子资源。
违规反例

# 早期redfish资源设计(深层嵌套JSON)
GET /redfish/v1/Chassis/1/Thermal
{
    "Id": "Thermal",
    "Fans": [
        {
            "MemberId": "Fan1",
            "Reading": 12000,
            "Status": {
                "Health": "OK",
                "State": "Enabled"
            }
        }
    ]
}

合规设计

# 1. 拆分为子系统资源(减少主资源层级)
GET /redfish/v1/Chassis/1/ThermalSubsystem
{
    "Id": "ThermalSubsystem",
    "Fans": {
        "@odata.id": "/redfish/v1/Chassis/1/ThermalSubsystem/Fans"
    }
}

# 2. 复杂对象独立为子资源集合(扁平化)
GET /redfish/v1/Chassis/1/ThermalSubsystem/Fans
{
    "Members": [
        {
            "@odata.id": "/redfish/v1/Chassis/1/ThermalSubsystem/Fans/1"
        }
    ]
}

# 3. 属性展开为独立资源(深度控制)
GET /redfish/v1/Chassis/1/ThermalSubsystem/Fans/1
{
    "FanDiameterMm": 80,
    "SpeedPercent": {
        "SpeedRPM": 6660
    }
}

规范依据: Redfish DSP0266 9.8.2

《响应敏感数据置空原则》

任何通过 GET 操作返回的响应中,敏感数据属性(如密码、密钥、令牌)必须显式设置为 null;POST/PATCH 请求中允许传输明文值,且服务端日志必须脱敏处理。此规则对标准资源和 Oem 扩展均强制生效。
规范依据: Redfish DSP0266 13.2

5 个赞