diff --git a/helpers/etcd.py b/helpers/etcd.py index 966f881b..6da6a3bc 100644 --- a/helpers/etcd.py +++ b/helpers/etcd.py @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) Member = namedtuple('Member', 'hostname,address,ttl') -class Cluster(namedtuple('Cluster', 'leader,last_leader_operation,members')): +class Cluster(namedtuple('Cluster', 'initialize,leader,last_leader_operation,members')): def is_unlocked(self): return not (self.leader and self.leader.hostname) @@ -87,6 +87,8 @@ class Etcd: try: response, status_code = self.get_client_path('?recursive=true') if status_code == 200: + node = self.find_node(response['node'], '/initialize') + initialize = True if node else False # get list of members node = self.find_node(response['node'], '/members') or {'nodes': []} members = [Member(n['key'].split('/')[-1], n['value'], n.get('ttl', None)) for n in node['nodes']] @@ -110,9 +112,9 @@ class Etcd: if not leader: leader = Member(node['value'], None, None) - return Cluster(leader, last_leader_operation, members) + return Cluster(initialize, leader, last_leader_operation, members) elif status_code == 404: - return Cluster(None, None, []) + return Cluster(False, None, None, []) except: logger.exception('get_cluster') diff --git a/tests/test_ha.py b/tests/test_ha.py index c23244da..65d7bd6a 100644 --- a/tests/test_ha.py +++ b/tests/test_ha.py @@ -73,7 +73,7 @@ class TestHa(unittest.TestCase): self.e = Etcd({'ttl': 30, 'host': 'remotehost', 'scope': 'test'}) self.ha = Ha(self.p, self.e) self.ha.load_cluster_from_etcd() - self.ha.cluster = Cluster(None, None, []) + self.ha.cluster = Cluster(False, None, None, []) self.ha.load_cluster_from_etcd = nop def test_start_as_slave(self): diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index e0a21645..2e30b602 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -142,7 +142,7 @@ class TestPostgresql(unittest.TestCase): leader = Member('leader', 'postgres://replicator:rep-pass@127.0.0.1:5435/postgres', 28) me = Member('test0', 'postgres://replicator:rep-pass@127.0.0.1:5434/postgres', 28) other = Member('test1', 'postgres://replicator:rep-pass@127.0.0.1:5433/postgres', 28) - cluster = Cluster(leader, 0, [me, other, leader]) + cluster = Cluster(True, leader, 0, [me, other, leader]) self.assertTrue(self.p.is_healthiest_node(cluster)) self.p.is_leader = false self.assertFalse(self.p.is_healthiest_node(cluster))