添加动作执行接口

https://blueprints.launchpad.net/congress/+spec/action-execution-interface

为能够执行动作的服务添加类似于数据源驱动程序的类比。

问题描述

数据源驱动程序从云服务中提取信息,允许 Congress 读取云的当前状态(例如,所有服务器的列表)。一些云服务还具有改变云状态的能力(例如,创建一个新的服务器)。目前,策略引擎无法请求对云状态进行更改。Congress 需要一个云服务的接口,使其能够执行改变云状态的动作。

提议的变更

此更改将创建一个新的(mixin)类,名为 ExecutionDriver,该类具有一个主要函数:execute(name, positional-args, named-args)。该接口接收动作的名称、其位置参数列表以及其命名参数字典,并在云服务上执行该动作。

此更改还将重载

policy/runtime.py:Runtime.execute()

policy/dseruntime.py:DseRuntime.execute()

中的功能,以便策略引擎对 ‘execute’ 的调用将向 DSE 上的适当服务发送 DSE 消息,以执行 ExecutionDriver:execute() 函数。这将是从策略引擎到 DSE 上适当服务的单播消息。该服务将包含在动作名称中,例如 ‘nova:disconnectNetwork’ 是发送到 ‘nova’ 服务的动作。

作为起点,此更改将在 datasources/nova_driver.py(或主要委派人选择的另一个服务)中包含 ExecutionDriver mixin 的实现。

备选方案

另一种选择是使 ExecutionDriver 类不作为 mixin,而是作为独立的类,从而为每个云服务提供两个单独的文件,例如 nova_datasource_driver.py 和 nova_executor_driver.py。

将执行服务的能力视为一个接口是有益的,因为实际上服务通常具有一些允许其读取云状态的功能,以及其他允许其改变云状态的功能。将它们视为不同的文件会使它们看起来像是独立的服務。

设计的另一个替代选择是使用发布/订阅来在策略引擎和 ExecutionDriver 实例之间通信动作执行。发布/订阅的缺点是,它可能导致多个服务订阅相同的动作(可能是不小心),并且单个 ‘execute’ 命令产生多个 API 调用来修改云的状态。单播选择消除了这个问题(尽管承认消除了存在合法需要通知动作的 2 个不同服务的用例的可能性)。

策略

策略操作

这是走向主动强制执行的一步。

数据源

最终所有数据源都将希望实现 ExecutionDriver 接口。

数据模型影响

无。

REST API 影响

我们将希望通过 API 暴露 policy/dse_runtime.py:DseRuntime.execute() 命令。

问题:我们是否应该将 API 中的“数据源”重命名为“云服务”?

如果是这样,那么我们将会有…

在指定服务上执行一个动作。

POST v1/cloud-services/nova?action=execute -d {'name': 'disconnectNetwork',
                                               'args': ['vm123', 'net456'],
                                               'options': {}}

像给定的策略所指示的那样执行一个动作。

POST v1/policies/alice?action=execute -d {'name': 'nova:disconnectNetwork',
                                          'args': ['vm123', 'net456'],
                                          'options': {}}

这些 API 调用将具有空响应(例如 HTTP 代码 204),或者如果在实际进行 API 调用之前引发了错误,则具有适当的错误响应。这些 API 调用将在我们正在执行的调用返回之前返回。

安全影响

此更改赋予了任何有权编写策略的人使用 Congress 授予的相同权限执行 API 调用的能力。由于我们通常以管理权限运行 Congress,因此我们需要正确地保护 Congress 身份验证。但这已经完成,因为我们使用标准的 Keystone 身份验证系统。

通知影响

其他最终用户影响

如果我们将 execute() 功能通过 API 暴露出去,python-congressclient 将需要一个新的端点。

性能影响

由于 DatasourceDriver 和 ExecutionDriver 通常会作为同一个 DSE 实例的一部分实现,因此编写不当的 ExecutionDriver 可能会损害该驱动程序通过 DatasourceDriver 接口正确读取信息的能力。这两个功能在单个线程中运行,即,一个运行或另一个运行。这实际上是有益的,因为我们不希望驱动程序在更改其数据的同时拉取新数据。

其他部署者影响

开发者影响

实现

负责人

主要负责人

<launchpad-id 或 None>

其他贡献者

<launchpad-id 或 None>

工作项

  • 将 congress/datasources 文件夹重命名为 congress/cloudservices,并相应地更改 etc/congress/datasources.conf.sample。可能还有其他地方显式引用 ‘datasources’。

  • 添加 congress/cloudservices/execution_driver.py 以包含 mixin 类 ExecutionDriver

  • 实现 policy/dseruntime.py:DseRuntime.execute() 以向适当的服务发送单播消息,或者如果该服务不存在于总线上则引发错误。

  • 为现有服务实现 ExecutionDriver,例如 Nova。

依赖项

测试

  • 单元测试,以确保对 DseRuntime.execute() 的调用会调用适当的 ExecutionDriver.execute()。

  • Tempest 测试,调用 execute() 并确保实际发生正确的更改。

文档影响

需要向文档中添加动作和动作格式的描述,以及 execute() 的文档。

参考资料