【待评审】支持天池单板CPLD JTAG扫链巡检,新增Redfish接口、ipmi接口、资源协作接口

背景

当前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接口,同理需要新增两个接口,分别用于调用资源协作接口中的两个函数的实现内容,分别启动扫链任务和获取结果。

基于以上整体方案设计,需要新增以下接口:

  1. 新增资源协作接口bmc.kepler.Boards.CpldJtagScan,该接口下提供方法StartCpldJtagScan和GetCpldJtagScanResult,用于启动扫链任务以及获取扫链结果
  2. 新增Redfish接口Boards.StartCpldJtagScan,用于调用资源协作接口启动扫链任务
  3. 新增Redfish接口CpldJtagScanResult,用于调用调用资源协作接口获取扫链结果
  4. 新增ipmi接口,用于启动扫链任务
  5. 新增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

  1. 启动扫链操作时,环境上不存在满足扫链条件的CPLD对象:
    发生该情况时,方法会通过error引擎生成ActionNotSupported错误并返回。该错误信息来自于base.json中的已有定义。

  2. 启动扫链操作时,部分CPLD对象由于扫链接口调用失败而返回异常:
    发生该情况时,本方法StartCpldJtagScan依然返回成功,具体的扫链失败信息后续调用GetCpldJtagScanResult接口时再返回。

  3. 成功启动所有CPLD对象的扫链任务:
    返回成功。

GetCpldJtagScanResult

  1. 获取扫链结果时,之前还尚未执行过StartCpldJtagScan方法
    发生该情况时,获取到ScanResult为"Not started",ScanResultInfo为空数组。(方法本身不抛出错误)

  2. 获取扫链结果时,扫链任务还未全部完成
    发生该情况时,获取到ScanResult为"Running",ScanResultInfo数组中仅包含当前已完成扫链任务的单板信息。(方法本身不抛出错误)

  3. 在所有单板的扫链任务都完成后,获取扫链结果时,部分CPLD对象由于扫链接口调用失败而返回异常:
    发生该情况时,获取到ScanResult为"Failed",ScanResultInfo数组中包含所有执行扫链任务的单板信息,其中发生异常的单板信息中,扫链结果为失败,失败原因记录为扫链接口调用失败。(方法本身不抛出错误)

  4. 在所有单板的扫链任务都完成后,获取扫链结果时,部分CPLD对象扫链结果与CSR配置不一致:
    发生该情况时,获取到ScanResult为"Failed",ScanResultInfo数组中包含所有执行扫链任务的单板信息,其中发生异常的单板信息中,扫链结果为失败,失败原因记录为CSR配置与实际不一致。(方法本身不抛出错误)

  5. 所有单板的扫链任务均成功,获取扫链结果:
    获取到ScanResult为"Succeed",ScanResultInfo数组中包含所有执行扫链任务的单板信息,扫链结果均为成功。

新增接口影响

路径 新增接口影响 CSR配置影响 持久化影响 其他影响
/bmc/kepler/Systems/:systemid/Boards 对外提供启动CPLD扫链任务以及获取扫链结果的功能 无需CSR配置,无影响 无影响 需要组件实现新增属性和方法

是否准备好AI预审

(必选)是/否

评审结论

(必选)针对决策点,详细描述最终结论,不能是简单的同意或不同意,通过或不通过。(提交议题时删除此引导说明)

正面示例:
同意redfish接口/redfish/v1/XXXXX的GET操作响应体增加如下属性
(详细描述属性名称、属性取值类型、取值范围、约束等)

不同意新增资源协作接口XXXXX

不同意资源协作接口XXX新增XX属性/方法

反面示例:
通过,同意新增接口

遗留问题

(可选)列出评审会议现场无法直接给出明确结论的事务,会后确认清楚之后要在此处录入明确的结论,如不涉及,则可以写无或删除此部分。参考格式如下:(提交议题时删除此引导说明)
1、需要确认XXX
结论: