由 Mistral Workflows 管理的自定义资源类型

https://blueprints.launchpad.net/heat/+spec/mistral-new-resource-type-workflow-execution

允许用户通过将他们的操作实现为 Mistral 工作流来定义自定义资源类型。

问题描述

Heat 资源类型由 Python 插件定义。如果用户想要管理现有插件无法处理的资源,例如 OpenStack 外部的资源,他们当前需要在某个服务器上部署软件来管理该资源。

如果我们提供一个插件,其中操作由用户定义的 Mistral 工作流处理,那么我们可以允许我们的用户在 Heat 的正常操作中管理自定义资源。

提议的变更

模板中将这样定义提出的资源类型

custom:
  type: OS::Mistral::ExternalResource
  properties:
    actions:
      CREATE:
        workflow: {get_resource: create_workflow}
        params:
          target: create_my_custom_thing
      UPDATE:
        workflow: {get_resource: update_workflow}
      DELETE:
        workflow: {get_resource: delete_workflow}
    input:
      foo1: 123
      foo2: 456
    replace_on_change_inputs:
      - foo2
    always_update: true

属性

  • actions - 操作到工作流的映射。允许的操作是 CREATE、UPDATE、DELETE、SUSPEND 和 RESUME。所有操作都是可选的。

  • workflow - 工作流名称或 ID

  • params - 要传递给 Mistral 工作流执行的参数。参数取决于工作流类型。

  • input - 要作为输入传递给工作流的值

  • replace_on_change_inputs - 一个输入名称列表,当输入值发生变化时,应该替换资源而不是就地更新。在这种情况下,我们将对替换资源运行 CREATE 工作流,然后对现有资源运行 DELETE 工作流,而不是 UPDATE 工作流。

  • always_update - 如果为 true,则在更新时将始终运行 UPDATE 操作,即使输入没有变化。默认值为 false。

属性

  • output - 工作流执行输出

对于每个 Heat 操作,资源插件将启动指定工作流的执行(如果有),并等待其完成。输出将被收集并存储在 CREATE 和 UPDATE 操作中。如果执行失败,资源操作也将失败。

如果输出包含一个名为 resource_id 的键,Heat 将将其视为资源的物理 ID。这是 get_resource 固有函数返回的值。

对于 CREATE 以外的操作,当前输出将以 heat_extresource_data 键传递到 Mistral 环境中。如果用户在 params 中已经指定了环境,那么此键将被合并。每次工作流完成时,其输出都将合并到“当前”输出中,这样就不需要每个操作都重新输出所有先前输出以避免丢失数据。

备选方案

很难知道一个好的名称是什么。首先,尚不清楚此资源是否属于 OS::Mistral::OS::Heat:: 命名空间。不错的名称可能包括“ExternalResource”、“CustomResource”、“WorkflowResource”。

SoftwareComponent 资源允许为每个配置指定多个操作。这里的等效项可能如下所示

properties:
  workflows:
    - actions: [CREATE]
      workflow: {get_resource: create_workflow}
    - actions: [CREATE, UPDATE]
      workflow: {get_resource: update_workflow}
    - actions: [DELETE]
      workflow: {get_resource: delete_workflow}

然而,当每个操作有多个工作流时,如何正确处理输出尚不清楚。获取第一个操作的输出?最后一个?某种组合?鉴于已经很容易从一个工作流调用另一个工作流,似乎最好将此交到用户手中,并要求他们为每个操作指定一个工作流。Mistral 专为工作流调用彼此而设计。

CloudFormation 中的等效项,AWS::CloudFormation::CustomResource 使用 Lambda 来管理外部资源,允许 Lambda 函数确定 何时替换资源。如果它返回新的资源 ID,则认为资源已被替换,然后删除旧资源。在 Heat 中复制这一点将很困难 - 虽然资源可以在更新期间的任何时间引发 UpdateReplace,但没有机制可以保留更新工作流执行返回的数据并在资源中存储它。(此外,如果替换资源不运行 CREATE 工作流,那将很奇怪。)因此,我们选择强制用户提前选择何时根据输入参数的变化来替换资源,即使这灵活性明显较低(尽管 Lambda 函数比 Mistral 工作流更容易编写,因此灵活性将伴随着巨大的复杂性)。

将来,我们可以添加一个单独的 should-update-replace 工作流步骤,以允许用户运行一个工作流,该工作流返回 True 以替换或 False 以就地更新。

实现

负责人

主要负责人

gfidente therve

里程碑

完成目标里程碑

pike-2

工作项

  • 实现新的资源类型

依赖项

无。