diff options
author | Ronald Bradford <ronald.bradford@gmail.com> | 2016-02-01 17:10:03 +0000 |
---|---|---|
committer | Ronald Bradford <ronald.bradford@gmail.com> | 2016-02-17 21:55:52 +0000 |
commit | 0327388695e57c297b145df96e907aa5188205d9 (patch) | |
tree | eb6edf9d6105a9341f968caf7c694db6abc95691 /oslo_context | |
parent | 01aaeae060ce5fbc58672ed36f3346128623fcf1 (diff) | |
download | oslo-context-0327388695e57c297b145df96e907aa5188205d9.tar.gz |
Agnostic approach to construct context from_dict
Replace the existing argument specified values in from_dict() method
to be argument agnostic for any future arguments. Based from version
found in Solum.
All current boolean values match instantiation defaults.
Change-Id: I17c76881aa662de7ff245b3f6bfca309896ddf24
Diffstat (limited to 'oslo_context')
-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) |