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:
		
				
					committed by
					
						
						Saju Madhavan
					
				
			
			
				
	
			
			
			
						parent
						
							19d0396224
						
					
				
				
					commit
					6cb1cd8c5a
				
			@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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."""
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user