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
This commit is contained in:
@@ -14,9 +14,14 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
from keystoneclient import base
|
from keystoneclient import base
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class User(base.Resource):
|
class User(base.Resource):
|
||||||
"""Represents an Identity user.
|
"""Represents an Identity user.
|
||||||
|
|
||||||
@@ -39,17 +44,32 @@ class UserManager(base.CrudManager):
|
|||||||
raise exceptions.ValidationError(msg)
|
raise exceptions.ValidationError(msg)
|
||||||
|
|
||||||
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):
|
||||||
|
"""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(
|
return super(UserManager, self).create(
|
||||||
name=name,
|
name=name,
|
||||||
domain_id=base.getid(domain),
|
domain_id=base.getid(domain),
|
||||||
project_id=base.getid(project),
|
default_project_id=default_project_id,
|
||||||
password=password,
|
password=password,
|
||||||
email=email,
|
email=email,
|
||||||
description=description,
|
description=description,
|
||||||
enabled=enabled)
|
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.
|
"""List users.
|
||||||
|
|
||||||
If project, domain or group are provided, then filter
|
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
|
If ``**kwargs`` are provided, then filter users with
|
||||||
attributes matching ``**kwargs``.
|
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:
|
if group:
|
||||||
base_url = '/groups/%s' % base.getid(group)
|
base_url = '/groups/%s' % base.getid(group)
|
||||||
else:
|
else:
|
||||||
@@ -66,7 +97,7 @@ class UserManager(base.CrudManager):
|
|||||||
return super(UserManager, self).list(
|
return super(UserManager, self).list(
|
||||||
base_url=base_url,
|
base_url=base_url,
|
||||||
domain_id=base.getid(domain),
|
domain_id=base.getid(domain),
|
||||||
project_id=base.getid(project),
|
default_project_id=default_project_id,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
|
|
||||||
def get(self, user):
|
def get(self, user):
|
||||||
@@ -74,12 +105,26 @@ class UserManager(base.CrudManager):
|
|||||||
user_id=base.getid(user))
|
user_id=base.getid(user))
|
||||||
|
|
||||||
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):
|
||||||
|
"""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(
|
return super(UserManager, self).update(
|
||||||
user_id=base.getid(user),
|
user_id=base.getid(user),
|
||||||
name=name,
|
name=name,
|
||||||
domain_id=base.getid(domain),
|
domain_id=base.getid(domain),
|
||||||
project_id=base.getid(project),
|
default_project_id=default_project_id,
|
||||||
password=password,
|
password=password,
|
||||||
email=email,
|
email=email,
|
||||||
description=description,
|
description=description,
|
||||||
|
@@ -39,7 +39,7 @@ class UserTests(utils.TestCase, utils.CrudTests):
|
|||||||
kwargs.setdefault('domain_id', uuid.uuid4().hex)
|
kwargs.setdefault('domain_id', uuid.uuid4().hex)
|
||||||
kwargs.setdefault('enabled', True)
|
kwargs.setdefault('enabled', True)
|
||||||
kwargs.setdefault('name', uuid.uuid4().hex)
|
kwargs.setdefault('name', uuid.uuid4().hex)
|
||||||
kwargs.setdefault('project_id', uuid.uuid4().hex)
|
kwargs.setdefault('default_project_id', uuid.uuid4().hex)
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
def test_add_user_to_group(self):
|
def test_add_user_to_group(self):
|
||||||
@@ -131,3 +131,145 @@ class UserTests(utils.TestCase, utils.CrudTests):
|
|||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
self.manager.remove_from_group(user=ref['id'], group=group_id)
|
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)
|
||||||
|
Reference in New Issue
Block a user