Fix a bug with timeout BaseDriver argument provided via "_ex_connection_class_kwargs" getting accidentaly overriden with None.
Also add additional test cases. This issue was originally reported by Jay Rolette on the mailing list. Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/fd0a22fe Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/fd0a22fe Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/fd0a22fe Branch: refs/heads/ex_connection_class_kwargs_regression_fix Commit: fd0a22feab0e473591103020487fbbde33e973af Parents: 3ccd2e7 Author: Tomaz Muraus <[email protected]> Authored: Fri Apr 15 21:09:15 2016 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Fri Apr 15 21:10:02 2016 +0200 ---------------------------------------------------------------------- libcloud/common/base.py | 17 +++++++++++++---- libcloud/test/common/test_base_driver.py | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/fd0a22fe/libcloud/common/base.py ---------------------------------------------------------------------- diff --git a/libcloud/common/base.py b/libcloud/common/base.py index 0cdb257..5d4c3e9 100644 --- a/libcloud/common/base.py +++ b/libcloud/common/base.py @@ -1153,10 +1153,19 @@ class BaseDriver(object): self.region = region conn_kwargs = self._ex_connection_class_kwargs() - conn_kwargs.update({'timeout': kwargs.pop('timeout', None), - 'retry_delay': kwargs.pop('retry_delay', None), - 'backoff': kwargs.pop('backoff', None), - 'proxy_url': kwargs.pop('proxy_url', None)}) + + # Note: We do that to make sure those additional arguments which are + # provided via "_ex_connection_class_kwargs" are not overriden with + # None + additional_kwargs = ['timeout', 'retry_delay', 'backoff', 'proxy_url'] + for kwarg_name in additional_kwargs: + value = kwargs.pop(kwarg_name, None) + + # Constructor argument has precedence over + # _ex_connection_class_kwargs kwarg + if value is not None or kwarg_name not in conn_kwargs: + conn_kwargs[kwarg_name] = value + self.connection = self.connectionCls(*args, **conn_kwargs) self.connection.driver = self http://git-wip-us.apache.org/repos/asf/libcloud/blob/fd0a22fe/libcloud/test/common/test_base_driver.py ---------------------------------------------------------------------- diff --git a/libcloud/test/common/test_base_driver.py b/libcloud/test/common/test_base_driver.py index 37f15a1..6e04874 100644 --- a/libcloud/test/common/test_base_driver.py +++ b/libcloud/test/common/test_base_driver.py @@ -32,6 +32,7 @@ class BaseDriverTestCase(unittest.TestCase): DummyDriver1(key='foo') call_kwargs = DummyDriver1.connectionCls.call_args[1] self.assertEqual(call_kwargs['timeout'], None) + self.assertEqual(call_kwargs['retry_delay'], None) # 2. Timeout provided as constructor argument class DummyDriver1(BaseDriver): @@ -41,6 +42,7 @@ class BaseDriverTestCase(unittest.TestCase): DummyDriver1(key='foo', timeout=12) call_kwargs = DummyDriver1.connectionCls.call_args[1] self.assertEqual(call_kwargs['timeout'], 12) + self.assertEqual(call_kwargs['retry_delay'], None) # 3. timeout provided via "_ex_connection_class_kwargs" method class DummyDriver2(BaseDriver): @@ -50,9 +52,18 @@ class BaseDriverTestCase(unittest.TestCase): return result DummyDriver2.connectionCls = Mock() - DummyDriver1(key='foo') - call_kwargs = DummyDriver1.connectionCls.call_args[1] + DummyDriver2(key='foo') + call_kwargs = DummyDriver2.connectionCls.call_args[1] self.assertEqual(call_kwargs['timeout'], 13) + self.assertEqual(call_kwargs['retry_delay'], None) + + # 4. Value provided via "_ex_connection_class_kwargs" and constructor, + # constructor should win + DummyDriver2.connectionCls = Mock() + DummyDriver2(key='foo', timeout=14, retry_delay=10) + call_kwargs = DummyDriver2.connectionCls.call_args[1] + self.assertEqual(call_kwargs['timeout'], 14) + self.assertEqual(call_kwargs['retry_delay'], 10) if __name__ == '__main__':
