支持 os::mistral::workflow 处理信号中的简单 json 格式¶
https://blueprints.launchpad.net/heat/+spec/mistral-wf-signal-json-format
目前,当资源 os::mistral::workflow 接收到信号时(无论是使用 alarm-url 还是 resource-signal API 调用),它都期望特定的 json 格式。由于外部系统并不总是允许用户更改其发送的请求体,因此工作流无法使用这些系统发送的信息。
问题描述¶
当向 OS::Mistral::Workflow 资源发送信号时,无论是来自外部系统,还是来自 ceilometer,信号请求可能具有预定义的请求体,该请求体与工作流资源期望的 json 格式不兼容。os::mistral::workflow 期望请求体采用以下格式
{
"input":{
...
},
"params":{
...
}
}
然而,例如 ceilometer,会以这种格式发送请求体
{
"severity": "low",
"alarm_name": "my-alarm",
"current": "insufficient data",
"alarm_id": "895fe8c8-3a6e-48bf-b557-eede3e7f4bbd",
"reason": "1 datapoints are unknown",
"reason_data": {
"count": 1,
"most_recent": null,
"type": "threshold",
"disposition": "unknown"
},
"previous": "ok"
}
这导致工作流无法使用请求体中的信息。
提议的变更¶
建议的更改是启用工作流资源将请求体解析为简单的 json 映射,其中每个键都将被视为输入值。
此更改不会破坏向后兼容性,因为用户可以在堆栈模板中选择如何解析请求体。
提议向 os::mistral::workflow 添加一个新的属性“use_request_body_as_input”,当此属性在模板中定义且为 True 时,信号请求体将被解析为简单的 json 映射。如果该属性未定义或定义为 False,则请求体将像以前一样解析(期望键“input”和“params”)。
由于使用此信号的外部系统发送预定义的请求,我们可以假设它们不知道它们正在发出信号给工作流,因此,它们不需要传递 mistral 工作流特有的“params”。可以在堆栈模板中定义 params,但在此情况下,将无法使用请求覆盖它们。
例如,为了使工作流资源使用来自 ceilometer 警报的信息,其在堆栈模板中的定义如下所示
my_workflow:
type: OS::Mistral::Workflow
properties:
use_request_body_as_input: True
input:
current: !!null
alarm_id: !!null
reason: !!null
previous: !!null
severity: !!null
alarm_name: !!null
reason_data: !!null
备选方案¶
无
实现¶
当资源正在接收信号时,它将检查“use_request_body_as_input”属性是否存在,并根据其定义解析请求体,以找到适当的输入值。
值得注意的是,如果工作流资源是使用属性“use_request_body_as_input”设置为 True 创建的,则无法将工作流“params”传递到请求。
负责人¶
- 主要负责人
noa-koffman
里程碑¶
- 完成目标里程碑
mitaka-1
工作项¶
更改工作流资源,根据资源定义以适当的方式解析请求。
添加测试以查看旧功能和新功能是否正常工作。
依赖项¶
无