summaryrefslogtreecommitdiff
path: root/oslo_context
diff options
context:
space:
mode:
authorRonald Bradford <ronald.bradford@gmail.com>2016-02-01 17:10:03 +0000
committerRonald Bradford <ronald.bradford@gmail.com>2016-02-17 21:55:52 +0000
commit0327388695e57c297b145df96e907aa5188205d9 (patch)
treeeb6edf9d6105a9341f968caf7c694db6abc95691 /oslo_context
parent01aaeae060ce5fbc58672ed36f3346128623fcf1 (diff)
downloadoslo-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.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)