webui电源设置适配多种电源规则

背景

新电源类型接入 openUBMC 后,WEB 电源设置页面需要根据电源类型动态控制页面能力。特殊电源存在与普通电源不同的配置约束:主备模式下主用电源数量需要满足供电策略要求,同时深度休眠配置也有所不同。

如果在 PowerInfo.vue 页面组件中直接通过具体型号硬编码判断电源,页面逻辑会与电源型号强耦合,后续新增电源型号或新增电源能力时需要继续修改页面主流程,扩展性和可维护性较差,也容易影响社区电源的既有展示与配置行为。

关联ISSUE

[需求]: 电源设置适配多种电源规则 - openUBMC/webui - AtomGit

整体方案

WEB 前端新增电源能力识别与配置校验的独立模块,将“电源类型识别”和“页面交互控制”解耦:

  1. 新增 powerSupplyRules.ts,通过 SupplyList 中的 ModelPartNumber 等字段识别电源类型,并输出能力集合。

  2. 新增 powerSupplyValidators.ts,根据能力集合、总电源数量和已选择主用电源数量执行保存前校验。

  3. 修改 PowerInfo.vue,页面加载电源信息后调用规则模块获取能力集合,并基于能力集合控制主用电源选择上限、深度休眠展示和保存前校验。

  4. 不新增 WEB REST 接口,不修改 /UI/Rest/System/PowerSupply 请求路径和响应结构,仍复用既有 getpowerSupply()setPowerSupply(configParam) 流程。

评审点

评审点1:新增 WEB 前端电源能力识别规则模块 powerSupplyRules.ts

评审点2:新增 WEB 前端电源配置保存前校验模块 powerSupplyValidators.ts

评审点3:修改 PowerInfo.vue,由页面硬编码型号判断调整为基于能力集合驱动页面行为。

详细描述

评审点1:新增 WEB 前端电源能力识别规则模块 powerSupplyRules.ts

path/home/hwrm/webui/src/pages/System/Power/utils/powerSupplyRules.ts(新增)

interface:无后端接口变更,前端内部模块接口新增

变化类型:新增前端工具模块

| 变更类型 | 名称 | 类型/签名 | 只读 | 变化通知 | 描述 | 访问权限 | 数据来源 | 持久化类型 | 变更影响 |

| — | — | — | — | — | — | — | — | — | — |

| 新增 | POWER_SUPPLY_CAPABILITY | const | 是 | 否 | 定义电源能力枚举,当前包含 mainPsuSelectionLimitdisableDeepSleep | 前端内部 | 软件定义 | 不持久化 | 页面通过能力集合判断是否启用主用电源数量限制、是否禁用深度休眠 |

| 新增 | PowerSupplyCapability | type | 是 | 否 | 电源能力类型定义 | 前端内部 | 软件定义 | 不持久化 | 为能力集合和校验模块提供类型约束 |

| 新增 | getPowerSupplyCapabilities(powerSupplyList) | PowerSupplyLike[] => Set<PowerSupplyCapability> | 否 | 否 | 根据电源列表匹配规则并返回能力集合 | 前端内部 | /UI/Rest/System/PowerSupply 返回数据 | 不持久化 | CRPS 电源命中后返回主用电源选择限制和禁用深度休眠能力 |

| 新增 | getPowerSupplyIdentityList(powerSupplyData) | { SupplyList?: PowerSupplyLike[] } => PowerSupplyLike[] | 否 | 否 | 从电源接口返回数据中提取用于能力识别的 SupplyList | 前端内部 | /UI/Rest/System/PowerSupply 返回数据 | 不持久化 | 当 SupplyList 缺失或非数组时返回空数组,避免页面误判或报错 |

规则实现当前包含 CRPS 规则:使用 ModelPartNumber 字段与 /^CRPS/i 正则匹配。命中后返回以下能力:

  • mainPsuSelectionLimit:主用电源选择数量需要受限;

  • disableDeepSleep:页面需要隐藏或禁用深度休眠配置。

该模块不直接操作 UI,不直接提交配置,只输出能力集合,便于后续新增电源型号或新增能力时扩展规则表。

评审点2:新增 WEB 前端电源配置保存前校验模块 powerSupplyValidators.ts

path/home/hwrm/webui/src/pages/System/Power/utils/powerSupplyValidators.ts(新增)

interface:无后端接口变更,前端内部模块接口新增

变化类型:新增前端工具模块

| 变更类型 | 名称 | 类型/签名 | 只读 | 变化通知 | 描述 | 访问权限 | 数据来源 | 持久化类型 | 变更影响 |

| — | — | — | — | — | — | — | — | — | — |

| 新增 | PowerSupplyValidationContext | type | 是 | 否 | 配置校验上下文,包含能力集合、总电源数、已选主用电源数 | 前端内部 | 页面运行时数据 | 不持久化 | 为保存前校验提供统一输入 |

| 新增 | PowerSupplyValidationResult | type | 是 | 否 | 配置校验结果,包含 valid 和可选错误提示 | 前端内部 | 软件定义 | 不持久化 | 页面根据结果决定是否阻止保存 |

| 新增 | validatePowerSupplyConfig(context) | PowerSupplyValidationContext => PowerSupplyValidationResult | 否 | 否 | 根据能力集合校验主用电源选择数量 | 前端内部 | 页面运行时数据 | 不持久化 | CRPS 主备配置不满足数量约束时阻止提交并提示用户 |

当能力集合不包含 mainPsuSelectionLimit 时,校验直接通过,不影响普通电源既有流程。

当能力集合包含 mainPsuSelectionLimit 时,校验规则如下:

  • 最少主用电源数量为 Math.floor(totalPsuCount / 2) + 1

  • 最大主用电源数量为 totalPsuCount - 1

  • 如果最大值小于最小值,表示当前电源数量下需要全部选择为主用,未满足时提示 POWER_ALL_SELECT_REQUIRED

  • 如果已选择主用电源数量小于最小值,提示 POWER_MAIN_COUNT_MIN

  • 如果已选择主用电源数量大于最大值,提示 POWER_MAIN_COUNT_MAX

评审点3:修改 PowerInfo.vue,由页面硬编码型号判断调整为基于能力集合驱动页面行为

path/home/hwrm/webui/src/pages/System/Power/components/info/PowerInfo.vue(已存在)

interface:无后端接口变更,复用既有 /UI/Rest/System/PowerSupply

变化类型:修改前端页面逻辑

| 变更类型 | 名称 | 类型/签名 | 只读 | 变化通知 | 描述 | 访问权限 | 数据来源 | 持久化类型 | 变更影响 |

| — | — | — | — | — | — | — | — | — | — |

| 变更 | powerSupplyCapabilities | shallowRef(Set<PowerSupplyCapability>) | 否 | 否 | 保存当前页面识别出的电源能力集合 | 前端内部 | getPowerSupplyCapabilities() | 不持久化 | 页面 UI 和保存校验统一基于能力集合驱动 |

| 变更 | hasMainPsuSelectionLimit | computed | 是 | 否 | 判断是否启用主用电源数量限制 | 前端内部 | powerSupplyCapabilities | 不持久化 | 控制主用电源选择上限、帮助提示和保存前校验 |

| 变更 | disableDeepSleep | computed | 是 | 否 | 判断是否禁用深度休眠配置 | 前端内部 | powerSupplyCapabilities | 不持久化 | 控制深度休眠配置项是否展示 |

| 变更 | init() | 页面初始化函数 | 否 | 否 | 获取电源信息后调用能力识别模块 | 前端内部 | getpowerSupply() 返回数据 | 不持久化 | 页面加载后即可根据 CRPS 能力调整展示和交互 |

| 变更 | powerConfig() | 保存处理函数 | 否 | 否 | 保存前调用 validatePowerSupplyConfig() 执行能力相关校验 | 前端内部 | 页面运行时数据 | 不持久化 | 校验失败时阻止 setPowerSupply(configParam) 提交 |

| 变更 | 主用电源选择组件 | el-radio-group / el-checkbox-group | 否 | 否 | 当存在主用电源选择限制时设置 checkbox 最大选择数量并展示帮助提示 | 用户可见 | 页面状态 | 不持久化 | 限制 CRPS 场景下主用电源选择范围 |

| 变更 | 深度休眠配置项 | el-form-item | 否 | 否 | 展示条件由 deepSleepSupported 扩展为 deepSleepSupported && !disableDeepSleep | 用户可见 | 页面状态 + 后端字段 | 不持久化 | CRPS 场景下隐藏深度休眠配置,非 CRPS 仍按后端能力展示 |

页面加载时调用 getpowerSupply() 获取电源详情,再通过 getPowerSupplyCapabilities(getPowerSupplyIdentityList(res?.data)) 生成能力集合。页面不再直接承担具体电源型号识别职责,只根据 hasMainPsuSelectionLimitdisableDeepSleep 等计算属性控制 UI 和保存流程。

保存时仅在能力集合包含 mainPsuSelectionLimit 且工作模式为 Active/Standby 时执行主用电源数量校验。校验失败时通过 showElMessage('error', message) 提示用户并停止提交;校验通过后继续复用原有 setPowerSupply(configParam) 提交逻辑。

深度休眠展示逻辑变更为:仅当后端 DeepSleepSupported 为真且能力集合不包含 disableDeepSleep 时展示深度休眠开关。该变更保证 CRPS 电源隐藏深度休眠配置,同时不影响非 CRPS 电源的既有展示规则。

是否准备好AI预审

评审结论

遗留问题