diff --git a/patroni/__init__.py b/patroni/__init__.py index 5769a8fc..78d8e619 100644 --- a/patroni/__init__.py +++ b/patroni/__init__.py @@ -26,6 +26,10 @@ class Patroni: self.ha = Ha(self) self.next_run = time.time() + @property + def nofailover(self): + return self.tags.get('nofailover') + @staticmethod def get_dcs(name, config): if 'etcd' in config: diff --git a/patroni/dcs.py b/patroni/dcs.py index 25e44cd1..b1ed5169 100644 --- a/patroni/dcs.py +++ b/patroni/dcs.py @@ -63,6 +63,10 @@ class Member(namedtuple('Member', 'index,name,session,data')): def api_url(self): return self.data.get('api_url', None) + @property + def nofailover(self): + return self.data.get('tags', {}).get('nofailover') + class Leader(namedtuple('Leader', 'index,session,member')): diff --git a/patroni/ha.py b/patroni/ha.py index 7a632673..cb2d8a5d 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -169,15 +169,14 @@ class Ha: if self.state_handler.is_leader(): return True - if self.patroni.tags.get('nofailover') is True: + if self.patroni.nofailover is True: return False if check_replication_lag and not self.state_handler.check_replication_lag(self.cluster.last_leader_operation): return False # Too far behind last reported xlog location on master # Prepare list of nodes to run check against - members = [m for m in members if m.name != self.state_handler.name - and not m.data.get('tags', {}).get('nofailover', None) and m.api_url] + members = [m for m in members if m.name != self.state_handler.name and not m.nofailover and m.api_url] if members: my_xlog_location = self.state_handler.xlog_position() @@ -192,7 +191,7 @@ class Ha: def is_failover_possible(self, members): ret = False - members = [m for m in members if m.name != self.state_handler.name and m.api_url] + members = [m for m in members if m.name != self.state_handler.name and not m.nofailover and m.api_url] if members: for member, reachable, in_recovery, xlog_location, tags in self.fetch_nodes_statuses(members): if reachable and not tags.get('nofailover'): diff --git a/tests/test_ha.py b/tests/test_ha.py index 32248c61..8079fbd0 100644 --- a/tests/test_ha.py +++ b/tests/test_ha.py @@ -83,6 +83,7 @@ class MockPatroni: self.dcs = d self.api = Mock() self.tags = {} + self.nofailover = None self.api.connection_string = 'http://127.0.0.1:8008'