mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-30 16:19:24 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f9acb6a55 | ||
|
|
f8b3703d6e |
+2
-2
@@ -300,8 +300,8 @@ class RestApiHandler(BaseHTTPRequestHandler):
|
|||||||
members = [m for m in cluster.members if m.name != cluster.leader.name and m.api_url]
|
members = [m for m in cluster.members if m.name != cluster.leader.name and m.api_url]
|
||||||
if not members:
|
if not members:
|
||||||
return 'failover is not possible: cluster does not have members except leader'
|
return 'failover is not possible: cluster does not have members except leader'
|
||||||
for _, reachable, _, _, tags in self.server.patroni.ha.fetch_nodes_statuses(members):
|
for st in self.server.patroni.ha.fetch_nodes_statuses(members):
|
||||||
if reachable and not tags.get('nofailover', False):
|
if st.failover_limitation() is None:
|
||||||
return None
|
return None
|
||||||
return 'failover is not possible: no good candidates have been found'
|
return 'failover is not possible: no good candidates have been found'
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class _MemberStatus(namedtuple('_MemberStatus', 'member,reachable,in_recovery,wa
|
|||||||
in_recovery - `!True` if pg_is_in_recovery() == true
|
in_recovery - `!True` if pg_is_in_recovery() == true
|
||||||
wal_position - value of `replayed_location` or `location` from JSON, dependin on its role.
|
wal_position - value of `replayed_location` or `location` from JSON, dependin on its role.
|
||||||
tags - dictionary with values of different tags (i.e. nofailover)
|
tags - dictionary with values of different tags (i.e. nofailover)
|
||||||
|
watchdog_failed - indicates that watchdog is required by configuration but not available or failed
|
||||||
"""
|
"""
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_api_response(cls, member, json):
|
def from_api_response(cls, member, json):
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
__version__ = '1.3'
|
__version__ = '1.3.1'
|
||||||
|
|||||||
+3
-2
@@ -6,6 +6,7 @@ import unittest
|
|||||||
from mock import Mock, patch
|
from mock import Mock, patch
|
||||||
from patroni.api import RestApiHandler, RestApiServer
|
from patroni.api import RestApiHandler, RestApiServer
|
||||||
from patroni.dcs import ClusterConfig, Member
|
from patroni.dcs import ClusterConfig, Member
|
||||||
|
from patroni.ha import _MemberStatus
|
||||||
from patroni.utils import tzutc
|
from patroni.utils import tzutc
|
||||||
from six import BytesIO as IO
|
from six import BytesIO as IO
|
||||||
from six.moves import BaseHTTPServer
|
from six.moves import BaseHTTPServer
|
||||||
@@ -38,7 +39,7 @@ class MockPostgresql(object):
|
|||||||
|
|
||||||
|
|
||||||
class MockWatchdog(object):
|
class MockWatchdog(object):
|
||||||
is_healthy = True
|
is_healthy = False
|
||||||
|
|
||||||
|
|
||||||
class MockHa(object):
|
class MockHa(object):
|
||||||
@@ -64,7 +65,7 @@ class MockHa(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def fetch_nodes_statuses(members):
|
def fetch_nodes_statuses(members):
|
||||||
return [[None, True, None, None, {}]]
|
return [_MemberStatus(None, True, None, None, {}, False)]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def schedule_future_restart(data):
|
def schedule_future_restart(data):
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ class TestWatchdog(unittest.TestCase):
|
|||||||
self.assertIsNone(wd.disable())
|
self.assertIsNone(wd.disable())
|
||||||
self.assertIsNone(wd.keepalive())
|
self.assertIsNone(wd.keepalive())
|
||||||
|
|
||||||
|
@patch('platform.system', Mock(return_value='Linux'))
|
||||||
def test_config_reload(self):
|
def test_config_reload(self):
|
||||||
watchdog = Watchdog({'ttl': 30, 'loop_wait': 15, 'watchdog': {'mode': 'required'}})
|
watchdog = Watchdog({'ttl': 30, 'loop_wait': 15, 'watchdog': {'mode': 'required'}})
|
||||||
self.assertTrue(watchdog.activate())
|
self.assertTrue(watchdog.activate())
|
||||||
|
|||||||
Reference in New Issue
Block a user