From 6cb1cd8c5a334406027c8859ba9b5a3abc07cca7 Mon Sep 17 00:00:00 2001 From: Divyesh Khandeshi Date: Tue, 7 Jan 2014 16:41:17 -0500 Subject: [PATCH] Consistently support kwargs across all v3 CRUD Manager ops Co-Authored-By: Saju Madhavan Closes-Bug: 1047867 Implements: blueprint extensible-crud-manager-operations Change-Id: I64e11bcf3797eb84e4695605daea9749259d78ec --- keystoneclient/tests/utils.py | 8 ++++++++ keystoneclient/tests/v3/utils.py | 26 ++++++++++++++++++++++---- keystoneclient/v3/contrib/trusts.py | 11 +++++++---- keystoneclient/v3/credentials.py | 19 +++++++++++++------ keystoneclient/v3/domains.py | 20 ++++++++++++++------ keystoneclient/v3/groups.py | 10 ++++++---- keystoneclient/v3/policies.py | 19 +++++++++++++------ keystoneclient/v3/roles.py | 12 +++++++----- keystoneclient/v3/users.py | 10 ++++++---- 9 files changed, 96 insertions(+), 39 deletions(-) diff --git a/keystoneclient/tests/utils.py b/keystoneclient/tests/utils.py index ec5467189..1836a0461 100644 --- a/keystoneclient/tests/utils.py +++ b/keystoneclient/tests/utils.py @@ -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 diff --git a/keystoneclient/tests/v3/utils.py b/keystoneclient/tests/v3/utils.py index 1935691ab..398ec9dd4 100644 --- a/keystoneclient/tests/v3/utils.py +++ b/keystoneclient/tests/v3/utils.py @@ -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() diff --git a/keystoneclient/v3/contrib/trusts.py b/keystoneclient/v3/contrib/trusts.py index db1ef55e3..7c695eca5 100644 --- a/keystoneclient/v3/contrib/trusts.py +++ b/keystoneclient/v3/contrib/trusts.py @@ -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.""" diff --git a/keystoneclient/v3/credentials.py b/keystoneclient/v3/credentials.py index 35fab1c9c..eb17813ab 100644 --- a/keystoneclient/v3/credentials.py +++ b/keystoneclient/v3/credentials.py @@ -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( diff --git a/keystoneclient/v3/domains.py b/keystoneclient/v3/domains.py index accda3515..35d41a744 100644 --- a/keystoneclient/v3/domains.py +++ b/keystoneclient/v3/domains.py @@ -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( diff --git a/keystoneclient/v3/groups.py b/keystoneclient/v3/groups.py index 81bf530c2..f9d6103f6 100644 --- a/keystoneclient/v3/groups.py +++ b/keystoneclient/v3/groups.py @@ -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( diff --git a/keystoneclient/v3/policies.py b/keystoneclient/v3/policies.py index 25f6c14b0..545ec08a4 100644 --- a/keystoneclient/v3/policies.py +++ b/keystoneclient/v3/policies.py @@ -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( diff --git a/keystoneclient/v3/roles.py b/keystoneclient/v3/roles.py index 022a4ecf5..53c770007 100644 --- a/keystoneclient/v3/roles.py +++ b/keystoneclient/v3/roles.py @@ -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( diff --git a/keystoneclient/v3/users.py b/keystoneclient/v3/users.py index a3a26df24..53555fa51 100644 --- a/keystoneclient/v3/users.py +++ b/keystoneclient/v3/users.py @@ -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)