添加动作执行接口¶
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() 的文档。
参考资料¶
无