summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lower-constraints.txt2
-rw-r--r--requirements.txt2
-rw-r--r--swift/common/internal_client.py10
-rw-r--r--swift/common/wsgi.py9
-rw-r--r--test/unit/common/test_internal_client.py45
-rw-r--r--test/unit/common/test_wsgi.py62
6 files changed, 105 insertions, 25 deletions
diff --git a/lower-constraints.txt b/lower-constraints.txt
index 6437c5d7b..55336388e 100644
--- a/lower-constraints.txt
+++ b/lower-constraints.txt
@@ -48,7 +48,7 @@ oslo.i18n==3.20.0
oslo.log==3.22.0
oslo.serialization==2.25.0
oslo.utils==3.36.0
-PasteDeploy==1.3.3
+PasteDeploy==2.0.0
pbr==3.1.1
prettytable==0.7.2
pycparser==2.18
diff --git a/requirements.txt b/requirements.txt
index 223fc617b..3b74c3a87 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,7 +5,7 @@
eventlet>=0.25.0 # MIT
greenlet>=0.3.2
netifaces>=0.8,!=0.10.0,!=0.10.1
-PasteDeploy>=1.3.3
+PasteDeploy>=2.0.0
lxml>=3.4.1
requests>=2.14.2 # Apache-2.0
six>=1.10.0
diff --git a/swift/common/internal_client.py b/swift/common/internal_client.py
index bd9452ec5..c24693f48 100644
--- a/swift/common/internal_client.py
+++ b/swift/common/internal_client.py
@@ -145,14 +145,18 @@ class InternalClient(object):
:param user_agent: User agent to be sent to requests to Swift.
:param request_tries: Number of tries before InternalClient.make_request()
gives up.
+ :param global_conf: a dict of options to update the loaded proxy config.
+ Options in ``global_conf`` will override those in ``conf_path`` except
+ where the ``conf_path`` option is preceded by ``set``.
"""
def __init__(self, conf_path, user_agent, request_tries,
- allow_modify_pipeline=False, use_replication_network=False):
+ allow_modify_pipeline=False, use_replication_network=False,
+ global_conf=None):
if request_tries < 1:
raise ValueError('request_tries must be positive')
- self.app = loadapp(conf_path,
- allow_modify_pipeline=allow_modify_pipeline)
+ self.app = loadapp(conf_path, global_conf=global_conf,
+ allow_modify_pipeline=allow_modify_pipeline,)
self.user_agent = user_agent
self.request_tries = request_tries
self.use_replication_network = use_replication_network
diff --git a/swift/common/wsgi.py b/swift/common/wsgi.py
index 0f2528146..8e3a7a4af 100644
--- a/swift/common/wsgi.py
+++ b/swift/common/wsgi.py
@@ -386,6 +386,15 @@ def loadapp(conf_file, global_conf=None, allow_modify_pipeline=True):
"""
Loads a context from a config file, and if the context is a pipeline
then presents the app with the opportunity to modify the pipeline.
+
+ :param conf_file: path to a config file
+ :param global_conf: a dict of options to update the loaded config. Options
+ in ``global_conf`` will override those in ``conf_file`` except where
+ the ``conf_file`` option is preceded by ``set``.
+ :param allow_modify_pipeline: if True, and the context is a pipeline, and
+ the loaded app has a ``modify_wsgi_pipeline`` property, then that
+ property will be called before the pipeline is loaded.
+ :return: the loaded app
"""
global_conf = global_conf or {}
ctx = loadcontext(loadwsgi.APP, conf_file, global_conf=global_conf)
diff --git a/test/unit/common/test_internal_client.py b/test/unit/common/test_internal_client.py
index a3bc6c7a7..c25b1e7dd 100644
--- a/test/unit/common/test_internal_client.py
+++ b/test/unit/common/test_internal_client.py
@@ -282,47 +282,54 @@ class TestInternalClient(unittest.TestCase):
self.assertEqual(client.auto_create_account_prefix, '-')
def test_init(self):
- class App(object):
- def __init__(self, test, conf_path):
- self.test = test
- self.conf_path = conf_path
- self.load_called = 0
-
- def load(self, uri, allow_modify_pipeline=True):
- self.load_called += 1
- self.test.assertEqual(conf_path, uri)
- self.test.assertFalse(allow_modify_pipeline)
- return self
-
conf_path = 'some_path'
- app = App(self, conf_path)
+ app = object()
user_agent = 'some_user_agent'
request_tries = 123
- with mock.patch.object(internal_client, 'loadapp', app.load), \
+ with mock.patch.object(
+ internal_client, 'loadapp', return_value=app) as mock_loadapp,\
self.assertRaises(ValueError):
# First try with a bad arg
internal_client.InternalClient(
conf_path, user_agent, request_tries=0)
- self.assertEqual(0, app.load_called)
+ mock_loadapp.assert_not_called()
- with mock.patch.object(internal_client, 'loadapp', app.load):
+ with mock.patch.object(
+ internal_client, 'loadapp', return_value=app) as mock_loadapp:
client = internal_client.InternalClient(
conf_path, user_agent, request_tries)
- self.assertEqual(1, app.load_called)
+ mock_loadapp.assert_called_once_with(
+ conf_path, global_conf=None, allow_modify_pipeline=False)
self.assertEqual(app, client.app)
self.assertEqual(user_agent, client.user_agent)
self.assertEqual(request_tries, client.request_tries)
self.assertFalse(client.use_replication_network)
- with mock.patch.object(internal_client, 'loadapp', app.load):
+ with mock.patch.object(
+ internal_client, 'loadapp', return_value=app) as mock_loadapp:
client = internal_client.InternalClient(
conf_path, user_agent, request_tries,
use_replication_network=True)
- self.assertEqual(2, app.load_called)
+ mock_loadapp.assert_called_once_with(
+ conf_path, global_conf=None, allow_modify_pipeline=False)
+ self.assertEqual(app, client.app)
+ self.assertEqual(user_agent, client.user_agent)
+ self.assertEqual(request_tries, client.request_tries)
+ self.assertTrue(client.use_replication_network)
+
+ global_conf = {'log_name': 'custom'}
+ with mock.patch.object(
+ internal_client, 'loadapp', return_value=app) as mock_loadapp:
+ client = internal_client.InternalClient(
+ conf_path, user_agent, request_tries,
+ use_replication_network=True, global_conf=global_conf)
+
+ mock_loadapp.assert_called_once_with(
+ conf_path, global_conf=global_conf, allow_modify_pipeline=False)
self.assertEqual(app, client.app)
self.assertEqual(user_agent, client.user_agent)
self.assertEqual(request_tries, client.request_tries)
diff --git a/test/unit/common/test_wsgi.py b/test/unit/common/test_wsgi.py
index 35be5b03c..bf601570e 100644
--- a/test/unit/common/test_wsgi.py
+++ b/test/unit/common/test_wsgi.py
@@ -144,7 +144,67 @@ class TestWSGI(unittest.TestCase):
with open(conf_path, 'w') as f:
f.write(contents)
app = wsgi.loadapp(conf_path)
- self.assertTrue(isinstance(app, obj_server.ObjectController))
+ self.assertIsInstance(app, obj_server.ObjectController)
+
+ @with_tempdir
+ def test_loadapp_from_file_with_global_conf(self, tempdir):
+ # verify that global_conf items override conf file DEFAULTS...
+ conf_path = os.path.join(tempdir, 'object-server.conf')
+ conf_body = """
+ [DEFAULT]
+ log_name = swift
+ [app:main]
+ use = egg:swift#object
+ log_name = swift-main
+ """
+ contents = dedent(conf_body)
+ with open(conf_path, 'w') as f:
+ f.write(contents)
+ app = wsgi.loadapp(conf_path)
+ self.assertIsInstance(app, obj_server.ObjectController)
+ self.assertEqual('swift', app.logger.server)
+
+ app = wsgi.loadapp(conf_path, global_conf={'log_name': 'custom'})
+ self.assertIsInstance(app, obj_server.ObjectController)
+ self.assertEqual('custom', app.logger.server)
+
+ # and regular section options...
+ conf_path = os.path.join(tempdir, 'object-server.conf')
+ conf_body = """
+ [DEFAULT]
+ [app:main]
+ use = egg:swift#object
+ log_name = swift-main
+ """
+ contents = dedent(conf_body)
+ with open(conf_path, 'w') as f:
+ f.write(contents)
+ app = wsgi.loadapp(conf_path)
+ self.assertIsInstance(app, obj_server.ObjectController)
+ self.assertEqual('swift-main', app.logger.server)
+
+ app = wsgi.loadapp(conf_path, global_conf={'log_name': 'custom'})
+ self.assertIsInstance(app, obj_server.ObjectController)
+ self.assertEqual('custom', app.logger.server)
+
+ # ...but global_conf items do not override conf file 'set' options
+ conf_body = """
+ [DEFAULT]
+ log_name = swift
+ [app:main]
+ use = egg:swift#object
+ set log_name = swift-main
+ """
+ contents = dedent(conf_body)
+ with open(conf_path, 'w') as f:
+ f.write(contents)
+ app = wsgi.loadapp(conf_path)
+ self.assertIsInstance(app, obj_server.ObjectController)
+ self.assertEqual('swift-main', app.logger.server)
+
+ app = wsgi.loadapp(conf_path, global_conf={'log_name': 'custom'})
+ self.assertIsInstance(app, obj_server.ObjectController)
+ self.assertEqual('swift-main', app.logger.server)
def test_loadapp_from_string(self):
conf_body = """