From 267f2129161cbf1bb8d859462fba5bd1b54e060c Mon Sep 17 00:00:00 2001 From: Lin Hua Cheng Date: Fri, 26 Jul 2013 17:02:02 -0700 Subject: [PATCH] Pass the default_project_id when managing User. User default_project_id for setting the default project of the User. Fixes bug 1205520 Change-Id: I176d88bb6897c36404d8915385cc791adf10c586 --- keystoneclient/v3/users.py | 57 +++++++++++++-- tests/v3/test_users.py | 144 ++++++++++++++++++++++++++++++++++++- 2 files changed, 194 insertions(+), 7 deletions(-) diff --git a/keystoneclient/v3/users.py b/keystoneclient/v3/users.py index 604651330..f4870939e 100644 --- a/keystoneclient/v3/users.py +++ b/keystoneclient/v3/users.py @@ -14,9 +14,14 @@ # License for the specific language governing permissions and limitations # under the License. +import logging + from keystoneclient import base +LOG = logging.getLogger(__name__) + + class User(base.Resource): """Represents an Identity user. @@ -39,17 +44,32 @@ class UserManager(base.CrudManager): raise exceptions.ValidationError(msg) 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): + """Create a user. + + .. warning:: + + The project argument is deprecated, use default_project instead. + + If both default_project and project is provided, the default_project + will be used. + """ + if project: + LOG.warning("The project argument is deprecated, " + "use default_project instead.") + default_project_id = base.getid(default_project) or base.getid(project) return super(UserManager, self).create( name=name, domain_id=base.getid(domain), - project_id=base.getid(project), + default_project_id=default_project_id, password=password, email=email, description=description, enabled=enabled) - def list(self, project=None, domain=None, group=None, **kwargs): + def list(self, project=None, domain=None, group=None, default_project=None, + **kwargs): """List users. If project, domain or group are provided, then filter @@ -57,7 +77,18 @@ class UserManager(base.CrudManager): If ``**kwargs`` are provided, then filter users with attributes matching ``**kwargs``. + + .. warning:: + + The project argument is deprecated, use default_project instead. + + If both default_project and project is provided, the default_project + will be used. """ + if project: + LOG.warning("The project argument is deprecated, " + "use default_project instead.") + default_project_id = base.getid(default_project) or base.getid(project) if group: base_url = '/groups/%s' % base.getid(group) else: @@ -66,7 +97,7 @@ class UserManager(base.CrudManager): return super(UserManager, self).list( base_url=base_url, domain_id=base.getid(domain), - project_id=base.getid(project), + default_project_id=default_project_id, **kwargs) def get(self, user): @@ -74,12 +105,26 @@ class UserManager(base.CrudManager): user_id=base.getid(user)) 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): + """Update a user. + + .. warning:: + + The project argument is deprecated, use default_project instead. + + If both default_project and project is provided, the default_project + will be used. + """ + if project: + LOG.warning("The project argument is deprecated, " + "use default_project instead.") + default_project_id = base.getid(default_project) or base.getid(project) return super(UserManager, self).update( user_id=base.getid(user), name=name, domain_id=base.getid(domain), - project_id=base.getid(project), + default_project_id=default_project_id, password=password, email=email, description=description, diff --git a/tests/v3/test_users.py b/tests/v3/test_users.py index 480e6bfb3..d1974b2ee 100644 --- a/tests/v3/test_users.py +++ b/tests/v3/test_users.py @@ -39,7 +39,7 @@ class UserTests(utils.TestCase, utils.CrudTests): kwargs.setdefault('domain_id', uuid.uuid4().hex) kwargs.setdefault('enabled', True) kwargs.setdefault('name', uuid.uuid4().hex) - kwargs.setdefault('project_id', uuid.uuid4().hex) + kwargs.setdefault('default_project_id', uuid.uuid4().hex) return kwargs def test_add_user_to_group(self): @@ -131,3 +131,145 @@ class UserTests(utils.TestCase, utils.CrudTests): self.mox.ReplayAll() self.manager.remove_from_group(user=ref['id'], group=group_id) + + def test_create_with_project(self): + # Can create a user with the deprecated project option rather than + # default_project_id. + ref = self.new_ref() + resp = utils.TestResponse({ + "status_code": 201, + "text": self.serialize(ref), + }) + + method = 'POST' + req_ref = ref.copy() + req_ref.pop('id') + kwargs = copy.copy(self.TEST_REQUEST_BASE) + kwargs['headers'] = self.headers[method] + kwargs['data'] = self.serialize(req_ref) + requests.request( + method, + urlparse.urljoin( + self.TEST_URL, + 'v3/%s' % self.collection_key), + **kwargs).AndReturn((resp)) + self.mox.ReplayAll() + + param_ref = req_ref.copy() + # Use deprecated project_id rather than new default_project_id. + param_ref['project_id'] = param_ref.pop('default_project_id') + params = utils.parameterize(param_ref) + + returned = self.manager.create(**params) + self.assertTrue(isinstance(returned, self.model)) + for attr in ref: + self.assertEqual( + getattr(returned, attr), + ref[attr], + 'Expected different %s' % attr) + + def test_create_with_project_and_default_project(self): + # Can create a user with the deprecated project and default_project_id. + # The backend call should only pass the default_project_id. + ref = self.new_ref() + resp = utils.TestResponse({ + "status_code": 201, + "text": self.serialize(ref), + }) + + method = 'POST' + req_ref = ref.copy() + req_ref.pop('id') + kwargs = copy.copy(self.TEST_REQUEST_BASE) + kwargs['headers'] = self.headers[method] + kwargs['data'] = self.serialize(req_ref) + requests.request( + method, + urlparse.urljoin( + self.TEST_URL, + 'v3/%s' % self.collection_key), + **kwargs).AndReturn((resp)) + self.mox.ReplayAll() + + param_ref = req_ref.copy() + # Add the deprecated project_id in the call, the value will be ignored. + param_ref['project_id'] = 'project' + params = utils.parameterize(param_ref) + + returned = self.manager.create(**params) + self.assertTrue(isinstance(returned, self.model)) + for attr in ref: + self.assertEqual( + getattr(returned, attr), + ref[attr], + 'Expected different %s' % attr) + + def test_update_with_project(self): + # Can update a user with the deprecated project option rather than + # default_project_id. + ref = self.new_ref() + req_ref = ref.copy() + del req_ref['id'] + resp = utils.TestResponse({ + "status_code": 200, + "text": self.serialize(ref), + }) + + method = 'PATCH' + kwargs = copy.copy(self.TEST_REQUEST_BASE) + kwargs['headers'] = self.headers[method] + kwargs['data'] = self.serialize(req_ref) + requests.request( + method, + urlparse.urljoin( + self.TEST_URL, + 'v3/%s/%s' % (self.collection_key, ref['id'])), + **kwargs).AndReturn((resp)) + self.mox.ReplayAll() + + param_ref = req_ref.copy() + # Use deprecated project_id rather than new default_project_id. + param_ref['project_id'] = param_ref.pop('default_project_id') + params = utils.parameterize(param_ref) + + returned = self.manager.update(ref['id'], **params) + self.assertTrue(isinstance(returned, self.model)) + for attr in ref: + self.assertEqual( + getattr(returned, attr), + ref[attr], + 'Expected different %s' % attr) + + def test_update_with_project_and_default_project(self, ref=None): + ref = self.new_ref() + req_ref = ref.copy() + del req_ref['id'] + resp = utils.TestResponse({ + "status_code": 200, + "text": self.serialize(ref), + }) + + method = 'PATCH' + kwargs = copy.copy(self.TEST_REQUEST_BASE) + kwargs['headers'] = self.headers[method] + kwargs['data'] = self.serialize(req_ref) + requests.request( + method, + urlparse.urljoin( + self.TEST_URL, + 'v3/%s/%s' % (self.collection_key, ref['id'])), + **kwargs).AndReturn((resp)) + self.mox.ReplayAll() + + param_ref = req_ref.copy() + # Add the deprecated project_id in the call, the value will be ignored. + param_ref['project_id'] = 'project' + params = utils.parameterize(param_ref) + + returned = self.manager.update(ref['id'], **params) + self.assertTrue(isinstance(returned, self.model)) + for attr in ref: + self.assertEqual( + getattr(returned, attr), + ref[attr], + 'Expected different %s' % attr)