【待评审】整改WebRest接口中的DELETE操作,将其修改为POST接口

背景

客户对安全提出了更高的要求,不允许WebRest接口中的Delete操作存在。需要整改WebRest接口中的DELETE操作,将其修改为POST接口。并保证不同版本的兼容性

整体方案

整改WebRest接口中的Delete操作,将其修改为POST接口,并删除原有的Delete接口。前端调用新增的POST接口确保功能正常。

兼容性分析:删除Delete操作类型的uri后,会同步新增POST类型接口实现相应功能。WebRest接口由前端调用,均位于openUBMC,并不涉及openUBMC和BMC SDK的兼容性影响。

后续web的uri接口变更
(1)新增URI需要从资源维度去描述(参考Redfish),针对资源的描述,不能存在带动作的词汇。
将创建操作视为标准的行为(a);其他操作视为针对该资源的自定义行为(b),需要参考Redfish规范的Action来设计,如:
a. 创建用户:POST:/UI/Rest/AccessMgnt/Accounts
b. 删除用户:POST:/UI/Rest/AccessMgnt/Accounts/Actions/Account.Delete
c. 导入用户公钥:POST:/UI/Rest/AccessMgnt/Accounts/Actions/Account.ImportSSHPublicKey

PS: 行为的请求参数中,需要考虑对多实例和单实例的删除

(2)历史存量URI:
需要补充删除、自定义行为的,按照规则(1)对新增接口进行规范设计,已有接口不再调整
举例:

  1. 老接口的资源描述不规范,携带动作的。补充删除或者其他自定义行为时,直接使用新的标准资源接口。
  2. 老接口的资源描述符合规范(1),不携带动作的。直接在相关URI上补充Action

本次整改webrest的delete接口的变更点

业务 ACTION 原始URI 整改类型 新URI
删除主机截屏 DELETE /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot 整改ACTION
SP系统擦除配置文件 POST /UI/Rest/BMCSettings/SPService/SystemErase 不调整
SP系统擦除配置文件 DELETE /UI/Rest/BMCSettings/SPService/SystemErase 整改URI、ACTION /UI/Rest/BMCSettings/SPService/SystemErase/Actions/SystemErase.Delete
查询工作记录 GET /UI/Rest/Maintenance/WorkRecord 不调整
修改工作记录 PATCH /UI/Rest/Maintenance/WorkRecord 不调整
创建工作记录 POST /UI/Rest/Maintenance/WorkRecord 不调整
删除工作记录 DELETE /UI/Rest/Maintenance/WorkRecord/:workrecord_id 整改URI、ACTION、请求体 /UI/Rest/Maintenance/WorkRecord
查询用户 GET /UI/Rest/AccessMgnt/Accounts 不调整
修改用户 PATCH /UI/Rest/AccessMgnt/Accounts/:accountid 不调整
创建用户 POST /UI/Rest/AccessMgnt/Accounts 不调整
用户管理 DELETE /UI/Rest/AccessMgnt/Accounts/:accountid 整改URI、ACTION、请求体 /UI/Rest/AccessMgnt/Accounts/DeleteAccount
证书管理 DELETE /UI/Rest/AccessMgnt/CertMgnt/DeleteCert 整改ACTION
ssh公钥管理 DELETE /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey 整改ACTION
删除会话 DELETE /UI/Rest/Sessions/:id 整改URI、ACTION、请求体 /UI/Rest/Sessions
删除用户角色 DELETE /UI/Rest/AccessMgnt/RightManagement/:id 整改URI、ACTION、请求体 /UI/Rest/AccessMgnt/RightManagement
下载历史功率数据 POST /UI/Rest/System/Power/History 不调整
清除历史功率数据 DELETE /UI/Rest/System/Power/History 整改URI、ACTION
查询逻辑盘信息 GET /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid 不调整
设置逻辑盘信息 PATCH /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid 不调整
创建逻辑盘 POST /UI/Rest/System/Storage/:storageid/Volumes 不调整
删除逻辑盘 DELETE /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid 整改URI、ACTION、请求体 /UI/Rest/System/Storage/:storageid/Volumes

评审点1:运维Rest接口整改

一、变更"删除主机截屏"的WebRest接口

调整前原有相关接口:
1、触发手动截屏:POST /UI/Rest/Maintenance/SystemDiagnostic/CaptureScreenshot(不调整)
2、删除手动截屏: DELETE /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot(调整操作类型,DELETE → POST)

uri:/UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot(已有)
变化类型:变更操作类型
操作类型:从Delete 变更为 Post
操作权限:DiagnoseMgmt
应用场景:用于删除主机截屏

二、变更"删除SP系统擦除配置文件"功能的WebRest接口

调整前原有相关接口:
1、创建SP系统擦除配置文件:POST /UI/Rest/BMCSettings/SPService/SystemErase(不调整)
2、删除SP系统擦除配置文件: DELETE /UI/Rest/BMCSettings/SPService/SystemErase(1、调整URI:SPService/SystemErase->SPService/SystemErase/Actions/SystemErase.Delete;2、调整操作类型,DELETE → POST)

变更"删除SP系统擦除配置文件"功能的接口

uri:/UI/Rest/BMCSettings/SPService/SystemErase变更为/UI/Rest/BMCSettings/SPService/SystemErase/Actions/SystemErase.Delete
变化类型:1)变更URI;2)变更操作类型;
操作类型:Delete变更为Post
操作权限:BasicSetting
应用场景:用于删除SP系统擦除配置文件。
详细描述

三、变更"删除工作记录"功能的接口

调整前原有相关接口:
1、获取工作记录:GET /UI/Rest/Maintenance/WorkRecord(不调整)
2、添加工作记录:POST /UI/Rest/Maintenance/WorkRecord(不调整)
3、编辑工作记录:PATCH /UI/Rest/Maintenance/WorkRecord(不调整)
4、删除工作记录:DELETE /UI/Rest/Maintenance/WorkRecord/ID(1、调整URI名称,WorkRecord/ID → WorkRecord;2、调整操作类型,DELETE → POST;3、新增请求体属性:RequestMethod、Id)

变更"删除工作记录"功能的接口

uri:/UI/Rest/Maintenance/WorkRecord/:workrecord_id 变更为 /UI/Rest/Maintenance/WorkRecord
变化类型:1)变更接口URI;2)变更操作类型;3)新增请求体属性
操作类型:从Delete变更为POST
应用场景:用于对工作记录进行操作,目前支持创建和删除
详细描述

请求体如下:

属性名称 取值类型 变化类型 是否为必传参数 默认值 取值约束 描述
RequestMethod 字符串 新增属性 “POST” 枚举值:“POST”、“DELETE” post接口调用时的请求方法,用于确认本次调用创建(POST)还是删除(DELETE)工作记录的功能
Id 字符串 新增属性 NA NA 要删除的工作记录Id。
RequestMethod为"DELETE"时必传;
RequestMethod非“DELETE”时传入该参数报PropertyUnknown。
Content 字符串 已有属性 NA NA 要记录的内容。
RequestMethod为"POST"时必传。
RequestMethod非“POST”时传入该参数报PropertyUnknown。

PS:编辑工作记录的请求体中,Id也是字符串类型。

响应体如下:

属性名称 取值类型 描述
TotalNumber 数字 工作记录的数量
List 对象数组 所有工作记录的信息
 Id 字符串 工作记录的Id
 UserName 字符串 最后一次编辑工作记录的用户名称
 IPAddress 字符串 最后一次编辑工作记录的用户ip
 Time 字符串 最后一次编辑工作记录的时间
 Content 字符串 这个工作记录Id对应的内容

评审点2:安全管理接口整改

如下功能的REST接口的DELETE方法需要整改:

(1)删除用户:/UI/Rest/AccessMgnt/Accounts/:accountid删除原uri,将原有方法归并到/UI/Rest/AccessMgnt/AccountsPOST方法下
(2)删除证书:/UI/Rest/AccessMgnt/CertMgnt/DeleteCert变更方法 DELETE->POST)
(3)删除ssh公钥:/UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey变更方法 DELETE->POST)
(4)删除会话:/UI/Rest/Sessions/:id删除原uri,将原有方法新增/UI/Rest/SessionsPOST方法下
(5)删除用户角色:/UI/Rest/AccessMgnt/RightManagement/:id删除原uri,将原有方法归并到/UI/Rest/AccessMgnt/RightManagementPOST方法下

(1)新增用户接口添加属性

变化类型:在原有接口POST下新增属性,并变更原有一部分属性的可选项。

原有删除用户URI/UI/Rest/AccessMgnt/Accounts/:accountid
变更资源URI/UI/Rest/AccessMgnt/Accounts
操作类型:POST(DELETE->POST)

输入参数

属性 数据类型 属性说明 取值范围 POST约束 DELETE约束
RequestMethod string 用于标识创建用户还是删除用户,默认使用POST 枚举类型:“POST”,“DELETE” 可选 可选
ID integer 用户ID 取值范围:[2, 17] 可选 必选
UserName string 用户名称 字符串长度:[1, 16] 必选 不可选
RoleID string 用户角色ID 枚举类型:“NoAccess”,“CommonUser”, “Operator”,“Administrator”,“CustomRole1”,“CustomRole2”,“CustomRole3”,“CustomRole4”,“CustomRole5”,“CustomRole6”,“CustomRole7”,“CustomRole8”,“CustomRole9”,“CustomRole10”,“CustomRole11”,“CustomRole12”,“CustomRole13”,“CustomRole14”,“CustomRole15”,“CustomRole16” 必选 不可选
Password string 用户密码 字符串长度:[1, 20] 必选 不可选
LoginInterface string 用户能够使用的登录接口 枚举类型: “Web”,“SNMP”,“IPMI”,“SSH”,“SFTP”,“Local”,“Redfish” 可选 不可选
LoginRule array 用户登录规则 枚举类型:“Rule1”,“Rule2”, “Rule3” 可选 不可选
ReauthKey string 二次鉴权密码 字符串长度:[1, 128] 必选 必选
FirstLoginPolicy number 首次登录策略 枚举类型:1,2 必选 不可选

ReqBody请求体示例(POST):

{
        "RequestMethod":"POST",(可选)
        "UserName": "test",
        "RoleID":"Administrator",
        "Password":"XXXXXX",
        "ReauthKey":"xxxxx",
        "FirstLoginPolicy":1
}

ReqBody请求体示例(DELETE):

{
        "RequestMethod":"DELETE"
        "ID": 3,
        "ReauthKey":"QWR12taWwMDA"
}

(2)变更删除证书接口方法

变化类型:操作类型变更(DELETE → POST)
资源URI:/UI/Rest/AccessMgnt/CertMgnt/DeleteCert
操作类型:POST
输入参数

属性 数据类型 属性说明 取值范围 约束
CertificateType int 删除证书类型 取值范围:[0, 4] 必选
ID int 删除的证书的ID 取值长度:[0, 32] 必选

ReqBody请求体示例:

{
	"CertificateType":0,
	"ID": 1
}

(3)变更删除ssh公钥接口方法

变化类型:操作类型变更(DELETE → POST)

资源URI:/UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey
操作类型:POST
输入参数

属性 数据类型 属性说明 取值范围 约束
ReauthKey string 二次鉴权密码 字符串长度:[1, 128] 必选

ReqBody请求体示例:

{
	"ReauthKey":"QWR12taWwMDA",
}

(4)新增删除用户会话接口

变化类型:新增接口
原有删除用户URI/UI/Rest/Sessions/:id
变更资源URI/UI/Rest/Sessions
操作类型:POST

输入参数

属性 数据类型 属性说明 取值范围 约束
RequestMethod string 标识用于删除会话ID 枚举类型:“DELETE” 必选
SessionId string 用户会话ID 资源树校验 必选

ReqBody请求体示例:

{
     "RequestMethod": "DELETE",
     "SessionId": "c482ad820d6453424d1af86e",
}

(5)新增用户角色接口添加属性

变化类型:新增接口属性
变更资源URI/UI/Rest/AccessMgnt/RightManagement
原有删除用户角色URI/UI/Rest/AccessMgnt/RightManagement/:id

操作类型:POST

输入参数

属性 数据类型 属性说明 取值范围 约束
RequestMethod string 用于标识创建用户角色还是删除用户角色,默认使用POST 枚举类型:“DELETE”,“POST” 可选
ID integer 用户角色ID 取值范围:[8, 20] 必选
ReauthKey string 二次鉴权密码 字符串长度:[1, 128] 必选

ReqBody请求体示例(POST):

{
      "RequestMethod":"POST",(可选)
      "ID": 10,
      "ReauthKey":"QWR12taWwMDA",
}

ReqBody请求体示例(DELETE):

{
      "RequestMethod": "DELETE"
      "ID": 10,
      "ReauthKey":"QWR12taWwMDA",
}

评审点4:能效管理接口整改

1、如下功能的REST接口的DELETE方法需要整改:

(1)原有历史功率数据Uri:/UI/Rest/System/Power/History(删除DELETE方法,将删除方法归并到POST方法下)

(1)新增下载历史功率接口属性

变化类型:新增接口属性

资源URI:/UI/Rest/System/Power/History
操作类型:POST

输入参数

属性 数据类型 属性说明 取值范围 约束
DataType string 删除数据类型 枚举类型"System",“Fan”,“Cpu”,“Memory” 必选
SystemId int 系统ID 系统ID是否存在 可选
RequestMethod string 用于标识下载历史功率接口或者删除,默认使用POST 枚举类型:“DELETE”,“POST” 必选

ReqBody请求体示例(POST):

{
    "RequestMethod":"POST",(可选)
    "DataType": "System",
    "SystemId": 1
}

ReqBody请求体示例(DELETE):

{
    "RequestMethod": "DELETE"
    "DataType": "System",
    "SystemId": 1
}

评审点4:通用硬件接口整改

相关接口:

(1)查询逻辑盘信息:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Get操作)
(2)设置逻辑盘信息:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Patch操作)
(3)创建逻辑盘:/UI/Rest/System/Storage/:storageid/Volumes(Post操作)
(4)删除逻辑盘:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Delete操作)

1、 删除用于“删除逻辑盘”的WebRest接口Delete操作

资源URI (已有):/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid
变化类型 :删除操作类型
操作类型 :Delete
应用场景 :删除逻辑盘
操作权限 :BasicSetting
输入参数 :无

2、变更用于“创建逻辑盘”的WebRest接口

资源URI(已有):/UI/Rest/System/Storage/:storageid/Volumes
变化类型:新增输入参数
操作类型:Post
应用场景:用于创建和删除逻辑盘(删除功能与原uri /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid下的Delete操作一致,创建功能与原/UI/Rest/System/Storage/:storageid/Volumes下的功能一致)
操作权限:BasicSetting
输入参数

参数变更:

属性 数据类型 属性说明 取值范围 约束
VolumeIds(新增) Array(string) 要删除的逻辑盘Id数组 数组元素(要删除的逻辑盘Id)的取值范围为字符串 当RequestMethod为“POST”时为不可选,当RequestMethod为“DELETE”时为必选
RequestMethod(新增) string 操作类型,当取值为“POST”时,实现创建逻辑盘功能;当取值为“DELETE”时,实现删除逻辑盘功能 枚举值:“POST”、“DELETE”,默认值为“POST”。 可选
Drives(已有) Array(number) 物理盘Id数组 数组元素(物理盘Id)的取值范围为number 当RequestMethod为“POST”时为必选,当RequestMethod为“DELETE”时不可选
VolumeRaidLevel(已有) string RAID级别 枚举值:“RAID0”, “RAID1”,“RAID5”, “RAID6”, “RAID10”,“RAID50”,“RAID60”, “RAID1(ADM)”,“RAID10(ADM)”,“RAID1Triple”,“RAID10Triple” 当RequestMethod为“POST”时为必选,当RequestMethod为“DELETE”时不可选

ReqBody请求体示例:
创建逻辑盘:

{
    "RequestMethod": "POST",
    "Drives": [0, 1],
    "VolumeRaidLevel": "RAID0"
}

删除逻辑盘:

{
    "RequestMethod": "DELETE",
    "VolumeIds":  [“LogicalDrive238”]
}

评审结论

遗留问题

1、需要到TC组织汇报,同步变更的背景和变更方式
结果:
2、需要加门禁/其他方式禁止开发者新增WebRest的delete接口
结果:
3、rackmount仓的Readme需要添加对应的修改(webrest接口不允许添加delete)
结果:
4、是否要改成post类型接口的请求参数中添加操作类型的参数,通过这个参数控制是Post还是Delete,默认为Post。然后删除Delete接口
结果:已闭环,见各个评审点
5、要提前在社区发布变更说明
结果: