添加操作事件故障详情

https://blueprints.launchpad.net/nova/+spec/action-event-fault-details

此蓝图建议将故障详情添加到失败的实例操作事件中。

问题描述

目前,服务器的非管理员所有者看到的实例操作事件详情不包含任何关于导致操作失败的有用信息。例如,如果我们未能冷迁移服务器,通过 openstack server event show <server> <request-id> 显示服务器的事件信息时,记录为

{
   "events": [
     {
       "finish_time": "2019-11-13T16:18:27.000000",
       "start_time": "2019-11-13T16:18:26.000000",
       "event": "cold_migrate",
       "result": "Error"
     },
     {
       "finish_time": "2019-11-13T16:18:27.000000",
       "start_time": "2019-11-13T16:18:26.000000",
       "event": "conductor_migrate_server",
       "result": "Error"
     }
   ]
}

显然,从服务器事件操作的响应中,用户无法获取实际有用的信息。

如果服务器状态不是 ERROR 但某些操作失败,用户也无法获取故障详情,因为服务器故障仅在服务器处于 ERRORDELETED 状态时显示。但是实例操作可以在任何状态的服务器上显示(甚至对于已删除的服务器,自微版本 2.21 起)。

用例

作为非管理员用户,当服务器不处于 ERROR 状态时,我希望了解失败的详细信息。尽管我无法看到确切的 traceback,但至少我可以根据详细信息进行其他尝试。

提议的变更

在新的微版本中,在“显示服务器操作详情 API”中暴露 details 字段

  • GET /servers/{server_id}/os-instance-actions/{request_id}

添加一个新的策略来控制一组实例操作属性的可见性,其默认规则是 'rule:system_reader_api' (旧规则是 'rule:admin_api')。

事件“details”与服务器处于 ERROR 状态时用户看到的 fault.message 相同。对于 NovaExceptions,它将是实际的异常消息,但对于非 NovaExceptions,它只是异常类名(在定义的 exception_to_dict 函数中执行 message = fault.__class__.__name__)。

备选方案

在 NovaException 上添加 user_message 字段,如果存在,则将其传递到一个类似于 details 的新字段中。这可能像记录所有不同的错误类型一样痛苦。

数据模型影响

无。details 列已存在于 instance_actions_events 表中,并且它是一个 TEXT 大小列,因此应该足够大以容纳异常故障消息。

REST API 影响

在新的微版本中,在以下 API 响应中暴露 details 参数

  • GET /servers/{server_id}/os-instance-actions/{request_id}

    {
       "events": [
         {
           "finish_time": "2019-11-13T16:18:27.000000",
           "start_time": "2019-11-13T16:18:26.000000",
           "event": "cold_migrate",
           "result": "Error",
           "details": "No valid host was found."
         },
         {
           "finish_time": "2019-11-13T16:18:27.000000",
           "start_time": "2019-11-13T16:18:26.000000",
           "event": "conductor_migrate_server",
           "result": "Error",
           "details": "No valid host was found."
         }
       ]
    }
    

这仅在检查策略与 'rule: system_reader_api' 匹配后填充 details 属性的值。

在新的微版本中,“details”键始终随每个事件字典返回,但由于旧记录或未失败的事件,其值可能为 null。

安全影响

此更改可能存在安全影响,因为我们可能会将关于部署的敏感信息泄露给非管理员最终用户,但我们已经通过服务器故障这样做,因此这不应“更糟”。请注意关于故障的错误 1851587

添加一个新的策略,以便部署者可以决定是否向最终用户公开这些故障信息。

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

开发人员必须谨慎处理他们在 NovaExceptions 中放置的信息,这些信息可能会泄露敏感信息给非管理员最终用户。

升级影响

无。数据库中的新列已存在。

实现

负责人

主要负责人

brinzhang

功能联络人

功能联络人

brinzhang

工作项

  • details 添加到 InstanceActionEvent 对象中,并填充它,填充部分需要一些工作。

  • 修改 API,在暴露实例操作事件的 GET 响应中暴露 details 字段。

  • 添加相关测试

  • 新微版本的文档。

依赖项

测试

  • 添加与负面场景相关的单元测试。

  • 添加相关的功能测试 (API 示例)。

此更改不需要 Tempest 测试。

文档影响

更新 API 参考以支持新的微版本。

参考资料

[1] “关于在实例操作事件中向非管理员暴露异常类型的思考”

在 ML 中 http://lists.openstack.org/pipermail/openstack-discuss/2019-November/010775.html

历史

修订版

发布名称

描述

Ussuri

引入