Merge "use the same context across a request"

This commit is contained in:
Jenkins 2016-05-11 22:34:14 +00:00 committed by Gerrit Code Review
commit 73269b6b8a
2 changed files with 42 additions and 5 deletions

View File

@ -28,7 +28,7 @@ import re
import sys
from oslo_config import cfg
from oslo_context import context
from oslo_context import context as oslo_context
try:
import oslo_messaging
messaging = True
@ -397,8 +397,8 @@ class AuditMiddleware(object):
def _process_request(self, request):
event = self._create_event(request)
self._emit_audit(context.get_admin_context().to_dict(),
'audit.http.request', event.as_dict())
self._emit_audit(request.context, 'audit.http.request',
event.as_dict())
@_log_and_ignore_error
def _process_response(self, request, response=None):
@ -424,14 +424,19 @@ class AuditMiddleware(object):
reporter=resource.Resource(id='target'),
reporterTime=timestamp.get_utc_now()))
self._emit_audit(context.get_admin_context().to_dict(),
'audit.http.response', event.as_dict())
self._emit_audit(request.context, 'audit.http.response',
event.as_dict())
@webob.dec.wsgify
def __call__(self, req):
if req.method in self._ignore_req_list:
return req.get_response(self._application)
# Cannot use a RequestClass on wsgify above because the `req` object is
# a `WebOb.Request` when this method is called so the RequestClass is
# ignored by the wsgify wrapper.
req.context = oslo_context.get_admin_context().to_dict()
self._process_request(req)
try:
response = req.get_response(self._application)

View File

@ -143,6 +143,7 @@ class AuditMiddlewareTest(BaseAuditMiddlewareTest):
def test_process_request_fail(self):
req = webob.Request.blank('/foo/bar',
environ=self.get_environ_header('GET'))
req.context = {}
with mock.patch('oslo_messaging.Notifier.info',
side_effect=Exception('error')) as notify:
self.middleware._process_request(req)
@ -151,6 +152,7 @@ class AuditMiddlewareTest(BaseAuditMiddlewareTest):
def test_process_response_fail(self):
req = webob.Request.blank('/foo/bar',
environ=self.get_environ_header('GET'))
req.context = {}
with mock.patch('oslo_messaging.Notifier.info',
side_effect=Exception('error')) as notify:
self.middleware._process_response(req, webob.response.Response())
@ -199,6 +201,25 @@ class AuditMiddlewareTest(BaseAuditMiddlewareTest):
self.assertEqual('audit.http.response',
call_args[1]['event_type'])
def test_cadf_event_context_scoped(self):
middleware = audit.AuditMiddleware(
FakeApp(),
audit_map_file=self.audit_map,
service_name='pycadf')
req = webob.Request.blank('/foo/bar',
environ=self.get_environ_header('GET'))
with mock.patch('oslo_messaging.Notifier.info') as notify:
middleware(req)
self.assertEqual(2, notify.call_count)
first, second = [a[0] for a in notify.call_args_list]
# the Context is the first argument. Let's verify it.
self.assertIsInstance(first[0], dict)
# ensure exact same context is used between request and response
self.assertIs(first[0], second[0])
def test_cadf_event_scoped_to_request(self):
middleware = audit.AuditMiddleware(
FakeApp(),
@ -221,12 +242,14 @@ class AuditMiddlewareTest(BaseAuditMiddlewareTest):
service_name='pycadf')
req = webob.Request.blank('/foo/bar',
environ=self.get_environ_header('GET'))
req.context = {}
with mock.patch('oslo_messaging.Notifier.info',
side_effect=Exception('error')) as notify:
middleware._process_request(req)
self.assertTrue(notify.called)
req2 = webob.Request.blank('/foo/bar',
environ=self.get_environ_header('GET'))
req2.context = {}
with mock.patch('oslo_messaging.Notifier.info') as notify:
middleware._process_response(req2, webob.response.Response())
self.assertTrue(notify.called)
@ -241,6 +264,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
def api_request(self, method, url):
req = webob.Request.blank(url, environ=self.get_environ_header(method),
remote_addr='192.168.0.1')
req.context = {}
self.middleware._process_request(req)
return req
@ -374,6 +398,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
environ=self.get_environ_header('POST'))
req.body = b'{"createImage" : {"name" : "new-image","metadata": ' \
b'{"ImageType": "Gold","ImageVersion": "2.0"}}}'
req.context = {}
self.middleware._process_request(req)
payload = req.environ['cadf_event'].as_dict()
self.assertEqual(payload['target']['typeURI'],
@ -417,6 +442,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
def test_response_mod_msg(self):
req = self.api_request('GET', 'http://admin_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers')
req.context = {}
payload = req.environ['cadf_event'].as_dict()
self.middleware._process_response(req, webob.Response())
payload2 = req.environ['cadf_event'].as_dict()
@ -433,6 +459,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
def test_no_response(self):
req = self.api_request('GET', 'http://admin_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers')
req.context = {}
payload = req.environ['cadf_event'].as_dict()
self.middleware._process_response(req, None)
payload2 = req.environ['cadf_event'].as_dict()
@ -449,6 +476,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
req = webob.Request.blank('http://admin_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers',
environ=self.get_environ_header('GET'))
req.context = {}
self.assertNotIn('cadf_event', req.environ)
self.middleware._process_response(req, webob.Response())
self.assertIn('cadf_event', req.environ)
@ -479,6 +507,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
req = webob.Request.blank('http://admin_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers',
environ=env_headers)
req.context = {}
self.middleware._process_request(req)
payload = req.environ['cadf_event'].as_dict()
self.assertEqual(payload['target']['id'], 'nova')
@ -502,6 +531,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
req = webob.Request.blank('http://admin_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers',
environ=env_headers)
req.context = {}
self.middleware._process_request(req)
payload = req.environ['cadf_event'].as_dict()
self.assertEqual((payload['target']['addresses'][1]['url']), "unknown")
@ -525,6 +555,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
req = webob.Request.blank('http://admin_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers',
environ=env_headers)
req.context = {}
self.middleware._process_request(req)
payload = req.environ['cadf_event'].as_dict()
self.assertEqual((payload['target']['addresses'][2]['url']), "unknown")
@ -548,6 +579,7 @@ class AuditApiLogicTest(BaseAuditMiddlewareTest):
req = webob.Request.blank('http://public_host:8774/v2/'
+ str(uuid.uuid4()) + '/servers',
environ=env_headers)
req.context = {}
self.middleware._process_request(req)
payload = req.environ['cadf_event'].as_dict()
self.assertEqual((payload['target']['addresses'][0]['url']), "unknown")