【已评审】Redfish EventDestination资源支持snmp trap上报

issue链接

背景

redfish协议中EventDestination资源(/redfish/v1/EventService/Subscriptions)支持redfish、snmp、syslog、smtp四种协议类型事件订阅资源的创建、查询、修改、删除功能。而openUBMC目前仅实现了redfish事件订阅相应的能力,其他能力均由Oem资源承载。

同时,有客户对事件订阅功能提出诉求,需要实现协议中EventDestination资源关于snmp协议事件订阅的相关能力。

现状

  • redfish将各种协议的事件订阅均设定为EventDestination资源,附属于同一集合资源下,且各资源之间互相独立。典型操作为资源的创建与删除,当前openUBMC的redfish事件订阅为该模式。

  • openUBMC事件上报相关OEM资源(例如SyslogService、SnmpService、SmtpService)中,部分资源中包含事件订阅功能(例如SnmpService不仅包含snmp agent管理能力,还包含snmp trap管理能力),此类资源创建多个事件订阅时,多个事件订阅共享一部分公共属性,且无论是否已创建事件订阅,资源中均能查询到4个订阅服务器(默认不使能)。典型操作为使能的开启与关闭与属性的修改,当前openUBMC的snmp trap功能为该模式。

因此,实现EventDestination资源支持snmp trap上报不能复用原有OEM资源中的事件订阅功能,否则会导致创建事件订阅时,造成原有资源的变更。

总体策略:单独维护EventDestination标准snmp事件订阅,标准事件订阅与OEM事件订阅隔离

EventDestination标准snmp事件订阅:由redfish官方规定的满足EventDestination资源能力的snmp事件订阅实例,通过EventDestination资源进行创建与维护。简称为标准snmp事件订阅标准事件订阅

OEM类型snmp事件订阅:由openUBMC自定义的snmp事件订阅实例,主要通过OEM资源SnmpService进行维护。简称为OEM snmp事件订阅OEM事件订阅

单独维护EventDestination标准资源snmp事件订阅,该类型事件订阅最多4个。最终形成snmp trap事件订阅由4个标准事件订阅和4个OEM事件订阅组成,共计8个。标准资源由EventDestination资源维护,OEM事件订阅由OEM资源维护。

本次实现的标准资源能力对齐OEM类型snmp事件订阅,并充分考虑后续相关功能(如事件筛选、暂停上报)的扩展能力。后续标准资源会进行相关功能的扩展,OEM资源则停止演进。

决策点

决策点一:Redfish接口 | 标准snmp事件订阅接口uri

uri:/redfish/v1/EventService/Subscriptions/:id
redfish事件订阅中id为1~4,snmp trap事件订阅中,id为Snmp+数字的形式,如/redfish/v1/EventService/Subscriptions/Snmp1

后续syslog与smtp事件订阅的uri也类似于Snmp事件订阅,采用协议名+id

例如:GET /redfish/v1/EventService/Subscriptions

{
    "@odata.context": "/redfish/v1/$metadata#EventDestinationCollection.EventDestinationCollection",
    "@odata.type": "#EventDestinationCollection.EventDestinationCollection",
    "@odata.id": "/redfish/v1/EventService/Subscriptions",
    "Name": "Event Subscriptions Collection",
    "Members@odata.count": 4,
    "Members": [
        {
            "@odata.id": "/redfish/v1/EventService/Subscriptions/1"
        },
        {
            "@odata.id": "/redfish/v1/EventService/Subscriptions/Snmp1"
        },
        {
            "@odata.id": "/redfish/v1/EventService/Subscriptions/Smtp2" # 暂不支持Smtp事件订阅
        },
        {
            "@odata.id": "/redfish/v1/EventService/Subscriptions/Syslog1" # 暂不支持Syslog事件订阅
        }
    ]
}

决策点二:资源协作接口 | 新增创建标准snmp事件订阅方法

Redfish事件订阅对应的资源协作接口path:/bmc/kepler/EventService/Subscriptions
Redfish事件订阅对应的资源协作接口interface:bmc.kepler.EventService.Subscriptions

资源path/bmc/kepler/EventService/Subscriptions/Snmp
资源interfacebmc.kepler.EventService.Subscriptions.SnmpDestinations
变化类型:新增接口
应用场景:创建snmp事件订阅
详细描述

方法名称 CreateDestination
变化类型 新增接口
请求签名 a{ss}
请求参数说明 DestinationValues:事件订阅的请求参数,包括:
必选参数
1)Destination(事件订阅接收地址)
2)EventFormatType(事件订阅侦听的事件类型)
3)Context(事件订阅上下文信息)
4)Protocol(事件订阅使用的协议)
5)SubscriptionType(事件订阅类型)
可选参数
6)Severities(告警发送级别)
7) AuthenticationProtocol(snmp鉴权算法)
8)TrapMode(snmp trap模式)
9)ServerIdentity(主机标识)
SNMPv1/SNMPv2c可选参数
10)TrapCommunity(团体名)
SNMPv3可选参数
11)EncryptionProtocol(snmp加密算法)
12)AuthenticationKey(snmp鉴权密码/密钥)
13)EncryptionKey(snmp加密密码/密钥)
响应签名 y
响应参数说明 Id:事件订阅标识
访问权限 BasicSetting

请求参数示例
SNMPv1/SNMPv2c:

{
    "Destination": "snmp://1.2.3.4:162",
    "EventFormatType": "[\"Event\"]",
    "Context": "",
    "Protocol": "SNMPv1",
    "Severities": "[\"Critical\"]",
    "AuthenticationProtocol": "CommunityString",
    "TrapCommunity": "CommunityName@example",
}

SNMPv3:

{
    "Destination": "snmp://user@1.2.3.4:162",
    "EventFormatType": "[\"Event\"]",
    "Context": "",
    "Protocol": "SNMPv3",
    "AuthenticationProtocol": "HMAC384_SHA512",
    "EncryptionProtocol": "CBC_DES",
    "AuthenticationKey": "AuthenticationKey@example",
    "EncryptionKey": "EncryptionKey@example"
}

决策点三:资源协作接口 | 新增标准snmp事件订阅资源

Redfish事件订阅对应的资源协作接口path:/bmc/kepler/EventService/Subscriptions/:Id
Redfish事件订阅对应的资源协作接口interface:bmc.kepler.EventService.Subscriptions.Destination

资源path/bmc/kepler/EventService/Subscriptions/Snmp/:Id

备选:/bmc/kepler/EventService/Subscriptions/Snmp/Destinations/:Id

资源interfacebmc.kepler.EventService.Subscriptions.SnmpDestination
变化类型:新增interface
应用场景:snmp事件订阅资源
详细描述

属性名称 说明 签名 访问权限 持久化 变化通知 属性值来源 约束
Id 事件订阅资源Id y Read:ReadOnly 掉电持久化 false 初始化生成
Destination 事件订阅接收地址 s Read:ReadOnly 掉电持久化 false 北向接口创建时指定
Protocol 事件订阅使用的协议 s Read:ReadOnly 掉电持久化 false 北向接口创建时指定 Snmp事件订阅取值:SNMPv1;SNMPv2c;SNMPv3
Context 事件订阅上下文信息 s Read:ReadOnly
Write:BasicSetting
掉电持久化 false 北向接口
State snmp事件订阅的上报状态 s Read:ReadOnly 掉电持久化 false 北向接口预留 当前仅有"Enabled“一种状态
EventFormatType 事件订阅侦听的事件类型(redfish事件订阅不使用,当前仅用于snmp事件订阅) as Read:ReadOnly 掉电持久化 false 北向接口创建时指定 当前仅支持取值[“Event”]
Severities 上报事件的严重程度 as Read:ReadOnly 掉电持久化 false 北向接口创建时指定 支持指定OK、Warning、Critical三种等级,三种等级可独立设置,Warning等级对应openUBMC事件等级中的Minor与Major两个等级
AuthenticationProtocol snmp鉴权算法 s Read:ReadOnly
Write:BasicSetting
掉电持久化 false 北向接口
AuthenticationKeySet snmp鉴权密码/密钥是否已设置 b Read:ReadOnly 掉电持久化 false 组件内部
EncryptionProtocol snmp加密算法 s Read:ReadOnly
Write:BasicSetting
掉电持久化 false 北向接口
EncryptionKeySet snmp加密密码/密钥是否已设置 b Read:ReadOnly 掉电持久化 false 组件内部
TrapMode snmp trap模式 s Read:ReadOnly
Write:BasicSetting
掉电持久化 false 北向接口 枚举值:PreciseAlarm,OID
ServerIdentity snmp trap主机标识 s Read:ReadOnly
Write:BasicSetting
掉电持久化 false 北向接口 枚举值:BoardSN、ProductAssetTag、HostName
方法名称 Delete SetAuthenticationKey SetEncryptionKey SetCommunity
方法说明 删除Snmp事件订阅 设置Snmp事件订阅鉴权密码或密钥 设置Snmp事件订阅密码或密钥 设置Snmp事件订阅团体名
请求签名 s s s
请求参数说明 Key:SNMPv3上报用户鉴权密码或密钥 Key:SNMPv3上报用户加密密码或密钥 Community:snmp上报的团体名
响应签名
响应参数说明
访问权限 BasicSetting BasicSetting BasicSetting BasicSetting

决策点四:Redfish接口 | snmp事件订阅资源新增Oem属性TrapMode、ServerIdentity

uri: /redfish/v1/EventService/Subscriptions/:id(snmp协议)
操作类型: GET、PATCH、POST(集合资源/redfish/v1/EventService/Subscriptions
应用场景:查询、创建snmp事件订阅,修改snmp事件订阅设置

属性名称 取值类型 属性描述 取值 操作权限 是否频繁变化并需要屏蔽变化事件 备注
Oem/{{OemIdentifier}}/SNMP/TrapMode boolean snmp trap模式 枚举值:PreciseAlarm,OID GET:ReadOnly
PATCH:BasicSetting
-
Oem/{{OemIdentifier}}/ServerIdentity string snmp trap主机标识 枚举值:BoardSN、ProductAssetTag、HostName GET:ReadOnly
PATCH:BasicSetting
-

决策点五:Redfish接口 | EventService资源新增Oem属性SnmpReportType

该决策点已评审通过

uri: /redfish/v1/EventService
变化类型: 新增属性
操作类型: GET
应用场景:查询、设置Snmp事件订阅告警类型
详细描述

属性名称 Oem/{{OemIdentifier}}/SnmpReportType
取值类型 string
说明 snmp事件订阅告警类型
取值范围 枚举值:SEL、OemEvent
操作权限 GET:ReadOnly
PATCH:BasicSetting
是否频繁变化并需要屏蔽变化事件

评审结论

决策点一:同意redfish事件订阅接口新增支持SNMPTrap订阅
uri:/redfish/v1/EventService/Subscriptions/{EventDestinationId}
(1) redfish事件订阅:EventDestinationId保持原来的纯数字风格,如"1",表示第一个redfish事件订阅者
(2) SNMPTrap订阅:EventDestinationId使用Snmp+数字的风格,如"Snmp1",表示第一个SNMPTrap订阅者

决策点二:同意新增创建SNMPTrap订阅者的资源协作接口:
新增path:/bmc/kepler/EventService/Subscriptions/Snmp
新增interface:bmc.kepler.EventService.Subscriptions.SnmpDestinations
新增方法:
CreateDestination:用于创建SnmpTrap类型事件订阅,请求签名a{ss},表示创建订阅者的参数,包括目的地址、协议类型、上下文、事件格式等,响应签名为y,表示订阅者资源Id

决策点三:同意新增描述SNMPTrap订阅者的资源协作接口:
新增path:/bmc/kepler/EventService/Subscriptions/Snmp/:Id
新增interface:bmc.kepler.EventService.Subscriptions.SnmpDestination
新增属性:

属性名称 说明 签名
Id 事件订阅资源Id y
Destination 事件订阅接收地址 y
Protocol 事件订阅使用的协议 s
Context 事件订阅上下文信息 s
State snmp事件订阅的上报状态 s
EventFormatType 事件订阅侦听的事件类型(redfish事件订阅不使用,当前仅用于snmp事件订阅) as
Severities 上报事件的严重程度 as
AuthenticationProtocol snmp鉴权算法 s
AuthenticationKeySet snmp鉴权密码/密钥是否已设置 b
EncryptionProtocol snmp加密算法 s
EncryptionKeySet snmp加密密码/密钥是否已设置 b
TrapMode snmp trap模式 s
ServerIdentity snmp trap主机标识 s

新增方法:

方法名称 Delete SetAuthenticationKey SetEncryptionKey SetCommunity
说明 删除Snmp事件订阅 设置Snmp事件订阅鉴权密码或密钥 设置Snmp事件订阅密码或密钥 设置Snmp事件订阅团体名
请求签名 s s s
响应签名
访问权限 BasicSetting BasicSetting BasicSetting BasicSetting

决策点四:同意redfish接口/redfish/v1/EventService/Subscriptions/{EventDestinationId}新增Oem属性Oem/{{OemIdentifier}}/SNMP/TrapMode 、Oem/{{OemIdentifier}}/ServerIdentity,具体如下表:

属性名称 取值类型 取值 操作权限 说明
Oem/{{OemIdentifier}}/SNMP/TrapMode string 枚举值:PreciseAlarm,OID GET:ReadOnly
PATCH:BasicSetting
SNMP Trap报文类型,仅对SNMPTrap订阅有效
Oem/{{OemIdentifier}}/ServerIdentity string 枚举值:BoardSN、ProductAssetTag、HostName GET:ReadOnly
PATCH:BasicSetting
向订阅者发送消息时携带的设备标识

决策点五:同意redfish接口/redfish/v1/EventService新增Oem属性Oem/{{OemIdentifier}}/SnmpReportType,具体如下表:

属性名称 Oem/{{OemIdentifier}}/SnmpReportType
取值类型 string
取值范围 枚举值:SEL、OemEvent
操作权限 GET:ReadOnly
PATCH:BasicSetting

遗留事项

1、决策点一:uri的动态参数要和其它接口的风格保持一致
结论:参考/redfish/v1/Systems/{Systemid}/Processors/{ProcessorId}接口的实例,针对SNMPTrap订阅者的url(/redfish/v1/EventService/Subscriptions/{EventDestinationId})中的动态参数EventDestinationId使用"Snmp+数字"的格式,如"Snmp1"

2、决策点二:删除BobEnabled
结论:BobEnabled已删除

3、决策点二:新增一个接口实现,不要复用之前的接口
结论:新增interface:bmc.kepler.EventService.Subscriptions.SnmpDestinations