数据存储注册 API

蓝图

https://blueprints.launchpad.net/trove/+spec/datastore-registration-api

该提案旨在引入一个新的管理 API,以便在现有的 Trove 部署上实现数据存储的注册。

问题描述

目前,在现有部署上添加/注册数据存储/数据存储版本,唯一的方法是使用一系列 trove-manage (datastore_update, datastore_version_update) 命令来添加数据存储,然后使用其镜像添加数据存储版本。

这个过程的另一个问题是,需要从可以执行 trove-manage 的 trove-api 服务器访问权限,或者需要直接访问数据库,如果想要绕过 trove-manage 并使用 insert/update 命令直接添加到表中,这两种方法都需要放宽 trove-api/数据库服务器的安全性,以便操作员/部署者直接访问。

注册数据存储的另一个问题是,我们需要使用多个命令来注册一个带有 image-id 的新数据存储。

用例

  • 作为部署者,我希望能够通过 Trove 管理 API 添加新的数据存储,而无需登录到 Trove 控制平面并手动运行 trove-manage 命令。

提议的变更

以下功能将作为变更的一部分添加:
  • 添加/注册新的数据存储版本。

  • 获取数据存储版本列表。

  • 获取现有数据存储版本的相关信息。

  • 更新现有数据存储版本的镜像/管理器/软件包/活动/默认设置。

  • 删除现有数据存储版本。

在注册数据存储版本时,如果请求的数据存储名称不存在,我们将创建一个具有请求的数据存储名称的数据存储。

这些功能仅对通过管理租户访问 API 的管理员用户可用。

配置

没有配置变更。

数据库

没有数据库变更。

公共 API

没有公共 API 变更。

公共 API 安全

Python API

CLI (python-troveclient)

管理 API

新 API 的请求/响应如下。这些 API 只能通过管理租户调用。

添加/注册数据存储版本

请求

POST /v1.0/<tenant_id>/mgmt/datastore-versions
{
  "version": {
    "datastore": "mysql",
    "name": "5.6",
    "manager": "mysql",
    "image": "154b350d-4d86-4214-9067-9c54b230c0da",
    "packages": ["mysql-server-5.6"],
    "active": true,
    "default": true,
    }
}

响应

{
}

HTTP 状态码

202 - Accepted.
400 - Bad Request. Datastore Version Already Exists.
404 - Not Found. Image not found.

获取数据存储版本

请求

GET /v1.0/<tenant_id>/mgmt/datastore-versions

响应

{
    "versions": [
      {
        "datastore_id": "b80c2b43-cd87-4d5d-9f32-a4996bd57cb1",
        "datastore_name": "mysql",
        "id": "b8a23fa1-1faf-441a-a6b7-83a19c30f347",
        "name": "5.6",
        "manager": "mysql",
        "image": "154b350d-4d86-4214-9067-9c54b230c0da",
        "packages": ["mysql-server-5.6"],
        "active": true,
        "default": true,
      },
      {
        "datastore_id": "127bc577-8054-4b32-9ed3-2d6b01773810",
        "datastore_name": "vertica",
        "id": "21c8805a-a800-4bca-a192-3a5a2519044d",
        "name": "7.1",
        "manager": "vertica",
        "image": "6230baf1-dffe-40fa-a1fb-47d9ff346503",
        "packages": ["vertica-7.1"],
        "active": true,
        "default": true,
      }]
}

HTTP 状态码

200 - OK.

获取数据存储版本信息

请求

GET /v1.0/<tenant_id>/mgmt/datastore-versions/<datastore_version_id>

示例

GET /v1.0/<tenant_id>/mgmt/datastore-versions/b8a23fa1-1faf-441a-a6b7-83a19c30f347

响应

{
    "version":
      {
        "datastore_id": "b80c2b43-cd87-4d5d-9f32-a4996bd57cb1",
        "datastore_name": "mysql",
        "id": "b8a23fa1-1faf-441a-a6b7-83a19c30f347",
        "name": "5.6",
        "manager": "mysql",
        "image": "154b350d-4d86-4214-9067-9c54b230c0da",
        "packages": ["mysql-server-5.6"],
        "active": true,
        "default": true,
      }
}

HTTP 状态码

200 - OK.
404 - Not Found. Datastore Version not found.

更新数据存储版本的镜像/管理器/软件包/活动/默认设置

请求

PATCH /v1.0/<tenant_id>/mgmt/datastore-versions/<datastore_version_id>

Payload for this request can be those attributes which one wants to update.

示例

PATCH /v1.0/<tenant_id>/mgmt/datastore-versions/b8a23fa1-1faf-441a-a6b7-83a19c30f347
{
    "image": "e33f8e2f-1148-461c-a7ea-f8228e7c5f4a",
}

响应

{
}

HTTP 状态码

202 - Accepted.
404 - Not Found. Datastore Version not found.
404 - Not Found. Image not found.

删除现有数据存储版本

请求

DELETE /v1.0/<tenant_id>/mgmt/datastore-versions/<datastore_versionid>

示例

DELETE /v1.0/<tenant_id>/mgmt/datastore-versions/b8a23fa1-1faf-441a-a6b7-83a19c30f347

响应

{
}

HTTP 代码

202 - Accepted.
404 - Not Found. Datastore Version not found.
409 - Conflict. Instance(s) exists for the datastore version.

内部 API

没有内部 API 更改。

Guest Agent

没有 Guest Agent 变更。

备选方案

当前的替代方案是使用 trove-manage 或直接使用数据库,但这两种方法都需要放宽 api/db 服务器的访问策略,这本身就存在安全隐患。

实现

负责人

Sushil Kumar (skm.net@gmail.com)

里程碑

Liberty-2

工作项

  • 实现 API 路由

  • 实现管理 API

  • 实现单元测试

升级影响

无。

依赖项

目前正在进行一项工作,将 flavor 与数据存储版本关联起来(https://review.openstack.org/#/c/109824)。

需要注意的是,一旦这些 flavor 映射到位,在删除数据存储版本时将有两种可用选项:

  • 如果数据存储版本有任何 flavor 映射,则不要删除该版本。

  • 连同数据存储版本一起删除 flavor 映射。

测试

将添加单元测试以覆盖非平凡的代码路径。

文档影响

管理 API 的文档将使用新的 API 进行更新。

参考资料

无。