背景
当前CPLD升级流程中,如果由于CSR配置/链路异常等原因导致JTAG链路不通,则会在升级过程中发生异常,返回升级失败。现在期望该异常情况能够在BMC正常运行时提前发现,巡检人员通过执行新增的Redfish接口或是ipmi接口,启动所有单板的CPLD扫链任务。general_hardware组件收到下发的命令后对所有单板执行扫链检测,判断扫链得到的CPLD数量是否与CSR中定义一致。巡检人员可以进一步执行另一个新增的Redfish/ipmi查询接口获取扫链结果,从而验证CSR配置的JTAG升级CPLD芯片与实际硬件扫链结果的一致性。
关联ISSUE
(可选)此议题关联的代码仓的issue链接。(提交议题时删除此引导说明)
整体方案
框架已提供CPLD的扫链接口,待升级CPLD升级对象下有方法GetChipIdCode,通过调用该方法,即可获取当前板卡上CPLD扫链的结果。为了获取所有单板的扫链结果,general_hardware需要在初始化时收集所有CPLD对象的信息,并按照这些对象所在的不同板卡分类维护。
为了对外提供对所有CPLD执行扫链检测的接口,需要在/bmc/kepler/Systems/1/Boards路径下提供一个新增的资源协作接口bmc.kepler.Boards.CpldJtagScan。该接口下提供两个方法:StartCpldJtagScan和GetCpldJtagScanResult。调用StartCpldJtagScan时,组件会启动线程,根据维护的所有CPLD对象信息,启动所有板卡的扫链任务。扫链任务完成后,调用GetCpldJtagScanResult即可获取扫链结果。
同时,作为巡检人员调用以上接口的入口,需要同理新增对应的Redfish接口。新增接口/redfish/v1/Chassis/1/Boards/Actions/Boards.StartCpldJtagScan用于调用资源协作接口的StartCpldJtagScan方法,启动扫链任务。另一方面新增接口/redfish/v1/Chassis/1/Boards/CpldJtagScanResult用于调用GetCpldJtagScanResult方法,获取扫链结果。
对于ipmi接口,同理需要新增两个接口,分别用于调用资源协作接口中的两个函数的实现内容,分别启动扫链任务和获取结果。
基于以上整体方案设计,需要新增以下接口:
- 新增资源协作接口bmc.kepler.Boards.CpldJtagScan,该接口下提供方法StartCpldJtagScan和GetCpldJtagScanResult,用于启动扫链任务以及获取扫链结果
- 新增Redfish接口Boards.StartCpldJtagScan,用于调用资源协作接口启动扫链任务
- 新增Redfish接口CpldJtagScanResult,用于调用调用资源协作接口获取扫链结果
- 新增ipmi接口,用于启动扫链任务
- 新增ipmi接口,用于获取扫链结果
评审点1:新增资源协作接口bmc.kepler.Boards
接口描述:该接口用于Redfish接口进行访问,从而触发CPLD扫链任务以及获取扫链任务的执行结果。
新增方法
| 方法名称 | 请求签名 | 请求参数描述 | 响应签名 | 响应参数描述 | 方法描述 | 访问权限 |
|---|---|---|---|---|---|---|
| StartCpldJtagScan | a{ss} | Context:方法调用上下文 | NA | NA | 开始执行对所有CPLD的扫链任务 | ? |
| GetCpldJtagScanResult | a{ss} | Context:方法调用上下文 | sa{s} | ScanResult:表示所有单板的扫链结果。取值范围:“Not started”、“Running”、“Succeed”、"Failed ScanResultInfo:表示每一个单板的扫链结果,具体展示每个进行扫链的单板名称,扫链结果,失败原因 |
获取扫链任务执行结果 | ? |
以上方法在运行过程中,可能发生的正常与异常情况,以及对应的行为如下:
StartCpldJtagScan
-
启动扫链操作时,环境上不存在满足扫链条件的CPLD对象:
发生该情况时,方法会通过error引擎生成ActionNotSupported错误并返回。该错误信息来自于base.json中的已有定义。 -
启动扫链操作时,部分CPLD对象由于扫链接口调用失败而返回异常:
发生该情况时,本方法StartCpldJtagScan依然返回成功,具体的扫链失败信息后续调用GetCpldJtagScanResult接口时再返回。 -
成功启动所有CPLD对象的扫链任务:
返回成功。
GetCpldJtagScanResult
-
获取扫链结果时,之前还尚未执行过StartCpldJtagScan方法
发生该情况时,获取到ScanResult为"Not started",ScanResultInfo为空数组。(方法本身不抛出错误) -
获取扫链结果时,扫链任务还未全部完成
发生该情况时,获取到ScanResult为"Running",ScanResultInfo数组中仅包含当前已完成扫链任务的单板信息。(方法本身不抛出错误) -
在所有单板的扫链任务都完成后,获取扫链结果时,部分CPLD对象由于扫链接口调用失败而返回异常:
发生该情况时,获取到ScanResult为"Failed",ScanResultInfo数组中包含所有执行扫链任务的单板信息,其中发生异常的单板信息中,扫链结果为失败,失败原因记录为扫链接口调用失败。(方法本身不抛出错误) -
在所有单板的扫链任务都完成后,获取扫链结果时,部分CPLD对象扫链结果与CSR配置不一致:
发生该情况时,获取到ScanResult为"Failed",ScanResultInfo数组中包含所有执行扫链任务的单板信息,其中发生异常的单板信息中,扫链结果为失败,失败原因记录为CSR配置与实际不一致。(方法本身不抛出错误) -
所有单板的扫链任务均成功,获取扫链结果:
获取到ScanResult为"Succeed",ScanResultInfo数组中包含所有执行扫链任务的单板信息,扫链结果均为成功。
新增接口影响
| 路径 | 新增接口影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/Systems/:systemid/Boards | 对外提供启动CPLD扫链任务以及获取扫链结果的功能 | 无需CSR配置,无影响 | 无影响 | 需要组件实现新增属性和方法 |
是否准备好AI预审
(必选)是/否
评审结论
(必选)针对决策点,详细描述最终结论,不能是简单的同意或不同意,通过或不通过。(提交议题时删除此引导说明)
正面示例:
同意redfish接口/redfish/v1/XXXXX的GET操作响应体增加如下属性
(详细描述属性名称、属性取值类型、取值范围、约束等)
或
不同意新增资源协作接口XXXXX
或
不同意资源协作接口XXX新增XX属性/方法
反面示例:
通过,同意新增接口
遗留问题
(可选)列出评审会议现场无法直接给出明确结论的事务,会后确认清楚之后要在此处录入明确的结论,如不涉及,则可以写无或删除此部分。参考格式如下:(提交议题时删除此引导说明)
1、需要确认XXX
结论: