使 os-instance-actions 读取已删除的实例

https://blueprints.launchpad.net/nova/+spec/os-instance-actions-read-deleted-instances

修改 os-instance-actions API 以读取已删除的实例,以便所有者可以查看对其已删除实例执行的操作。

问题描述

目前 os-instance-actions API 无法读取已删除的实例 [1]

此外,实例删除时不会软删除 instance_actions,因此我们可以直接从数据库中读取它们,而无需 `read_deleted='yes'` 标志。

实例操作的目的是审计,并且在实例删除后的调查中,instance_actions 将被用于此目的,但由于 API 的限制,无法使用已删除的实例从 API 中获取这些信息。

用例

  1. 多个用户在同一个项目/租户中。

  2. 用户 A 删除了一个共享实例。

  3. 用户 B 想知道发生了什么(或谁删除了它)。

由于用户 B 与用户 A 位于同一个项目中,因此用户 B 应该能够查找该实例的操作。

提议的变更

为 os-instance-actions API 添加一个微版本更改,以便在通过 uuid 查找实例时,修改上下文并设置 `read_deleted='yes'` 属性。

备选方案

  • 我们可以假设操作员正在监听 nova 通知并将这些通知存储起来以供以后查找,以确定谁删除了实例。这是一个不太好的假设,因为它依赖于在 nova 外部设置一个外部监控系统,而该系统是可选的。

  • 操作员可以直接查询数据库以获取已删除实例的 instance actions,但他们必须了解 nova 数据模型。而且只有操作员才能这样做,这不允许租户用户自行进行此查找(因此他们必须向操作员提交支持工单以进行查找)。

数据模型影响

无。

REST API 影响

受影响的 API:os-instance-actions

受影响的方法:GET

os-instance-actions API 只有两个 GET 请求

  1. index:按实例 uuid 列出实例操作

  2. show:按实例 uuid 和请求 ID 显示实例操作的详细信息

    包括,如果授权,相关的实例操作事件。

API 中的请求和响应值不会更改。预期的响应代码不会更改 - 如果未找到实例或实例操作,仍然会返回 404。

唯一的更改是,在查找实例时,我们将在上下文中设置 `read_deleted='yes'` 标志。这将基于请求中的微版本在一个条件块中完成。

安全影响

无。

通知影响

无。

其他最终用户影响

由于该更改包含在服务器端 API 代码中,因此我们可以自动更新 python-novaclient 中的最大支持 API 版本,客户端无需进行任何操作,只需选择加入微版本即可。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

Matt Riedemann <mriedem@us.ibm.com>

其他贡献者

工作项

  • 如果请求中的微版本满足所需的最低版本,则在从数据库读取实例的 uuid 时,临时修改上下文。例如

    with utils.temporary_mutation(context, read_deleted='yes'):
        instance = common.get_instance(self.compute_api, context, server_id)
    

依赖项

无。

测试

  1. 将更新单元测试。

  2. 将为微版本更改提供功能测试(API 示例测试)。场景基本上是

    • 删除一个实例,并尝试获取其实例操作,其中请求的微版本不满足最低要求,并断言未返回任何内容。

    • 删除一个实例,并尝试获取其实例操作,其中请求的微版本满足最低要求,并断言返回了相关的实例操作。

文档影响

参考资料

历史

修订版

发布名称

描述

Mitaka

引入