Mgmt Driver 错误信息改进

https://blueprints.launchpad.net/tacker/+spec/improving-mgmt-driver-log

本规范提出以下两个改进:

  • 定义 Tacker 和 Mgmt Driver 之间的错误处理接口

  • 改进 Ansible playbook 失败时引发的异常信息

问题描述

Tacker 和 Mgmt Driver 之间缺乏清晰的接口

当 Mgmt Driver 中发生错误时,Tacker-conductor 接收 Mgmt Driver 引发的任何类型的异常。然后,Tacker-conductor 将其转换为 ETSI GS NFV-SOL 013 v2.6.1 [1] 中定义的 ProblemDetails 类型,并将其存储在 ETSI GS NFV-SOL 003 v2.6.1 [2] 中定义的 VnfLcmOpOcc 的错误字段中。

这样,Tacker 和 Mgmt Driver 之间没有错误消息处理的规则,如何定义 Mgmt Driver 引发的错误类型取决于用户的实现。

Mgmt Driver 是 Tacker 中的用户可定制的插件。因此,用户之间 Tacker 和 Mgmt Driver 之间存在清晰的错误处理接口是理想的。

Ansible Mgmt Driver 错误消息缺乏信息

Tacker 源代码包含 Ansible Mgmt Driver 示例 [3]

在使用此示例时,Ansible playbook 失败时生成的异常中包含的信息只是“命令的返回码不是 0”,用户只能通过 CLI “vnflcm op show” 检查此消息。

tacker-conductor.log 包含有关错误的更多信息。但通常,只有管理员才有权访问日志,因此用户无法调试错误。

因此,有必要改进用户通过 CLI 命令看到的错误信息。

提议的变更

本规范提出两个改进。

1) 定义 Tacker 和 Mgmt Driver 之间的错误处理接口

为 Tacker-conductor 和 Mgmt Driver 之间的错误处理定义以下规则。

  • Mgmt Driver 引发的异常必须符合 ETSI GS NFV-SOL 013 规范 [1] 中定义的 ProblemDetails 格式。

  • Tacker-conductor 必须能够捕获异常的类型。

注意

为了保持向后兼容性,也可以接收任何类型的异常。在这种情况下,异常将被转换为字符串并存储在 VnfLcmOpOccs 的错误字段中,如当前实现。

ProblemDetails 的定义如下:

表 6.3-1:ProblemDetails 数据类型的定义 [1]

属性名称

数据类型

基数

描述

type

Uri

0..1

根据 IETF RFC 3986 [4] 的 URI 引用,用于标识问题类型。鼓励 URI 在取消引用时为问题提供人类可读的文档(例如,使用 HTML)。当未提供此成员时,其值假定为‘about:blank’。

title

字符串

0..1

问题类型的简短、人类可读的摘要。它不应从问题的出现到出现发生变化,除非是为了本地化。如果提供了 type 且不为‘about:blank’,则也应提供此属性。

status

Integer

1

此问题发生的 HTTP 状态码。

detail

字符串

1

此问题发生的特定的人类可读的解释。

实例

Uri

0..1

一个 URI 引用,用于标识问题的特定发生。如果取消引用,它可能会产生更多信息

(附加属性)

未指定。

0..N

由规范或实现定义的任意数量的附加属性。

为了实现此规则,Tacker 侧应具有符合 ProblemDetails 的基本异常类。并且 Mgmt Driver 的开发人员使用它来使他们的 Mgmt Driver 中的异常与 ProblemDetails 兼容。

基本类定义在 tacker/common/exceptions.py 中。格式如下:

class ManagementDriverException(TackerException):
    def __init__(self, type=None, title=None, status, detail, instance=None)
        self.type = type
        self.title = title
        self.status = status
        self.detail = detail
        self.instance = instance

Mgmt Driver 中的异常必须继承基本类以符合 ProblemDetails,如下所示:

class CommandExecutionError(ManagementDriverError):

2) 改进 Ansible playbook 失败时引发的异常信息

在 Ansible Mgmt Driver 示例中,Ansible playbook 失败时会引发 CommandExecutionError。无论哪个任务失败,此错误始终输出相同消息。

在此规范中,对其进行了修改以包含以下 3 点:

  • 要配置的 VDU 名称

  • 失败的任务名称

  • 与失败的任务相关的 ansible-playbook 命令的提取的 stdout 消息

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Masaki Oyama <ma-ooyama@kddi.com>

其他贡献者

Yukihiro Kinjo <yu-kinjou@kddi.com>

Xu Hongjin <ho-xu@kddi.com>

Hitomi Koba <hi-koba@kddi.com>

工作项

  • 实现 Tacker 和 Mgmt Driver 之间的错误处理接口

  • 改进 Ansible playbook 失败时引发的异常信息

  • 添加接口的单元测试

依赖项

测试

文档影响

将添加有关 Tacker 和 Mgmt Driver 之间错误处理接口的文档。

参考资料