CouchDB 数据库与用户函数

尽管 CouchDB 已作为 Trove 中的实验性数据存储添加,但其功能仍存在一些差距。本规范的动机是在 Trove 中为 CouchDB 数据存储实现一些缺失的用户和数据库函数。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/couchdb-database-user-functions

问题描述

目前,可以使用 Trove 创建 CouchDB 实例,但功能非常有限。无法通过 Trove CLI 执行任何用户或数据库操作。虽然可以通过访问名为 Futon 的 CouchDB 管理界面 1 执行此类操作,但这不在 Trove 的范围内。因此,为了易用性和一致性,最好将这些 CouchDB 的数据库和用户功能作为 Trove 的一部分来实现。

提议的变更

将使用基于 HTTP 的 REST API(CouchDB 使用该 API 与服务器通信)为 Trove 中的 CouchDB 数据存储实现基本用户和数据库函数。将通过 HTTP 请求发送 curl 命令到 CouchDB 服务器,然后执行操作。

将支持的新操作如下

  • 创建/删除/显示用户

  • 列出用户

  • 授予/撤销/显示访问权限

  • 启用/显示 root

  • 创建/删除数据库

  • 列出数据库

将在 service.py 中创建一个 CouchDBAdmin 类,该类将包含这些方法,并且 manager.py 中的函数将被更新为调用这些新方法。每个方法将使用核心 CouchDB API 来对服务器执行适当的 HTTP 请求以实现该功能。

目前,CouchDB 没有 API 扩展,因此将创建一个新的 API 扩展来实现数据存储特定的功能,同时调整用户/数据库操作。CouchDB 特定模型中生效的验证将对应于 CouchDB 数据存储的要求。

CouchDB 安全性

在新的 CouchDB 实例上,服务器允许任何人发出任何请求 - 这是一个 Admin Party 2 。为了启用用户功能,来宾代理的 CouchDB 服务器将通过默认创建 Trove 用户 ‘os_admin’ 来保证安全。当首次启动来宾时,将创建 os_admin 用户,并使用来宾生成的密码连接到服务器。这将使用以下命令完成 - curl -X PUT https://:5984/_config/admins/os_admin -d '"password"'

用户名和生成的密码将存储在实例主目录中的文件中(stream_codecs.JsonCodec 将用于处理它)。所有其他创建的用户都是非管理员用户,因此可以防止任何人意外创建管理员用户 3 。可以使用 trove root-enable 命令通过在 couchDB 服务器上创建一个具有管理员权限的用户来创建唯一的管理员用户 ‘root’。

配置

数据库

公共 API

用户将能够通过 CLI 运行为 CouchDB 数据存储实现的功能。

公共 API 安全

Python API

CLI (python-troveclient)

以下 Trove 命令行命令将适用于 CouchDB

  • trove user-create

  • trove user-delete

  • trove user-grant-access

  • trove user-list

  • trove user-revoke-access

  • trove user-show

  • trove user-show-access

  • trove root-enable

  • trove root-show

  • trove database-create

  • trove database-delete

  • trove database-list

内部 API

Guest Agent

CouchDB 来宾代理将被修改以支持额外的数据库和用户功能。特别是,以下文件将添加组件

trove/guestagent/datastore/experimental/couchdb/manager.py
trove/guestagent/datastore/experimental/couchdb/service.py
trove/guestagent/datastore/experimental/couchdb/system.py

将使用 CouchDB API 实现几个新的来宾代理函数。以下是每个来宾代理方法的示例 API 调用和相关详细信息。

create_user

创建非管理员用户,名称为 username,密码为 password

curl -X PUT http://os_admin:password@localhost:5984/_users/org.couchdb
.user:username \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"name": "username", "password": "password", "roles": [], "type":
"user"}'

list_users

列出系统数据库 _users 中的所有用户以及系统数据库 _all_dbs 中的所有数据库。然后交叉引用以列出用户及其拥有的数据库的访问权限。

curl -s http://os_admin:password@localhost:5984/_users/_all_docs

curl -X http://os_admin:password@localhost:5984/_all_dbs

curl -X http://os_admin:password@localhost:5984/databasename/_security

delete_user

从系统数据库 _users 中删除用户 username,对应于 rev 编号 1-3cd11775d7e3ba15a9f8c553cb3d47bd。使用以下第二个命令列出的命令获取文档的 rev 编号。

curl -X DELETE http://os_admin:password@localhost:5984/_users/org. couchdb.user:username?rev=1-3cd11775d7e3ba15a9f8c553cb3d47bd

curl -s http://os_admin:password@localhost:5984/_users/_all_docs

get_user

显示与特定用户相关的所有信息 - 用户名、用户拥有数据库的访问权限以及权限(管理员/成员)。

curl -X http://os_admin:password@localhost:5984/_all_dbs

curl -X http://os_admin:password@localhost:5984/databasename/_security

enable_root

创建用户“root”并授予“admin”角色

curl -X PUT http://os_admin:password@localhost:5984/_config/admins/
root -d '"password"'

is_root_enabled

检查系统数据库 _config 中是否存在 root 用户以及是否具有管理员权限

curl -s http://os_admin:password@localhost:5984/_config/_admins

delete_root

从 CouchDB 实例中删除 root 用户。

curl -X DELETE http://
os_admin:password@localhost:5984/_config/admins/root

grant_access

修改用户 username 在数据库 databasename 上的角色,以将 username 作为列出的管理员包含在内

curl -X PUT http://os_admin:password@localhost:5984
/databasename/_security \
> -d '{"admins":{"names":[], "roles":[]}, "members":{"names”:[
“username”],”roles":[]}}'

revoke_access

与 grant access 的实现类似,修改用户 ` username`` 在数据库 databasename 上的角色,以删除 username 作为列出的成员

curl -X PUT http://os_admin:password@localhost:5984
/databasename/_security \
> -d '{"admins":{"names":[], "roles":[]}, "members":{"names”:[],
”roles":[]}}'

list_access

列出系统数据库 _all_dbs 中的所有数据库。然后交叉引用以列出指定用户具有访问权限的所有数据库。

curl -X http://os_admin:password@localhost:5984/_all_dbs

curl -X http://os_admin:password@localhost:5984/databasename/_security

create_database

创建一个名为 database_name 的数据库

curl -X PUT http://os_admin:password@localhost:5984/database_name

数据库名称必须由以下字符中的一个或多个组成,并且名称必须以小写字母开头 4

  • 小写字母 (a-z)

  • 数字 (0-9)

  • 任何字符 _, $, (, ), +, -, 和 /。

delete_database

删除名为 database_name 的数据库

curl -X DELETE http://os_admin:password@localhost:5984/database_name

list_databases

列出系统数据库 _all_dbs 中的所有数据库

curl -X GET http://os_admin:password@localhost:5984/_all_dbs

备选方案

Dashboard 影响 (UX)

需要更新仪表板,以便为 CouchDB 数据存储启用用户和数据库选项卡。无需向仪表板添加新功能。

实现

负责人

主要负责人

imandhan (launchpad id) Ishita Mandhan <imandha@us.ibm.com>

里程碑

Mitaka

工作项

实现 CouchDB 的用户和数据库功能。主要涉及在 manager、service 和 system 文件上工作。将根据需要编写测试 - 单元测试和集成测试。工作将分为 5 个部分 -

  1. 启用服务器上的身份验证

  2. 创建/删除/获取/列出用户

  3. 启用/检查 root

  4. 授予/撤销/列出访问权限

  5. 创建/删除/列出数据库

升级影响

依赖项

测试

将根据需要添加单元测试和集成测试来测试添加的新代码。

文档影响

需要更新 CouchDB Trove 文档,以指示已实现用户和数据库功能。

附录