diff options
author | Theron Voran <theron.voran@rackspace.com> | 2014-08-26 12:56:51 -0500 |
---|---|---|
committer | Tim Simpson <tim.simpson@rackspace.com> | 2014-08-26 12:57:28 -0500 |
commit | 00e13fad266ff02fa9deed0066cdf2e2ca9e0dce (patch) | |
tree | 433813847bca81856ed2b86d633e150e4c3e5132 | |
parent | 872abf2c9d57bdec03433b23bf48ac4eb5a79ac6 (diff) | |
download | python-troveclient-00e13fad266ff02fa9deed0066cdf2e2ca9e0dce.tar.gz |
Add visibility filter to datastore versions
Allows datastore versions to be hidden from all users except those
explicitly allowed by their tenant. Implemented via a visibility
attribute for datastore versions (defaulting to 'public'), and a
datastore version member table for controlling access to non-public
datastore versions by tenant.
This commit provides the client functionality for integration tests
related to the datastore-visibility feature.
Implements: blueprint datastore-visibility
Docimpact: change to datastore version payload
Change-Id: Ic8024a631530ba295688d7e49e895f50cb2f32ef
-rw-r--r-- | troveclient/compat/client.py | 2 | ||||
-rw-r--r-- | troveclient/compat/exceptions.py | 10 | ||||
-rw-r--r-- | troveclient/v1/datastores.py | 61 |
3 files changed, 71 insertions, 2 deletions
diff --git a/troveclient/compat/client.py b/troveclient/compat/client.py index 5c5d5fe..03802a0 100644 --- a/troveclient/compat/client.py +++ b/troveclient/compat/client.py @@ -339,6 +339,8 @@ class Dbaas(object): self.security_group_rules = security_groups.SecurityGroupRules(self) self.datastores = datastores.Datastores(self) self.datastore_versions = datastores.DatastoreVersions(self) + self.datastore_version_members = (datastores. + DatastoreVersionMembers(self)) self.storage = storage.StorageInfo(self) self.management = management.Management(self) self.mgmt_flavor = management.MgmtFlavors(self) diff --git a/troveclient/compat/exceptions.py b/troveclient/compat/exceptions.py index 22bba23..7051bb4 100644 --- a/troveclient/compat/exceptions.py +++ b/troveclient/compat/exceptions.py @@ -108,6 +108,12 @@ class NotFound(ClientException): message = "Not found" +class Conflict(ClientException): + """HTTP 409 - Conflict.""" + http_status = 409 + message = "Conflict" + + class OverLimit(ClientException): """HTTP 413 - Over limit: you're over the API limits for this time period. @@ -138,8 +144,8 @@ class UnprocessableEntity(ClientException): # # Instead, we have to hardcode it: _code_map = dict((c.http_status, c) for c in [BadRequest, Unauthorized, - Forbidden, NotFound, OverLimit, - HTTPNotImplemented, + Forbidden, NotFound, Conflict, + OverLimit, HTTPNotImplemented, UnprocessableEntity]) diff --git a/troveclient/v1/datastores.py b/troveclient/v1/datastores.py index bdce1fe..4785e8f 100644 --- a/troveclient/v1/datastores.py +++ b/troveclient/v1/datastores.py @@ -28,6 +28,16 @@ class DatastoreVersion(base.Resource): def __repr__(self): return "<DatastoreVersion: %s>" % self.name + def update(self, visibility=None): + """Change something in a datastore version.""" + self.manager.update(self.datastore, self.id, visibility) + + +class DatastoreVersionMember(base.Resource): + + def __repr__(self): + return "<DatastoreVersionMember: %s>" % self.id + class Datastores(base.ManagerWithFind): """Manage :class:`Datastore` resources.""" @@ -84,3 +94,54 @@ class DatastoreVersions(base.ManagerWithFind): return self._get("/datastores/versions/%s" % base.getid(datastore_version), "version") + + def update(self, datastore, datastore_version, visibility): + """Update a specific datastore version.""" + body = { + "datastore_version": { + } + } + if visibility is not None: + body["datastore_version"]["visibility"] = visibility + + url = ("/mgmt/datastores/%s/versions/%s" % + (datastore, datastore_version)) + return self._update(url, body=body) + + +class DatastoreVersionMembers(base.ManagerWithFind): + """Manage :class:`DatastoreVersionMember` resources.""" + resource_class = DatastoreVersionMember + + def __repr__(self): + return "<DatastoreVersionMembers Manager at %s>" % id(self) + + def add(self, datastore, datastore_version, tenant): + """Add a member to a datastore version.""" + body = {"member": tenant} + return self._create("/mgmt/datastores/%s/versions/%s/members" % + (datastore, datastore_version), + body, "datastore_version_member") + + def delete(self, datastore, datastore_version, member_id): + """Delete a member from a datastore version.""" + return self._delete("/mgmt/datastores/%s/versions/%s/members/%s" % + (datastore, datastore_version, member_id)) + + def list(self, datastore, datastore_version, limit=None, marker=None): + """List members of datastore version.""" + return self._list("/mgmt/datastores/%s/versions/%s/members" % + (datastore, datastore_version), + "datastore_version_members", limit, marker) + + def get(self, datastore, datastore_version, member_id): + """Get a datastore version member.""" + return self._get("/mgmt/datastores/%s/versions/%s/members/%s" % + (datastore, datastore_version, member_id), + "datastore_version_member") + + def get_by_tenant(self, datastore, tenant, limit=None, marker=None): + """List members by tenant id.""" + return self._list("/mgmt/datastores/%s/versions/members/%s" % + (datastore, tenant), "datastore_version_members", + limit, marker) |