特定数据存储的 API 控制器

改进用户和数据库 API 扩展,以处理特定数据存储的属性,并使其能够与集群一起工作。

Launchpad 蓝图: https://blueprints.launchpad.net/trove/+spec/datastore-specific-api-extensions

另请参阅 1

问题描述

目前,用户和数据库命令通过 MySQL 特定的 API 扩展进行路由。这导致输入验证出现了一些问题,这些问题是 MySQL 特有的,并且不适用于其他数据存储。它还强制将 MySQL 特定的属性应用于模型和视图,而这些属性在非 MySQL 类数据存储上没有(或具有不同的)含义。

另一个长期存在的问题是,上述 API 不适用于集群实例。

提议的变更

本文档建议引入通用的 API 控制器。

任何特定数据存储的解析、处理和验证都将在派生类中提供。Trove 将根据 API 调用的目标数据存储动态加载适当的派生控制器。

目标是为 Trove 用户提供一致的体验。基本控制器实现将提供执行流程并处理通用的 Trove 验证(例如,检查是否存在、重复项)和通知。

派生类将提供特定数据存储的解析和模型验证(例如,用户名验证、从有效负载中解析特定数据存储的属性)。特定数据存储的视图会将模型属性映射到输出有效负载上。

默认控制器还将包括集群接口,默认情况下,该接口会将所有请求路由到集群的一个(控制器)实例,将其余的保留在集群本身。这种策略对于许多(如果不是全部)当前存在的数据存储来说都是成功的。数据存储可以覆盖节点选择或完全重新实现任何调用,如果需要的话。

目前,我们不会引入新的(集群)API 端点(例如,trove cluster-user-create)。对于上述 API 来说,这是否必要尚不清楚,而且它会在集群和单个 Trove 实例之间绘制出另一个区别,这可能是不必要的。

这项工作将完全在 API 引擎内部进行。现有的端点(guest-agent 或用户界面)将不受影响。

配置

对于每个控制器实现,都将有一个特定数据存储的属性。

数据库

公共 API

公共 API 安全

Python API

CLI (python-troveclient)

CLI 将被修改为接受相关命令的集群 ID。

内部 API

每个 ReST API 端点只能有一个控制器。

这将是一个路由控制器。该控制器将负责检测目标实例的数据存储并加载其派生控制器实现(参见 配置)。然后,它会将请求简单地传递给该派生控制器。

派生控制器将使用相同的接口扩展基本实现。通常,它将只解析有效负载并构建特定数据存储的模型对象和视图。基本实现将处理通用的验证和执行流程。

基本实现还将负责检测实例类型(即,单个或集群),并将集群请求路由到集群接口,该接口然后将其传递给集群暴露的节点中的一个(控制器)实例(即,“trove cluster-instances”命令显示的节点)。

Guest Agent

备选方案

Dashboard 影响 (UX)

实现

负责人

Petr Malik <pmalik@tesora.com>

里程碑

Ocata-1

工作项

  • 实现基本控制器。

  • 实现派生控制器。

  • 切换数据存储以使用各自的派生控制器。

升级影响

依赖项

测试

将添加单元测试来测试基本和派生控制器的功能。

文档影响

参考资料

1

相关错误: https://bugs.launchpad.net/trove/+bug/1498573

附录