From a02f9d497f31573944cc7e6cb8d567c91ebd0fc4 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Wed, 24 Jun 2015 16:41:37 +0200 Subject: [PATCH] BUGFIX: it can be that /members request to etcd returns somesing strange with status_code 200 --- helpers/etcd.py | 10 ++++++++-- tests/test_etcd.py | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/helpers/etcd.py b/helpers/etcd.py index 495046f1..3385fbe6 100644 --- a/helpers/etcd.py +++ b/helpers/etcd.py @@ -121,11 +121,17 @@ class Client: response, status_code = self._get('/members') if status_code != 200: + self._base_uri = None raise EtcdError('Got response with code=%s from %s' % (status_code, self._base_uri)) members_cache = [] - for member in response if load_from_srv else response['members']: - members_cache.extend([m + '/' + self.API_VERSION for m in member['clientURLs']]) + try: + for member in response if load_from_srv else response['members']: + members_cache.extend([m + '/' + self.API_VERSION for m in member['clientURLs']]) + except: + self._base_uri = None + raise EtcdError('Got invalid response from %s: %s' % (self._base_uri, response)) + self._members_cache = list(set(members_cache)) random.shuffle(self._members_cache) if load_from_srv: diff --git a/tests/test_etcd.py b/tests/test_etcd.py index 09dac847..11cfbdb5 100644 --- a/tests/test_etcd.py +++ b/tests/test_etcd.py @@ -36,7 +36,10 @@ def requests_get(url, **kwargs): if url.startswith('http://error'): response.status_code = 404 elif url.endswith('/members'): - response.content = members + if url.startswith('http://error'): + response.content = '[{}]' + else: + response.content = members elif url.endswith('/bad_response'): response.content = '{' elif url.startswith('http://local'): @@ -134,6 +137,8 @@ class TestClient(unittest.TestCase): def test_load_members(self): self.client._base_uri = self.client._base_uri.replace('localhost', 'error_code') self.assertRaises(EtcdError, self.client.load_members) + self.client._base_uri = 'http://error_code:2380' + self.assertRaises(EtcdError, self.client.load_members) self.client._base_uri = None self.client._config = {} self.assertRaises(Exception, self.client.load_members)