Merge "Consistently support kwargs across all v3 CRUD Manager ops"

This commit is contained in:
Jenkins
2014-01-28 02:02:53 +00:00
committed by Gerrit Code Review
9 changed files with 96 additions and 39 deletions

View File

@@ -19,6 +19,7 @@ import httpretty
import mock import mock
from mox3 import mox from mox3 import mox
import requests import requests
import six
from six.moves.urllib import parse as urlparse from six.moves.urllib import parse as urlparse
import testtools import testtools
@@ -78,6 +79,13 @@ class TestCase(testtools.TestCase):
expected = urlparse.parse_qs(qs) expected = urlparse.parse_qs(qs)
self.assertEqual(expected, httpretty.last_request().querystring) 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): def assertRequestHeaderEqual(self, name, val):
"""Verify that the last request made contains a header and its value """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): def new_ref(self, **kwargs):
kwargs.setdefault('id', uuid.uuid4().hex) kwargs.setdefault('id', uuid.uuid4().hex)
kwargs.setdefault(uuid.uuid4().hex, uuid.uuid4().hex)
return kwargs return kwargs
def encode(self, entity): def encode(self, entity):
@@ -223,10 +224,7 @@ class CrudTests(object):
ref[attr], ref[attr],
'Expected different %s' % attr) 'Expected different %s' % attr)
@httpretty.activate def _get_expected_path(self, expected_path=None):
def test_list(self, ref_list=None, expected_path=None, **filter_kwargs):
ref_list = ref_list or [self.new_ref(), self.new_ref()]
if not expected_path: if not expected_path:
if self.path_prefix: if self.path_prefix:
expected_path = 'v3/%s/%s' % (self.path_prefix, expected_path = 'v3/%s/%s' % (self.path_prefix,
@@ -234,6 +232,13 @@ class CrudTests(object):
else: else:
expected_path = 'v3/%s' % self.collection_key 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, httpretty.register_uri(httpretty.GET,
urlparse.urljoin(self.TEST_URL, expected_path), urlparse.urljoin(self.TEST_URL, expected_path),
body=jsonutils.dumps(self.encode(ref_list))) body=jsonutils.dumps(self.encode(ref_list)))
@@ -242,6 +247,19 @@ class CrudTests(object):
self.assertEqual(len(ref_list), len(returned_list)) self.assertEqual(len(ref_list), len(returned_list))
[self.assertIsInstance(r, self.model) for r in returned_list] [self.assertIsInstance(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 @httpretty.activate
def test_find(self, ref=None): def test_find(self, ref=None):
ref = ref or self.new_ref() ref = ref or self.new_ref()

View File

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

View File

@@ -47,28 +47,35 @@ class CredentialManager(base.CrudManager):
raise ValueError( raise ValueError(
"Credential requires blob to be specified") "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( return super(CredentialManager, self).create(
user_id=base.getid(user), user_id=base.getid(user),
type=type, type=type,
blob=self._get_data_blob(blob, data), blob=self._get_data_blob(blob, data),
project_id=base.getid(project)) project_id=base.getid(project),
**kwargs)
def get(self, credential): def get(self, credential):
return super(CredentialManager, self).get( return super(CredentialManager, self).get(
credential_id=base.getid(credential)) credential_id=base.getid(credential))
def list(self): def list(self, **kwargs):
return super(CredentialManager, self).list() """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, def update(self, credential, user, type=None, blob=None, data=None,
project=None): project=None, **kwargs):
return super(CredentialManager, self).update( return super(CredentialManager, self).update(
credential_id=base.getid(credential), credential_id=base.getid(credential),
user_id=base.getid(user), user_id=base.getid(user),
type=type, type=type,
blob=self._get_data_blob(blob, data), blob=self._get_data_blob(blob, data),
project_id=base.getid(project)) project_id=base.getid(project),
**kwargs)
def delete(self, credential): def delete(self, credential):
return super(CredentialManager, self).delete( return super(CredentialManager, self).delete(

View File

@@ -33,25 +33,33 @@ class DomainManager(base.CrudManager):
collection_key = 'domains' collection_key = 'domains'
key = 'domain' key = 'domain'
def create(self, name, description=None, enabled=True): def create(self, name, description=None, enabled=True, **kwargs):
return super(DomainManager, self).create( return super(DomainManager, self).create(
name=name, name=name,
description=description, description=description,
enabled=enabled) enabled=enabled,
**kwargs)
def get(self, domain): def get(self, domain):
return super(DomainManager, self).get( return super(DomainManager, self).get(
domain_id=base.getid(domain)) domain_id=base.getid(domain))
def list(self): def list(self, **kwargs):
return super(DomainManager, self).list() """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( return super(DomainManager, self).update(
domain_id=base.getid(domain), domain_id=base.getid(domain),
name=name, name=name,
description=description, description=description,
enabled=enabled) enabled=enabled,
**kwargs)
def delete(self, domain): def delete(self, domain):
return super(DomainManager, self).delete( return super(DomainManager, self).delete(

View File

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

View File

@@ -47,23 +47,30 @@ class PolicyManager(base.CrudManager):
collection_key = 'policies' collection_key = 'policies'
key = 'policy' key = 'policy'
def create(self, blob, type='application/json'): def create(self, blob, type='application/json', **kwargs):
return super(PolicyManager, self).create( return super(PolicyManager, self).create(
blob=blob, blob=blob,
type=type) type=type,
**kwargs)
def get(self, policy): def get(self, policy):
return super(PolicyManager, self).get( return super(PolicyManager, self).get(
policy_id=base.getid(policy)) policy_id=base.getid(policy))
def list(self): def list(self, **kwargs):
return super(PolicyManager, self).list() """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( return super(PolicyManager, self).update(
policy_id=base.getid(entity), policy_id=base.getid(entity),
blob=blob, blob=blob,
type=type) type=type,
**kwargs)
def delete(self, policy): def delete(self, policy):
return super(PolicyManager, self).delete( return super(PolicyManager, self).delete(

View File

@@ -72,9 +72,10 @@ class RoleManager(base.CrudManager):
msg = 'Must specify either a user or group' msg = 'Must specify either a user or group'
raise exceptions.ValidationError(msg) raise exceptions.ValidationError(msg)
def create(self, name): def create(self, name, **kwargs):
return super(RoleManager, self).create( return super(RoleManager, self).create(
name=name) name=name,
**kwargs)
def get(self, role): def get(self, role):
return super(RoleManager, self).get( return super(RoleManager, self).get(
@@ -101,12 +102,13 @@ class RoleManager(base.CrudManager):
domain, project), domain, project),
**kwargs) **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( return super(RoleManager, self).update(
role_id=base.getid(role), role_id=base.getid(role),
name=name) name=name,
**kwargs)
def delete(self, role): def delete(self, role):
return super(RoleManager, self).delete( 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, def create(self, name, domain=None, project=None, password=None,
email=None, description=None, enabled=True, email=None, description=None, enabled=True,
default_project=None): default_project=None, **kwargs):
"""Create a user. """Create a user.
.. warning:: .. warning::
@@ -67,7 +67,8 @@ class UserManager(base.CrudManager):
password=password, password=password,
email=email, email=email,
description=description, description=description,
enabled=enabled) enabled=enabled,
**kwargs)
def list(self, project=None, domain=None, group=None, default_project=None, def list(self, project=None, domain=None, group=None, default_project=None,
**kwargs): **kwargs):
@@ -107,7 +108,7 @@ class UserManager(base.CrudManager):
def update(self, user, name=None, domain=None, project=None, password=None, def update(self, user, name=None, domain=None, project=None, password=None,
email=None, description=None, enabled=None, email=None, description=None, enabled=None,
default_project=None): default_project=None, **kwargs):
"""Update a user. """Update a user.
.. warning:: .. warning::
@@ -129,7 +130,8 @@ class UserManager(base.CrudManager):
password=password, password=password,
email=email, email=email,
description=description, description=description,
enabled=enabled) enabled=enabled,
**kwargs)
def add_to_group(self, user, group): def add_to_group(self, user, group):
self._require_user_and_group(user, group) self._require_user_and_group(user, group)