diff options
author | Jenkins <jenkins@review.openstack.org> | 2016-02-18 18:33:34 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2016-02-18 18:33:34 +0000 |
commit | ce60425d580a0e54b197367116a9926fa0712e89 (patch) | |
tree | 166bbbad36e0cf3927ff96bcc754909f9a3f757c | |
parent | 9e9a892e3acc0dd2abe97f5d15a2c37d9b5941b8 (diff) | |
parent | 0327388695e57c297b145df96e907aa5188205d9 (diff) | |
download | oslo-context-ce60425d580a0e54b197367116a9926fa0712e89.tar.gz |
Merge "Agnostic approach to construct context from_dict"2.1.0
-rw-r--r-- | oslo_context/context.py | 20 | ||||
-rw-r--r-- | oslo_context/tests/test_context.py | 17 |
2 files changed, 24 insertions, 13 deletions
diff --git a/oslo_context/context.py b/oslo_context/context.py index 0458174..bd1a6c4 100644 --- a/oslo_context/context.py +++ b/oslo_context/context.py @@ -26,6 +26,7 @@ context or provide additional information in their specific WSGI pipeline or logging context. """ +import inspect import itertools import threading import uuid @@ -114,20 +115,13 @@ class RequestContext(object): return values @classmethod - def from_dict(cls, ctx): + def from_dict(cls, values): """Construct a context object from a provided dictionary.""" - return cls( - auth_token=ctx.get("auth_token"), - user=ctx.get("user"), - tenant=ctx.get("tenant"), - domain=ctx.get("domain"), - user_domain=ctx.get("user_domain"), - project_domain=ctx.get("project_domain"), - is_admin=ctx.get("is_admin", False), - read_only=ctx.get("read_only", False), - show_deleted=ctx.get("show_deleted", False), - request_id=ctx.get("request_id"), - resource_uuid=ctx.get("resource_uuid")) + allowed = [arg for arg in + inspect.getargspec(RequestContext.__init__).args + if arg != 'self'] + kwargs = {k: v for (k, v) in values.items() if k in allowed} + return cls(**kwargs) @classmethod def from_environ(cls, environ, **kwargs): diff --git a/oslo_context/tests/test_context.py b/oslo_context/tests/test_context.py index 406e480..4555da3 100644 --- a/oslo_context/tests/test_context.py +++ b/oslo_context/tests/test_context.py @@ -104,6 +104,23 @@ class ContextTest(test_base.BaseTestCase): self.assertEqual("request1", ctx.request_id) self.assertEqual("instance1", ctx.resource_uuid) + def test_from_dict_unknown_keys(self): + dct = { + "auth_token": "token1", + "user": "user1", + "read_only": True, + "roles": "role1,role2,role3", # future review provides this + "color": "red", + "unknown": "" + } + ctx = context.RequestContext.from_dict(dct) + self.assertEqual("token1", ctx.auth_token) + self.assertEqual("user1", ctx.user) + self.assertIsNone(ctx.tenant) + self.assertFalse(ctx.is_admin) + self.assertTrue(ctx.read_only) + self.assertRaises(KeyError, lambda: ctx.__dict__['color']) + def test_is_user_context(self): self.assertFalse(context.is_user_context(None)) ctx = context.RequestContext(is_admin=True) |