支持 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

工作项

  1. 更改工作流资源,根据资源定义以适当的方式解析请求。

  2. 添加测试以查看旧功能和新功能是否正常工作。

依赖项