From c69925436ecfde2e72f075243eb34ee18b4bc2c4 Mon Sep 17 00:00:00 2001 From: ZhiQiang Fan Date: Mon, 2 Feb 2015 18:29:09 +0800 Subject: [PATCH] use debug value for pecan_debug default Currently, we declare pecan_debug with default=CONF.debug, but which only gets debug's default value. If debug is set to True, then pecan_debug remains False. That is because declaration happens in import time, which is before configuration file parsed. There are two choices: 1. set pecan_debug default to False, and user needs to enable it explicitly 2. set pecan_debug default to None, and if it is not set, then use global debug value This patch chooses the second one. Note: users who enable global debug while running ceilometer-api under mod_wsgi with multiple processes need to disable pecan_debug explicitly after this patch is merged, since previously the pecan_debug will always be False if they don't configure it. ref: Ib4a472e3c8d1f34f64a5f3ab993c1211dee8af9a DocImpact Change-Id: I9436dbef2272f7b1de769dcb835365f8eb0feeca --- ceilometer/api/app.py | 6 +++--- ceilometer/tests/api/test_app.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ceilometer/api/app.py b/ceilometer/api/app.py index 2171d5efc..89857d608 100644 --- a/ceilometer/api/app.py +++ b/ceilometer/api/app.py @@ -43,9 +43,8 @@ OPTS = [ API_OPTS = [ cfg.BoolOpt('pecan_debug', - default=CONF.debug, help='Toggle Pecan Debug Middleware. ' - 'Defaults to global debug value.' + 'If it is not set, global debug value will be used.' ), ] @@ -76,6 +75,8 @@ def setup_app(pecan_config=None, extra_hooks=None): pecan.configuration.set_config(dict(pecan_config), overwrite=True) + cfg.set_defaults(API_OPTS, pecan_debug=CONF.debug) + app = pecan.make_app( pecan_config.app.root, debug=CONF.api.pecan_debug, @@ -91,7 +92,6 @@ def setup_app(pecan_config=None, extra_hooks=None): class VersionSelectorApplication(object): def __init__(self): pc = get_pecan_config() - pc.app.debug = CONF.api.pecan_debug def not_found(environ, start_response): start_response('404 Not Found', []) diff --git a/ceilometer/tests/api/test_app.py b/ceilometer/tests/api/test_app.py index 5daa60d84..b77926b53 100644 --- a/ceilometer/tests/api/test_app.py +++ b/ceilometer/tests/api/test_app.py @@ -49,3 +49,21 @@ class TestApp(base.BaseTestCase): with mock.patch.object(self.CONF, 'find_file') as ff: ff.return_value = None self.assertRaises(cfg.ConfigFilesNotFoundError, app.load_app) + + @mock.patch('ceilometer.storage.get_connection_from_config', + mock.MagicMock()) + @mock.patch('ceilometer.api.hooks.PipelineHook', mock.MagicMock()) + @mock.patch('pecan.make_app') + def test_pecan_debug(self, mocked): + def _check_pecan_debug(g_debug, p_debug, expected): + self.CONF.set_override('debug', g_debug) + if p_debug is not None: + self.CONF.set_override('pecan_debug', p_debug, group='api') + app.setup_app() + args, kwargs = mocked.call_args + self.assertEqual(expected, kwargs.get('debug')) + + _check_pecan_debug(g_debug=False, p_debug=None, expected=False) + _check_pecan_debug(g_debug=True, p_debug=None, expected=True) + _check_pecan_debug(g_debug=True, p_debug=False, expected=False) + _check_pecan_debug(g_debug=False, p_debug=True, expected=True)