Use context.from_dict to determine available arguments

RequestContext.__init__ takes and ignores arbitrary keyword arguments.
This leads to mistakes such as those changed in tests and will prevent
cinder from passing those keyword arguments to the base oslo_context
class.

The ignored arguments are generally made up of things that oslo_context
added to the to_dict that cinder doesn't handle. Instead of accepting
and ignoring those arguments make from_dict smart enough to construct
the correct arguments to the class.

Related-Bug: #1602081
Change-Id: Iaf37e38ddc368a6f504bab17163d7f0ba21f5029
This commit is contained in:
Jamie Lennox 2016-07-11 09:28:26 +10:00
parent a76f4a1b94
commit 842d95bb68
3 changed files with 18 additions and 8 deletions

View File

@ -53,8 +53,7 @@ class RequestContext(context.RequestContext):
roles=None, project_name=None, remote_address=None,
timestamp=None, request_id=None, auth_token=None,
overwrite=True, quota_class=None, service_catalog=None,
domain=None, user_domain=None, project_domain=None,
**kwargs):
domain=None, user_domain=None, project_domain=None):
"""Initialize RequestContext.
:param read_deleted: 'no' indicates deleted records are hidden, 'yes'
@ -63,9 +62,6 @@ class RequestContext(context.RequestContext):
:param overwrite: Set to False to ensure that the greenthread local
copy of the index is not overwritten.
:param kwargs: Extra arguments that might be present, but we ignore
because they possibly came in from older rpc messages.
"""
super(RequestContext, self).__init__(auth_token=auth_token,
@ -137,7 +133,21 @@ class RequestContext(context.RequestContext):
@classmethod
def from_dict(cls, values):
return cls(**values)
return cls(user_id=values.get('user_id'),
project_id=values.get('project_id'),
project_name=values.get('project_name'),
domain=values.get('domain'),
read_deleted=values.get('read_deleted'),
remote_address=values.get('remote_address'),
timestamp=values.get('timestamp'),
quota_class=values.get('quota_class'),
service_catalog=values.get('service_catalog'),
request_id=values.get('request_id'),
is_admin=values.get('is_admin'),
roles=values.get('roles'),
auth_token=values.get('auth_token'),
user_domain=values.get('user_domain'),
project_domain=values.get('project_domain'))
def elevated(self, read_deleted=None, overwrite=False):
"""Return a version of this context with admin flag set."""

View File

@ -40,7 +40,7 @@ class VolumeTransferAPITestCase(test.TestCase):
self.volume_transfer_api = cinder.transfer.API()
self.controller = volume_transfer.VolumeTransferController()
self.user_ctxt = context.RequestContext(
fake.USER_ID, fake.PROJECT_ID, auth_token=True, admin=True)
fake.USER_ID, fake.PROJECT_ID, auth_token=True, is_admin=True)
def _create_transfer(self, volume_id=fake.VOLUME_ID,
display_name='test_transfer'):

View File

@ -58,7 +58,7 @@ class ContextTestCase(test.TestCase):
def test_request_context_elevated(self):
user_context = context.RequestContext(
'fake_user', 'fake_project', admin=False)
'fake_user', 'fake_project', is_admin=False)
self.assertFalse(user_context.is_admin)
admin_context = user_context.elevated()
self.assertFalse(user_context.is_admin)