summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-02-18 18:33:34 +0000
committerGerrit Code Review <review@openstack.org>2016-02-18 18:33:34 +0000
commitce60425d580a0e54b197367116a9926fa0712e89 (patch)
tree166bbbad36e0cf3927ff96bcc754909f9a3f757c
parent9e9a892e3acc0dd2abe97f5d15a2c37d9b5941b8 (diff)
parent0327388695e57c297b145df96e907aa5188205d9 (diff)
downloadoslo-context-2.1.0.tar.gz
Merge "Agnostic approach to construct context from_dict"2.1.0
-rw-r--r--oslo_context/context.py20
-rw-r--r--oslo_context/tests/test_context.py17
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)