Consistently support kwargs across all v3 CRUD Manager ops

Co-Authored-By: Saju Madhavan <sajuptpm@gmail.com>
Closes-Bug: 1047867
Implements: blueprint extensible-crud-manager-operations
Change-Id: I64e11bcf3797eb84e4695605daea9749259d78ec
This commit is contained in:
Divyesh Khandeshi
2014-01-07 16:41:17 -05:00
committed by Saju Madhavan
parent 19d0396224
commit 6cb1cd8c5a
9 changed files with 96 additions and 39 deletions

View File

@@ -19,6 +19,7 @@ import httpretty
import mock
from mox3 import mox
import requests
import six
from six.moves.urllib import parse as urlparse
import testtools
@@ -78,6 +79,13 @@ class TestCase(testtools.TestCase):
expected = urlparse.parse_qs(qs)
self.assertEqual(expected, httpretty.last_request().querystring)
def assertQueryStringContains(self, **kwargs):
qs = httpretty.last_request().querystring
for k, v in six.iteritems(kwargs):
self.assertIn(k, qs)
self.assertIn(v, qs[k])
def assertRequestHeaderEqual(self, name, val):
"""Verify that the last request made contains a header and its value

View File

@@ -154,6 +154,7 @@ class CrudTests(object):
def new_ref(self, **kwargs):
kwargs.setdefault('id', uuid.uuid4().hex)
kwargs.setdefault(uuid.uuid4().hex, uuid.uuid4().hex)
return kwargs
def encode(self, entity):
@@ -223,10 +224,7 @@ class CrudTests(object):
ref[attr],
'Expected different %s' % attr)
@httpretty.activate
def test_list(self, ref_list=None, expected_path=None, **filter_kwargs):
ref_list = ref_list or [self.new_ref(), self.new_ref()]
def _get_expected_path(self, expected_path=None):
if not expected_path:
if self.path_prefix:
expected_path = 'v3/%s/%s' % (self.path_prefix,
@@ -234,6 +232,13 @@ class CrudTests(object):
else:
expected_path = 'v3/%s' % self.collection_key
return expected_path
@httpretty.activate
def test_list(self, ref_list=None, expected_path=None, **filter_kwargs):
ref_list = ref_list or [self.new_ref(), self.new_ref()]
expected_path = self._get_expected_path(expected_path)
httpretty.register_uri(httpretty.GET,
urlparse.urljoin(self.TEST_URL, expected_path),
body=jsonutils.dumps(self.encode(ref_list)))
@@ -242,6 +247,19 @@ class CrudTests(object):
self.assertEqual(len(ref_list), len(returned_list))
[self.assertTrue(isinstance(r, self.model)) for r in returned_list]
@httpretty.activate
def test_list_params(self):
ref_list = [self.new_ref()]
filter_kwargs = {uuid.uuid4().hex: uuid.uuid4().hex}
expected_path = self._get_expected_path()
httpretty.register_uri(httpretty.GET,
urlparse.urljoin(self.TEST_URL, expected_path),
body=jsonutils.dumps(self.encode(ref_list)))
self.manager.list(**filter_kwargs)
self.assertQueryStringContains(**filter_kwargs)
@httpretty.activate
def test_find(self, ref=None):
ref = ref or self.new_ref()

View File

@@ -38,7 +38,8 @@ class TrustManager(base.CrudManager):
base_url = '/OS-TRUST'
def create(self, trustee_user, trustor_user, role_names=None,
project=None, impersonation=False, expires_at=None):
project=None, impersonation=False, expires_at=None,
**kwargs):
"""Create a Trust.
:param string trustee_user: user who is capable of consuming the trust
:param string trustor_user: user who's authorization is being delegated
@@ -65,17 +66,19 @@ class TrustManager(base.CrudManager):
project_id=base.getid(project),
roles=roles,
trustee_user_id=base.getid(trustee_user),
trustor_user_id=base.getid(trustor_user))
trustor_user_id=base.getid(trustor_user),
**kwargs)
def update(self):
raise exceptions.HTTPNotImplemented("Update not supported for trusts")
def list(self, trustee_user=None, trustor_user=None):
def list(self, trustee_user=None, trustor_user=None, **kwargs):
"""List Trusts."""
trustee_user_id = base.getid(trustee_user)
trustor_user_id = base.getid(trustor_user)
return super(TrustManager, self).list(trustee_user_id=trustee_user_id,
trustor_user_id=trustor_user_id)
trustor_user_id=trustor_user_id,
**kwargs)
def get(self, trust):
"""Get a specific trust."""

View File

@@ -47,28 +47,35 @@ class CredentialManager(base.CrudManager):
raise ValueError(
"Credential requires blob to be specified")
def create(self, user, type, blob=None, data=None, project=None):
def create(self, user, type, blob=None, data=None, project=None, **kwargs):
return super(CredentialManager, self).create(
user_id=base.getid(user),
type=type,
blob=self._get_data_blob(blob, data),
project_id=base.getid(project))
project_id=base.getid(project),
**kwargs)
def get(self, credential):
return super(CredentialManager, self).get(
credential_id=base.getid(credential))
def list(self):
return super(CredentialManager, self).list()
def list(self, **kwargs):
"""List credentials.
If ``**kwargs`` are provided, then filter credentials with
attributes matching ``**kwargs``.
"""
return super(CredentialManager, self).list(**kwargs)
def update(self, credential, user, type=None, blob=None, data=None,
project=None):
project=None, **kwargs):
return super(CredentialManager, self).update(
credential_id=base.getid(credential),
user_id=base.getid(user),
type=type,
blob=self._get_data_blob(blob, data),
project_id=base.getid(project))
project_id=base.getid(project),
**kwargs)
def delete(self, credential):
return super(CredentialManager, self).delete(

View File

@@ -33,25 +33,33 @@ class DomainManager(base.CrudManager):
collection_key = 'domains'
key = 'domain'
def create(self, name, description=None, enabled=True):
def create(self, name, description=None, enabled=True, **kwargs):
return super(DomainManager, self).create(
name=name,
description=description,
enabled=enabled)
enabled=enabled,
**kwargs)
def get(self, domain):
return super(DomainManager, self).get(
domain_id=base.getid(domain))
def list(self):
return super(DomainManager, self).list()
def list(self, **kwargs):
"""List domains.
def update(self, domain, name=None, description=None, enabled=True):
``**kwargs`` allows filter criteria to be passed where
supported by the server.
"""
return super(DomainManager, self).list(**kwargs)
def update(self, domain, name=None,
description=None, enabled=True, **kwargs):
return super(DomainManager, self).update(
domain_id=base.getid(domain),
name=name,
description=description,
enabled=enabled)
enabled=enabled,
**kwargs)
def delete(self, domain):
return super(DomainManager, self).delete(

View File

@@ -49,11 +49,12 @@ class GroupManager(base.CrudManager):
collection_key = 'groups'
key = 'group'
def create(self, name, domain=None, description=None):
def create(self, name, domain=None, description=None, **kwargs):
return super(GroupManager, self).create(
name=name,
domain_id=base.getid(domain),
description=description)
description=description,
**kwargs)
def list(self, user=None, domain=None, **kwargs):
"""List groups.
@@ -77,11 +78,12 @@ class GroupManager(base.CrudManager):
return super(GroupManager, self).get(
group_id=base.getid(group))
def update(self, group, name=None, description=None):
def update(self, group, name=None, description=None, **kwargs):
return super(GroupManager, self).update(
group_id=base.getid(group),
name=name,
description=description)
description=description,
**kwargs)
def delete(self, group):
return super(GroupManager, self).delete(

View File

@@ -47,23 +47,30 @@ class PolicyManager(base.CrudManager):
collection_key = 'policies'
key = 'policy'
def create(self, blob, type='application/json'):
def create(self, blob, type='application/json', **kwargs):
return super(PolicyManager, self).create(
blob=blob,
type=type)
type=type,
**kwargs)
def get(self, policy):
return super(PolicyManager, self).get(
policy_id=base.getid(policy))
def list(self):
return super(PolicyManager, self).list()
def list(self, **kwargs):
"""List policies.
def update(self, entity, blob=None, type=None):
``**kwargs`` allows filter criteria to be passed where
supported by the server.
"""
return super(PolicyManager, self).list(**kwargs)
def update(self, entity, blob=None, type=None, **kwargs):
return super(PolicyManager, self).update(
policy_id=base.getid(entity),
blob=blob,
type=type)
type=type,
**kwargs)
def delete(self, policy):
return super(PolicyManager, self).delete(

View File

@@ -72,9 +72,10 @@ class RoleManager(base.CrudManager):
msg = 'Must specify either a user or group'
raise exceptions.ValidationError(msg)
def create(self, name):
def create(self, name, **kwargs):
return super(RoleManager, self).create(
name=name)
name=name,
**kwargs)
def get(self, role):
return super(RoleManager, self).get(
@@ -101,12 +102,13 @@ class RoleManager(base.CrudManager):
domain, project),
**kwargs)
return super(RoleManager, self).list()
return super(RoleManager, self).list(**kwargs)
def update(self, role, name=None):
def update(self, role, name=None, **kwargs):
return super(RoleManager, self).update(
role_id=base.getid(role),
name=name)
name=name,
**kwargs)
def delete(self, role):
return super(RoleManager, self).delete(

View File

@@ -46,7 +46,7 @@ class UserManager(base.CrudManager):
def create(self, name, domain=None, project=None, password=None,
email=None, description=None, enabled=True,
default_project=None):
default_project=None, **kwargs):
"""Create a user.
.. warning::
@@ -67,7 +67,8 @@ class UserManager(base.CrudManager):
password=password,
email=email,
description=description,
enabled=enabled)
enabled=enabled,
**kwargs)
def list(self, project=None, domain=None, group=None, default_project=None,
**kwargs):
@@ -107,7 +108,7 @@ class UserManager(base.CrudManager):
def update(self, user, name=None, domain=None, project=None, password=None,
email=None, description=None, enabled=None,
default_project=None):
default_project=None, **kwargs):
"""Update a user.
.. warning::
@@ -129,7 +130,8 @@ class UserManager(base.CrudManager):
password=password,
email=email,
description=description,
enabled=enabled)
enabled=enabled,
**kwargs)
def add_to_group(self, user, group):
self._require_user_and_group(user, group)