diff --git a/patroni/dcs/etcd3.py b/patroni/dcs/etcd3.py index 51786676..4abb998b 100644 --- a/patroni/dcs/etcd3.py +++ b/patroni/dcs/etcd3.py @@ -262,6 +262,9 @@ class Etcd3Client(AbstractEtcdClientWithFailover): return self.api_execute(self.version_prefix + method, self._MPOST, fields) def authenticate(self): + if self._use_proxies and self._cluster_version is None: + kwargs = self._prepare_common_parameters(1) + self._ensure_version_prefix(self._base_uri, **kwargs) if self._cluster_version >= (3, 3) and self.username and self.password: logger.info('Trying to authenticate on Etcd...') old_token, self._token = self._token, None diff --git a/tests/test_etcd3.py b/tests/test_etcd3.py index abc593af..b0ae1d05 100644 --- a/tests/test_etcd3.py +++ b/tests/test_etcd3.py @@ -4,8 +4,9 @@ import unittest import urllib3 from mock import Mock, patch -from patroni.dcs.etcd3 import PatroniEtcd3Client, Cluster, Etcd3, Etcd3Error, Etcd3ClientError, RetryFailedError,\ - InvalidAuthToken, Unavailable, Unknown, UnsupportedEtcdVersion, UserEmpty, AuthFailed, base64_encode +from patroni.dcs.etcd import DnsCachingResolver +from patroni.dcs.etcd3 import PatroniEtcd3Client, Cluster, Etcd3Client, Etcd3Error, Etcd3ClientError, RetryFailedError,\ + InvalidAuthToken, Unavailable, Unknown, UnsupportedEtcdVersion, UserEmpty, AuthFailed, base64_encode, Etcd3 from threading import Thread from . import SleepException, MockResponse @@ -57,6 +58,16 @@ def mock_urlopen(self, method, url, **kwargs): return ret +class TestEtcd3Client(unittest.TestCase): + + @patch.object(Thread, 'start', Mock()) + @patch.object(urllib3.PoolManager, 'urlopen', mock_urlopen) + def test_authenticate(self): + etcd3 = Etcd3Client({'host': '127.0.0.1', 'port': 2379, 'use_proxies': True, 'retry_timeout': 10}, + DnsCachingResolver()) + self.assertIsNotNone(etcd3._cluster_version) + + class BaseTestEtcd3(unittest.TestCase): @patch.object(Thread, 'start', Mock())