mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-09-01 09:09:21 +00:00
76 lines
1.7 KiB
Python
76 lines
1.7 KiB
Python
import abc
|
|
|
|
from collections import namedtuple
|
|
from helpers.utils import calculate_ttl
|
|
|
|
|
|
class DCSError(Exception):
|
|
|
|
def __init__(self, value):
|
|
self.value = value
|
|
|
|
def __str__(self):
|
|
return repr(self.value)
|
|
|
|
|
|
class Member(namedtuple('Member', 'index,name,conn_url,api_url,expiration,ttl')):
|
|
|
|
def real_ttl(self):
|
|
return calculate_ttl(self.expiration) or -1
|
|
|
|
|
|
class Cluster(namedtuple('Cluster', 'initialize,leader,last_leader_operation,members')):
|
|
|
|
def is_unlocked(self):
|
|
return not (self.leader and self.leader.name)
|
|
|
|
|
|
class AbstractDCS:
|
|
|
|
__metaclass__ = abc.ABCMeta
|
|
|
|
def __init__(self, config):
|
|
self._base_path = '/service/' + config['scope']
|
|
|
|
def client_path(self, path):
|
|
return self._base_path + path
|
|
|
|
@abc.abstractmethod
|
|
def get_cluster(self):
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def update_leader(self, state_handler):
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def attempt_to_acquire_leader(self, value):
|
|
raise NotImplementedError
|
|
|
|
def current_leader(self):
|
|
try:
|
|
cluster = self.get_cluster()
|
|
return None if cluster.is_unlocked() else cluster.leader
|
|
except DCSError:
|
|
return None
|
|
|
|
@abc.abstractmethod
|
|
def touch_member(self, member, connection_string, ttl=None):
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def take_leader(self, value):
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def race(self, path, value):
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def delete_member(self, member):
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def delete_leader(self, value):
|
|
raise NotImplementedError
|