添加 v2 API 端点以推送 DataFrame 对象

https://storyboard.openstack.org/#!/story/2005890

CloudKitty 需要在其 v2 API 中添加一个端点来推送 DataFrame 对象。本规范旨在定义需要做什么以及原因。本文档中的所有内容均可讨论,同样适用于相关的 storyboard 和 gerrit。

问题描述

目前 CloudKitty 的状态是,将 DataFrame 导入 CloudKitty 存储的唯一方法是加载存储驱动程序并调用 push 方法,但无法通过 CloudKitty API 实现。

这种不便妨碍了 CloudKitty 拥有外部处理器能够轻松地将其数据推送到其存储中。例如,CloudKitty 无法预置 DataFrame fixtures,因此无法使用 OpenStack Tempest 进行功能测试。

需要一个新的管理 API 端点来实现这一点。

Tempest 测试也将能够实现更高效的工作流程,以验证即将发布的功能,从而从长远来看提高其整体质量和稳定性。更广泛地说,实现此功能也将为任何人提供扩展其 CloudKitty 使用的更方便和灵活的方式。

提议的变更

将向管理员用户提供一个可在 POST /v2/dataframes 上使用的新的端点。这将允许最终用户以 JSON 对象的形式推送 DataFrames。

备选方案

我们可以保留旧方法,但外部处理器需要用 Python 编写才能加载存储驱动程序模块,并且需要向其公开存储后端凭据。

或者,可以通过更 hackish 的方式配置 CloudKitty,例如直接操作存储后端和数据库元数据,但这是一种繁琐且容易出错的过程,应绝对避免。

数据模型影响

无。

REST API 影响

这将添加一个位于 /v2/dataframes 的端点,并支持 POST HTTP 方法。

该端点将支持以下 body 参数

  • dataframes:(必需) 描述 DataFrame 对象的一个 json 数组(有关详细信息,请参见下文)。

在请求的主体中,可以按如下方式指定 DataFrame json 对象集合

{
  "dataframes": [
    # first DataFrame
    {
      "period": {
        "begin": "20190723T122810Z",  # valid ISO 8601 datetime format
        "end": "20190723T132810Z"     # valid ISO 8601 datetime format
      },
      "usage": {
        "metric_one": [  # list of DataPoint json objects
          {
            "vol": {
              "unit": "GiB",
              "qty": 1.2
            },
            "rating": {
              "price": 0.04
            },
            "groupby": {
              "group_one": "one",
              "group_two": "two"
            },
            "metadata": {
              "attr_one": "one",
              "attr_two": "two"
            }
          }
          # { second DataPoint for metric_one here }
        ],
        "metric_two": []
      }
    }
    # { second DataFrame here }
  ]
}

对于此端点的 POST 请求的预期 HTTP 成功响应代码是 204 No Content。做出此决定是为了减少此类操作的网络带宽消耗。用户可以通过将在未来提供的 GET /v2/dataframes 端点来咨询 DataFrames。

对于此端点的 POST 请求的预期 HTTP 错误响应代码是

  • 400 错误请求:请求格式错误。

  • 401 Unauthorized:用户未经过身份验证。

  • 403 Forbidden:用户无权推送 DataFrame 对象。

此端点仅对管理员用户授权。

安全影响

任何访问此端点的用户都能够更改目标平台上的数据,这是一个具有严重副作用的操作。因此,应谨慎或根本不向非管理员用户授予对此端点的访问权限。

通知影响

无。

其他最终用户影响

客户端也将更新,包括一个函数和一个 CLI 命令,允许推送 DataFrame 对象。

性能影响

无。

其他部署者影响

现在将任何类型的 DataFrame 对象导入 CloudKitty 都会变得容易。如果需要,这将方便配置 CloudKitty。

开发人员影响

导入 DataFrame 对象将允许将 fixtures 推送到 CloudKitty 存储中,从而将场景添加到 Tempest 插件中。这将方便后续编写集成测试。

实现

负责人

主要负责人

<jferrieu>

其他贡献者

<peschk_l>

工作项

  • 使用单元测试实现 API 端点。

  • 添加 tempest 测试。

  • 在客户端中支持此端点。

依赖项

此端点依赖于 DataFrame 和 DataPoint 对象的规范

测试

将添加此端点的单元测试和 Tempest 测试。

文档影响

该端点将被添加到 API 参考中。

参考资料

规范:添加 v2 API 端点以推送 dataframe 对象

https://review.opendev.org/#/c/668669/