From 448d7037332353ed2d2abf55e0d394b06250b135 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Thu, 24 Jun 2021 08:51:07 +0200 Subject: [PATCH] Explicitely request cluster version when connecting to etcd via proxy (#1974) Close https://github.com/zalando/patroni/issues/1971 --- patroni/dcs/etcd3.py | 3 +++ tests/test_etcd3.py | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) 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())