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 dca856cb..9f87b96d 100644 --- a/tests/test_etcd.py +++ b/tests/test_etcd.py @@ -37,7 +37,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'): @@ -138,6 +141,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)