【已评审】新增数据同步资源协作接口

ISSUE

支持基于CAN-FD总线的属性同步

评审背景

  • 产业推出新的硬件形态,该形态下BMC会出两路CAN-FD总线承担板间通信的基础能力,硬件中的每个节点对于CAN-FD来说均为一个下挂的设备,设备上的BMC均可以通过该总线进行通信

  • 数据同步则是基于CAN-FD通信实现,需要通过广播或者单播(通过过滤不需要的信号)实现板间通信

触发原因

新需求

方案分析

  • 当前是基于CAN-FD进行实现,但为保证后续的拓展性(例如TCP),需要将通信类型做到可配置,因此需要新增一个数据同步类承载配置能力
  • bmc_datasync仅存储其他节点的数据,所以在同步数据更新后,需通知其他组件来获取同步数据,流程为:
  1. 其他节点的数据同步后,采用信号的方式进行广播
  2. 订阅信号的组件通过资源协作接口查询同步数据并消费

信号中需要包含变更的接口名称,组件可以以此判断是否需要查询此次更新的数据。如下图所示:

graph TD;
    节点1 --同步-->本端BMC
    节点2 --同步-->本端BMC
    本端BMC -->A
    A[同步数据更新] --属性值、是否老化等--> B[广播信号];
    B --interface--> C[组件A]
    C --> D{是否需要}
    D --是--> E[查询接口]
    E --interface--> 本端BMC
    B --interface--> 组件B
    B --interface--> 组件C
    组件B --> ...
    组件C --> ..

评审点

评审点一: 新增同步数据更新信号 PropertyUpdated

path(新增): /bmc/kepler/Managers/:ManagerId/DataSync
interface(新增): bmc.kepler.Managers.DataSync
signal(新增): PropertyUpdated

信号携带参数详情如下:

名称 类型 说明
Identifier y 当前同步更新的属性来自于哪个远端BMC
ObjectName s 当前同步的属性归属对象名称
Interface s 当前同步的属性归属接口名称

评审点二: 新增数据同步属性获取方法 GetProperties

path(已有): /bmc/kepler/Managers/:ManagerId/DataSync
interface(已有): bmc.kepler.Managers.DataSync
method(新增): GetProperties

** 新增方法详情如下:**

项目 说明
方法名 GetProperties
方法描述 获取已同步的属性
权限 ReadOnly
请求签名 yss
请求说明 Identifier:签名为 y,表征需要获取哪个远端BMC同步过来的属性。如果是0xFF则为获取所有节点的同步属性
ObjectName:签名为 s,表征需要获取同步过来的哪个对象的属性
Interface:签名为 s,表征需要获取同步过来的哪个接口的属性
响应签名 a(ya(sa{ss}))
响应说明 Properties:查询同步的属性信息集合,如果没有属性则返回空。集合元素结构如下 :
 Identifier:签名为 y,表征查询同步属性归属的远端BMC的标识
 PropertyDetails:签名为 a(sa{ss}),表征同步属性的详细信息,元素结构如下:
  PropertyName:签名为 s,属性名称
  PropertyItems:签名为 a{ss},属性的具体信息,字典结构,其中key包括:
   PropertyValue:表示属性值,取值类型为字符串,对于数组、结构体类型则格式化成json字符串
   Expired:表示属性值是否老化,取值类型为字符串,“true”- 已老化,“false” -未老化

结论

同意新增如下资源协作对象路径和接口
新增path: bmc.kepler.Managers.DataSync
新增inteface:/bmc/kepler/Managers/:ManagerId/DataSync
新增信号:

  • PropertyUpdated,在数据同步发生时该信号发出。信号参数签名为 yss,表示属性同步更新时的远端BMC的标识符,属性归属的对象名称,属性归属的资源协作接口名称。
    新增方法:
  • GetProperties,用于获取已经同步的属性的集合。请求参数签名为 yss,响应参数签名为 a(ya(sa{ss})),请求和响应参数说明见评审点2,权限为 ReadOnly

遗留问题

问题1:方法 GetProperties 响应中属性以及取值能否直接进行反序列化进行返回。
结论:在远端BMC进行同步时,如果是简单类型(如整数,字符串)会直接保存原始值,如果是复杂类型,则会使用 json 格式的字符串进行处理。对于 D-Bus 的 Variant 类型,会在属性同步时直接进行反序列化处理转换为简单类型以及 json 格式的字符串。