Fix context storage bug
Fix a bug with storing the request context in thread local where the storage was not properly cleared between requests. (This was causing the same request to always be logged.) Closes-Bug: 1384911 Change-Id: Ie30b93900451b0f9f6fd8158457b0b66903af470
This commit is contained in:
parent
ded0852cd0
commit
2652a3a528
|
@ -20,6 +20,7 @@ import webob.exc
|
||||||
from glance.api import policy
|
from glance.api import policy
|
||||||
from glance.common import wsgi
|
from glance.common import wsgi
|
||||||
import glance.context
|
import glance.context
|
||||||
|
from glance.openstack.common import local
|
||||||
import glance.openstack.common.log as logging
|
import glance.openstack.common.log as logging
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,6 +49,10 @@ class BaseContextMiddleware(wsgi.Middleware):
|
||||||
def process_response(self, resp):
|
def process_response(self, resp):
|
||||||
try:
|
try:
|
||||||
request_id = resp.request.context.request_id
|
request_id = resp.request.context.request_id
|
||||||
|
|
||||||
|
# NOTE(belliott) clear context stored in thread local
|
||||||
|
if hasattr(local.store, 'context'):
|
||||||
|
delattr(local.store, 'context')
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
LOG.warn(_('Unable to retrieve request id from context'))
|
LOG.warn(_('Unable to retrieve request id from context'))
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -82,6 +82,7 @@ class Server(object):
|
||||||
self.process_pid = None
|
self.process_pid = None
|
||||||
self.server_module = None
|
self.server_module = None
|
||||||
self.stop_kill = False
|
self.stop_kill = False
|
||||||
|
self.use_user_token = False
|
||||||
|
|
||||||
def write_conf(self, **kwargs):
|
def write_conf(self, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
@ -317,6 +318,7 @@ cert_file = %(cert_file)s
|
||||||
metadata_encryption_key = %(metadata_encryption_key)s
|
metadata_encryption_key = %(metadata_encryption_key)s
|
||||||
registry_host = 127.0.0.1
|
registry_host = 127.0.0.1
|
||||||
registry_port = %(registry_port)s
|
registry_port = %(registry_port)s
|
||||||
|
use_user_token = %(use_user_token)s
|
||||||
log_file = %(log_file)s
|
log_file = %(log_file)s
|
||||||
image_size_cap = %(image_size_cap)d
|
image_size_cap = %(image_size_cap)d
|
||||||
delayed_delete = %(delayed_delete)s
|
delayed_delete = %(delayed_delete)s
|
||||||
|
|
|
@ -1995,7 +1995,10 @@ class TestImages(functional.FunctionalTest):
|
||||||
self.cleanup()
|
self.cleanup()
|
||||||
self.api_server.deployment_flavor = 'fakeauth'
|
self.api_server.deployment_flavor = 'fakeauth'
|
||||||
self.registry_server.deployment_flavor = 'fakeauth'
|
self.registry_server.deployment_flavor = 'fakeauth'
|
||||||
self.start_servers(**self.__dict__.copy())
|
|
||||||
|
kwargs = self.__dict__.copy()
|
||||||
|
kwargs['use_user_token'] = True
|
||||||
|
self.start_servers(**kwargs)
|
||||||
|
|
||||||
owners = ['admin', 'tenant1', 'tenant2', 'none']
|
owners = ['admin', 'tenant1', 'tenant2', 'none']
|
||||||
visibilities = ['public', 'private']
|
visibilities = ['public', 'private']
|
||||||
|
|
|
@ -23,6 +23,7 @@ from oslo.config import cfg
|
||||||
from oslo.db import options
|
from oslo.db import options
|
||||||
from oslo.serialization import jsonutils
|
from oslo.serialization import jsonutils
|
||||||
|
|
||||||
|
from glance.openstack.common import local
|
||||||
from glance.tests import stubs
|
from glance.tests import stubs
|
||||||
from glance.tests import utils as test_utils
|
from glance.tests import utils as test_utils
|
||||||
|
|
||||||
|
@ -79,6 +80,10 @@ class IsolatedUnitTest(StoreClearingUnitTest):
|
||||||
self.test_dir,
|
self.test_dir,
|
||||||
registry=self.registry)
|
registry=self.registry)
|
||||||
|
|
||||||
|
# clear context left-over from any previous test executions
|
||||||
|
if hasattr(local.store, 'context'):
|
||||||
|
delattr(local.store, 'context')
|
||||||
|
|
||||||
def _copy_data_file(self, file_name, dst_dir):
|
def _copy_data_file(self, file_name, dst_dir):
|
||||||
src_file_name = os.path.join('glance/tests/etc', file_name)
|
src_file_name = os.path.join('glance/tests/etc', file_name)
|
||||||
shutil.copy(src_file_name, dst_dir)
|
shutil.copy(src_file_name, dst_dir)
|
||||||
|
|
|
@ -16,6 +16,7 @@ import webob
|
||||||
|
|
||||||
from glance.api.middleware import context
|
from glance.api.middleware import context
|
||||||
import glance.context
|
import glance.context
|
||||||
|
from glance.openstack.common import local
|
||||||
from glance.tests.unit import base
|
from glance.tests.unit import base
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,6 +119,23 @@ class TestContextMiddleware(base.IsolatedUnitTest):
|
||||||
self.assertRaises(webob.exc.HTTPInternalServerError,
|
self.assertRaises(webob.exc.HTTPInternalServerError,
|
||||||
middleware.process_request, req)
|
middleware.process_request, req)
|
||||||
|
|
||||||
|
def test_clear_context(self):
|
||||||
|
# context should be cleared between requests
|
||||||
|
middleware = self._build_middleware()
|
||||||
|
|
||||||
|
req = self._build_request()
|
||||||
|
middleware.process_request(req)
|
||||||
|
|
||||||
|
self.assertTrue(hasattr(local.store, 'context'))
|
||||||
|
|
||||||
|
# response processing should clear reference to
|
||||||
|
# the context
|
||||||
|
resp = webob.Response()
|
||||||
|
resp.request = req
|
||||||
|
resp = middleware.process_response(resp)
|
||||||
|
|
||||||
|
self.assertFalse(hasattr(local.store, 'context'))
|
||||||
|
|
||||||
|
|
||||||
class TestUnauthenticatedContextMiddleware(base.IsolatedUnitTest):
|
class TestUnauthenticatedContextMiddleware(base.IsolatedUnitTest):
|
||||||
def test_request(self):
|
def test_request(self):
|
||||||
|
@ -134,8 +152,10 @@ class TestUnauthenticatedContextMiddleware(base.IsolatedUnitTest):
|
||||||
middleware = context.UnauthenticatedContextMiddleware(None)
|
middleware = context.UnauthenticatedContextMiddleware(None)
|
||||||
req = webob.Request.blank('/')
|
req = webob.Request.blank('/')
|
||||||
req.context = glance.context.RequestContext()
|
req.context = glance.context.RequestContext()
|
||||||
|
request_id = req.context.request_id
|
||||||
|
|
||||||
resp = webob.Response()
|
resp = webob.Response()
|
||||||
resp.request = req
|
resp.request = req
|
||||||
middleware.process_response(resp)
|
middleware.process_response(resp)
|
||||||
self.assertEqual(resp.headers['x-openstack-request-id'],
|
self.assertEqual(resp.headers['x-openstack-request-id'],
|
||||||
'req-%s' % req.context.request_id)
|
'req-%s' % request_id)
|
||||||
|
|
Loading…
Reference in New Issue