重构执行 Mistral 操作

Launchpad 蓝图: https://blueprints.launchpad.net/vitrage/+spec/refactor-execute-mistral-definition

应更改执行 Mistral 操作的定义,以更好地支持 Vitrage 和 Mistral 的集成。

问题描述

使用当前的执行 Mistral 操作定义,可以将字符串值传递给 Mistral 工作流,但无法传递动态属性,例如模板条件中匹配的实例的 ID 或 IP 地址。我们应该增强模板语言,以支持将动态属性传递给 Mistral。

另一个问题是操作定义的结构应该更改。在当前结构中,工作流的可选输入参数与操作定义中必不可少的 ‘workflow’ 属性位于同一级别

- action:
    action_type: execute_mistral
    properties:
      workflow: evacuate_host
      timeout: 10
      force: false

相反,我们应该将所有可选参数(超时和强制)收集到 ‘input’ 部分下。

提议的变更

更改的第一部分是创建一个新的 ‘input’ 部分,所有工作流的输入参数都应放置在该部分下。应该向 Vitrage 模板引入一种新的版本控制机制,以允许验证和加载旧格式和新格式。在第一阶段,两种格式都将受支持,但在一个或两个版本中,我们应该弃用旧格式。

第二部分是定义一种描述应将特定实体的哪个属性传递给工作流的方法。建议的解决方案是使用类似于 HOT 模板的语法。

我们将引入一个 get_attr() 函数,其参数如下

  • resource template_id:模板中资源的 ID。请注意,资源必须是条件的一部分。

  • attribute:要使用的属性的名称。如果条件满足,则将从图中的资源顶点获取该属性。

- scenario:
    condition: host_down_alarm_on_host
    actions:
      - action:
          action_type: execute_mistral
          properties:
            workflow: evacuate_host
            input:
              host_id: get_attr(host, "id")
              host_ip_addr: get_attr(host, "ip_address")
              timeout: 10
              force: false

备选方案

另一种选择是用更短的语法替换 get_attr。在这种情况下,我们将通过实体模板 ID 和属性名称来引用实体属性。例如,host.ip_address 将标记实例的 ip_address 属性。

上面的示例将如下所示

- action:
    action_type: execute_mistral
    properties:
      workflow: evacuate_host
      input:
        host_id: host.id
        host_ip_addr: host.ip_address
        timeout: 10
        force: false

这看起来更好,但有两个主要缺点

  • 仅通过查看模板,就无法清楚地知道这是一个对属性的引用。如果用户想传递一个字符串,该字符串为“host.id”呢?

  • 它不够通用。另一方面,如果我们添加 get_attr 作为函数语法,我们将能够以类似的语法添加其他函数。

数据模型影响

REST API 影响

版本影响

建议的更改与 Pike 不兼容。Vitrage 模板应增强以支持版本控制,并且现在应支持旧版本和新版本。

其他最终用户影响

部署者影响

开发者影响

Horizon 影响

实现

负责人

主要负责人

ifat-afek

工作项

  • 支持 Vitrage 模板中的版本控制。允许针对特定操作的按版本验证器和加载器。

  • 将可选输入参数移动到 ‘input’ 部分下

  • 支持 get_attr

依赖项

测试

实现将由单元测试和 tempest 测试覆盖。

文档影响

应记录操作定义中的更改

参考资料

Vitrage 模板格式