blob: e94394e603db97fa41bf73a9efab5f33cc47d769 [file] [log] [blame]
Experimental and incomplete implementation of Mongo emulation layer so Mongo
clients can connect to Usergrid.
There are a number of drivers and tools for talking to MongoDB, which has a
data model that is very similar to that of Usergrid. In order to make it
easier for people to get started quickly with Usergrid, it's desirable for
them to be able to integrate it very quickly into their existing applications.
The goal here is to support the Mongo native wire protocol and to map enough
of the query and CRUD operations so that this can happen.
While Mongo is a full-featured database, in practice only a small subset of
it's commands are used. To verify this, a Mongo proxy was written at:
org.apache.usergrid.mongo.testproxy.MongoProxyServer
This proxy serves as a "man in the middle" and decodes and logs all Mongo
commands sent to and from an application and MongoDB. Using a couple of GUI
tools as well as the Mongo command-line client, we were able to see that only
a handful of commands are commonly used for listing databases, collections,
and for querying content.
Mongo uses a wire protocol described here:
http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol
Mongo uses BSON, which is a binary JSON format, as part of the wire protocol.
For compatibility, we're using the BSON encoder from the Mongo Java driver:
https://github.com/mongodb/mongo-java-driver/
However, since we're using Jackson as our JSON library for the rest of
Usergrid, the idea is to switch over to Bson4Jackson:
https://github.com/michel-kraemer/bson4jackson
The commands Mongo supports are listed here:
http://www.mongodb.org/display/DOCS/List+of+Database+Commands
Mongo's system metadata is listed here:
http://www.mongodb.org/display/DOCS/Mongo+Metadata
Queries are described here:
http://www.mongodb.org/display/DOCS/Mongo+Query+Language
Mapping Usergrid Multi-tenancy to Mongo Security
First steps are to simply be able to handle a client login and map it to a
Usergrid account.
Authentication is described here:
http://www.mongodb.org/display/DOCS/Security+and+Authentication
http://www.mongodb.org/display/DOCS/Implementing+Authentication+in+a+Driver
A user who authenticates against the Mongo 'admin' account will be actually
logging in as a Usergrid admin user who is a member of one or more Usergrid
accounts, each of which contains a set of applications that user is able to
administer. While they list the databases via the Mongo API, what they will
be seeing is the aggregate list of the applications for all the accounts they
are members of.
For any database (Usergrid application), they'll be able to list the collections.
Note: Internally, Mongo refers to it's collections as "namespaces", which
is a potential point of confusion between previous versions of Usergrid which
used the term "namespace" to describe applications.