Merge "CouchDB database and user functions"
This commit is contained in:
commit
e53f0792ed
375
specs/mitaka/couchdb-database-user-functions.rst
Normal file
375
specs/mitaka/couchdb-database-user-functions.rst
Normal file
@ -0,0 +1,375 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
Sections of this template were taken directly from the Nova spec
|
||||||
|
template at:
|
||||||
|
https://github.com/openstack/nova-specs/blob/master/specs/template.rst
|
||||||
|
|
||||||
|
..
|
||||||
|
This template should be in ReSTructured text. The filename in the git
|
||||||
|
repository should match the launchpad URL, for example a URL of
|
||||||
|
https://blueprints.launchpad.net/trove/+spec/awesome-thing should be named
|
||||||
|
awesome-thing.rst.
|
||||||
|
|
||||||
|
Please do not delete any of the sections in this template. If you
|
||||||
|
have nothing to say for a whole section, just write: None
|
||||||
|
|
||||||
|
Note: This comment may be removed if desired, however the license notice
|
||||||
|
above should remain.
|
||||||
|
|
||||||
|
|
||||||
|
=================================
|
||||||
|
CouchDB Database & User Functions
|
||||||
|
=================================
|
||||||
|
|
||||||
|
.. If section numbers are desired, unindent this
|
||||||
|
.. sectnum::
|
||||||
|
|
||||||
|
.. If a TOC is desired, unindent this
|
||||||
|
.. contents::
|
||||||
|
|
||||||
|
Even though CouchDB has been added as an experimental datastore in Trove, the
|
||||||
|
functionality yet has some gaps to be filled. The motivation behind this spec
|
||||||
|
is to implement some of those missing user and database functions for the
|
||||||
|
CouchDB datastore in Trove.
|
||||||
|
|
||||||
|
Launchpad Blueprint:
|
||||||
|
https://blueprints.launchpad.net/trove/+spec/couchdb-database-user-functions
|
||||||
|
|
||||||
|
|
||||||
|
Problem Description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Currently, a CouchDB instance can be created using Trove but the
|
||||||
|
functionality is very limited. No user or database actions can be performed
|
||||||
|
via the Trove CLI. While, it is possible to perform such operations by
|
||||||
|
accessing the CouchDB administration interface called Futon [1]_, it is not
|
||||||
|
within the scope of Trove. Therefore for ease of use and consistency, it is
|
||||||
|
best that these database and user functionalities for CouchDB be implemented
|
||||||
|
as part of Trove.
|
||||||
|
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
===============
|
||||||
|
|
||||||
|
Implementation of the basic user and database functions will be performed for
|
||||||
|
the CouchDB datastore in Trove using an HTTP-based REST API which CouchDB uses
|
||||||
|
to communicate with the server. Curl commands will be sent over HTTP requests
|
||||||
|
to the CouchDB server which will then execute actions.
|
||||||
|
|
||||||
|
The new operations that will be supported are as follows:
|
||||||
|
|
||||||
|
* create/delete/show user
|
||||||
|
* list users
|
||||||
|
* grant/revoke/show access
|
||||||
|
* root enable/show
|
||||||
|
* create/delete database
|
||||||
|
* list databases
|
||||||
|
|
||||||
|
A ``CouchDBAdmin`` class will be created in ``service.py`` which will have
|
||||||
|
these methods in it and the functions in ``manager.py`` will be updated to
|
||||||
|
call these new methods. Each method will use the core CouchDB API to make
|
||||||
|
appropriate HTTP requests for that functionality on the server.
|
||||||
|
|
||||||
|
As of now an API extension for CouchDB does not exist so a new API extension
|
||||||
|
will be created to implement datastore specifics while moderating user/
|
||||||
|
database operations. The validation in effect in the CouchDB specific models
|
||||||
|
will correspond to CouchDB datastore requirements.
|
||||||
|
|
||||||
|
CouchDB Security
|
||||||
|
----------------
|
||||||
|
|
||||||
|
On a fresh CouchDB instance, the server allows any request to be made by
|
||||||
|
anyone - it's an Admin Party [2]_ . To enable the user functionalities, the
|
||||||
|
guest agent's CouchDB server will be made secure by creating a Trove user
|
||||||
|
'os_admin' by default. When a guest is first started, the os_admin user will
|
||||||
|
be created and will be connected to the server using a password generated by
|
||||||
|
the guest. This will be done using the following command-
|
||||||
|
``curl -X PUT http://localhost:5984/_config/admins/os_admin -d '"password"'``
|
||||||
|
|
||||||
|
The username and generated password will be stored in a file in the home ~
|
||||||
|
directory on the instance (stream_codecs.JsonCodec will be used to handle
|
||||||
|
it). All other users that are created are non-admin users so this
|
||||||
|
preventing anybody from accidentally creating an admin user [3]_ . The only
|
||||||
|
admin user that can be created is 'root' using the trove root-enable command
|
||||||
|
by creating a user on the couchDB server with admin privileges.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Database
|
||||||
|
--------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Public API
|
||||||
|
----------
|
||||||
|
|
||||||
|
The user will be able to run the implemented functions for CouchDB datastore
|
||||||
|
via CLI.
|
||||||
|
|
||||||
|
Public API Security
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Python API
|
||||||
|
----------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
CLI (python-troveclient)
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The following Trove command line commands will be functional for 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
|
||||||
|
|
||||||
|
Internal API
|
||||||
|
------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Guest Agent
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The CouchDB guest agent will be modified to support additional database and
|
||||||
|
user functionality. In particular the following files will have added
|
||||||
|
components:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
trove/guestagent/datastore/experimental/couchdb/manager.py
|
||||||
|
trove/guestagent/datastore/experimental/couchdb/service.py
|
||||||
|
trove/guestagent/datastore/experimental/couchdb/system.py
|
||||||
|
|
||||||
|
Several new guest agent functions will be implemented using the CouchDB API.
|
||||||
|
Below are sample API calls and associated details for each guest agent method.
|
||||||
|
|
||||||
|
**create_user**
|
||||||
|
|
||||||
|
Create non-admin user with name ``username`` and password ``password``
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
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**
|
||||||
|
|
||||||
|
List all the users from the system database ``_users`` and all the databases
|
||||||
|
from the system database ``_all_dbs``. Then cross reference to list users and
|
||||||
|
the databases that they have access to.
|
||||||
|
|
||||||
|
``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**
|
||||||
|
|
||||||
|
Deletes user ``username`` from the system database ``_users`` corresponding
|
||||||
|
to rev number 1-3cd11775d7e3ba15a9f8c553cb3d47bd. The rev number for the
|
||||||
|
document to be obtained using the second command listed below.
|
||||||
|
|
||||||
|
``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**
|
||||||
|
|
||||||
|
Shows the complete information associated with a specific user - username,
|
||||||
|
databases user has access to and permissions(admin/member).
|
||||||
|
|
||||||
|
``curl -X http://os_admin:password@localhost:5984/_all_dbs``
|
||||||
|
|
||||||
|
``curl -X http://os_admin:password@localhost:5984/databasename/_security``
|
||||||
|
|
||||||
|
**enable_root**
|
||||||
|
|
||||||
|
Create user "root" and grant the role "admin"
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
curl -X PUT http://os_admin:password@localhost:5984/_config/admins/
|
||||||
|
root -d '"password"'
|
||||||
|
|
||||||
|
**is_root_enabled**
|
||||||
|
|
||||||
|
Checks if user root exists in the system database ``_config`` and has admin
|
||||||
|
privileges
|
||||||
|
|
||||||
|
``curl -s http://os_admin:password@localhost:5984/_config/_admins``
|
||||||
|
|
||||||
|
**delete_root**
|
||||||
|
|
||||||
|
Deletes the root user from the CouchDB instance.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
curl -X DELETE http://
|
||||||
|
os_admin:password@localhost:5984/_config/admins/root
|
||||||
|
|
||||||
|
**grant_access**
|
||||||
|
|
||||||
|
Modify the role of user ``username`` for database ``databasename`` to include
|
||||||
|
``username`` as a listed admin
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
curl -X PUT http://os_admin:password@localhost:5984
|
||||||
|
/databasename/_security \
|
||||||
|
> -d '{"admins":{"names":[], "roles":[]}, "members":{"names”:[
|
||||||
|
“username”],”roles":[]}}'
|
||||||
|
|
||||||
|
**revoke_access**
|
||||||
|
|
||||||
|
Similar to the implementation of grant access, modify the role of user `
|
||||||
|
username`` for database ``databasename`` to remove ``username`` as a listed
|
||||||
|
member
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
curl -X PUT http://os_admin:password@localhost:5984
|
||||||
|
/databasename/_security \
|
||||||
|
> -d '{"admins":{"names":[], "roles":[]}, "members":{"names”:[],
|
||||||
|
”roles":[]}}'
|
||||||
|
|
||||||
|
**list_access**
|
||||||
|
|
||||||
|
Lists all the databases from the system database ``_all_dbs``. Then cross
|
||||||
|
reference to list all the databases that the specified user has has access to.
|
||||||
|
|
||||||
|
``curl -X http://os_admin:password@localhost:5984/_all_dbs``
|
||||||
|
|
||||||
|
``curl -X http://os_admin:password@localhost:5984/databasename/_security``
|
||||||
|
|
||||||
|
**create_database**
|
||||||
|
|
||||||
|
Creates a database with name ``database_name``
|
||||||
|
|
||||||
|
``curl -X PUT http://os_admin:password@localhost:5984/database_name``
|
||||||
|
|
||||||
|
The database name must consist of one or more of the following characters and
|
||||||
|
the name must begin with a lowercase letter [4]_ .
|
||||||
|
|
||||||
|
- Lowercase characters (a-z)
|
||||||
|
- Digits (0-9)
|
||||||
|
- Any of the characters _, $, (, ), +, -, and /.
|
||||||
|
|
||||||
|
**delete_database**
|
||||||
|
|
||||||
|
Deletes the database with name ``database_name``
|
||||||
|
|
||||||
|
``curl -X DELETE http://os_admin:password@localhost:5984/database_name``
|
||||||
|
|
||||||
|
**list_databases**
|
||||||
|
|
||||||
|
Lists all the databases from the system database ``_all_dbs``
|
||||||
|
|
||||||
|
``curl -X GET http://os_admin:password@localhost:5984/_all_dbs``
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Dashboard Impact (UX)
|
||||||
|
=====================
|
||||||
|
|
||||||
|
The dashboard will need to be updated for the users and databases tabs to be
|
||||||
|
enabled for the CouchDB datastore. No new features will need to be added to
|
||||||
|
the dashboard.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
imandhan (launchpad id)
|
||||||
|
Ishita Mandhan <imandha@us.ibm.com>
|
||||||
|
|
||||||
|
Milestones
|
||||||
|
----------
|
||||||
|
|
||||||
|
Mitaka
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
Implementation of the functionality of user and database functions for
|
||||||
|
CouchDB. Involves working on the manager, service and system files
|
||||||
|
primarily. Tests will be written as required - both unit tests and int tests.
|
||||||
|
The work will be split into 5 parts-
|
||||||
|
|
||||||
|
1) Enable authentication on server
|
||||||
|
2) Create/delete/get/list user
|
||||||
|
3) Enable/check root
|
||||||
|
4) grant/revoke/list access
|
||||||
|
5) create/delete/list database
|
||||||
|
|
||||||
|
|
||||||
|
Upgrade Implications
|
||||||
|
====================
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Unit tests and integration tests will be added as necessary to test new code
|
||||||
|
added.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
The CouchDB Trove documentation will need to be updated to indicate that user
|
||||||
|
and database functions have been implemented.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] CouchDB Futon: http://docs.couchdb.org/en/1.6.1/intro/futon.html
|
||||||
|
.. [2] CouchDB Security: http://docs.couchdb.org/en/1.6.1/intro/security.html
|
||||||
|
.. [3] CouchDB Authentication: http://docs.couchdb.org/en/1.6.1/config/auth.html
|
||||||
|
.. [4] CouchDB Database Name Restrictions: http://couchdb-13.readthedocs.org/en/latest/api/database/
|
||||||
|
|
||||||
|
Appendix
|
||||||
|
========
|
||||||
|
|
||||||
|
None
|
Loading…
Reference in New Issue
Block a user