Skip to content

Commit ed70e0e

Browse files
hughcapetavandras
authored andcommitted
Convert roles to enums (patroni#3303)
1 parent 07b81cd commit ed70e0e

File tree

17 files changed

+54
-36
lines changed

17 files changed

+54
-36
lines changed

patroni/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from .__main__ import Patroni
3131
from .dcs import Cluster
3232
from .exceptions import PostgresConnectionException, PostgresException
33-
from .postgresql.misc import postgres_version_to_int, PostgresqlState
33+
from .postgresql.misc import postgres_version_to_int, PostgresqlRole, PostgresqlState
3434
from .utils import cluster_as_json, deep_compare, enable_keepalive, parse_bool, \
3535
parse_int, patch_config, Retry, RetryFailedError, split_host_port, tzutc, uri
3636

@@ -323,7 +323,7 @@ def do_GET(self, write_status_code_only: bool = False) -> None:
323323
is_lagging = leader_optime and leader_optime > replayed_location + max_replica_lag
324324

325325
replica_status_code = 200 if not patroni.noloadbalance and not is_lagging and \
326-
response.get('role') == 'replica' and response.get('state') == PostgresqlState.RUNNING else 503
326+
response.get('role') == PostgresqlRole.REPLICA and response.get('state') == PostgresqlState.RUNNING else 503
327327

328328
if not cluster and response.get('pause'):
329329
leader_status_code = 200 if response.get('role') in (PostgresqlRole.PRIMARY,

patroni/ctl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
from .config import Config
6666
from .dcs import AbstractDCS, Cluster, get_dcs as _get_dcs, Member
6767
from .exceptions import PatroniException
68-
from .postgresql.misc import postgres_version_to_int, PostgresqlState
68+
from .postgresql.misc import postgres_version_to_int, PostgresqlRole, PostgresqlState
6969
from .postgresql.mpp import get_mpp
7070
from .request import PatroniRequest
7171
from .utils import cluster_as_json, patch_config, polling_loop

patroni/dcs/consul.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from urllib3.exceptions import HTTPError
2020

2121
from ..exceptions import DCSError
22-
from ..postgresql.misc import PostgresqlState
22+
from ..postgresql.misc import PostgresqlRole, PostgresqlState
2323
from ..postgresql.mpp import AbstractMPP
2424
from ..utils import deep_compare, parse_bool, Retry, RetryFailedError, split_host_port, uri, USER_AGENT
2525
from . import AbstractDCS, catch_return_false_exception, Cluster, ClusterConfig, \
@@ -552,7 +552,7 @@ def _update_service(self, data: Dict[str, Any]) -> Optional[bool]:
552552
return self.deregister_service(params['service_id'])
553553

554554
self._previous_loop_register_service = self._register_service
555-
if role in ['primary', 'replica', 'standby-leader']:
555+
if data['role'] in [PostgresqlRole.PRIMARY, PostgresqlRole.REPLICA, PostgresqlRole.STANDBY_LEADER]:
556556
if state != PostgresqlState.RUNNING:
557557
return
558558
return self.register_service(service_name, **params)

patroni/dcs/kubernetes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
from ..collections import EMPTY_DICT
2525
from ..exceptions import DCSError
26-
from ..postgresql.misc import PostgresqlState
26+
from ..postgresql.misc import PostgresqlRole, PostgresqlState
2727
from ..postgresql.mpp import AbstractMPP
2828
from ..utils import deep_compare, iter_response_objects, \
2929
keepalive_socket_options, Retry, RetryFailedError, tzutc, uri, USER_AGENT
@@ -1324,7 +1324,7 @@ def touch_member(self, data: Dict[str, Any]) -> bool:
13241324
role = self._standby_leader_label_value \
13251325
if data['role'] == PostgresqlRole.STANDBY_LEADER else self._leader_label_value
13261326
tmp_role = 'primary'
1327-
elif data['state'] == PostgresqlState.RUNNING and data['role'] != 'primary':
1327+
elif data['state'] == PostgresqlState.RUNNING and data['role'] != PostgresqlRole.PRIMARY:
13281328
role = {'replica': self._follower_label_value}.get(data['role'], data['role'])
13291329
tmp_role = data['role']
13301330
else:

patroni/ha.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from .dcs import AbstractDCS, Cluster, Leader, Member, RemoteMember, Status, SyncState
1818
from .exceptions import DCSError, PatroniFatalException, PostgresConnectionException
1919
from .postgresql.callback_executor import CallbackAction
20-
from .postgresql.misc import postgres_version_to_int, PostgresqlState
20+
from .postgresql.misc import postgres_version_to_int, PostgresqlRole, PostgresqlState
2121
from .postgresql.postmaster import PostmasterProcess
2222
from .postgresql.rewind import Rewind
2323
from .quorum import QuorumStateResolver
@@ -515,7 +515,7 @@ def touch_member(self) -> bool:
515515
ret = self.dcs.touch_member(data)
516516
if ret:
517517
new_state = (data['state'], data['role'])
518-
if self._last_state != new_state and new_state == (PostgresqlState.RUNNING, 'primary'):
518+
if self._last_state != new_state and new_state == (PostgresqlState.RUNNING, PostgresqlRole.PRIMARY):
519519
self.notify_mpp_coordinator('after_promote')
520520
self._last_state = new_state
521521
return ret
@@ -661,7 +661,7 @@ def recover(self) -> str:
661661
and data.get('Database cluster state') in ('in production', 'in crash recovery',
662662
'shutting down', 'shut down')\
663663
and self.state_handler.state == PostgresqlState.CRASHED\
664-
and self.state_handler.role == 'primary'\
664+
and self.state_handler.role == PostgresqlRole.PRIMARY\
665665
and not self.state_handler.config.recovery_conf_exists():
666666
# We know 100% that we were running as a primary a few moments ago, therefore could just start postgres
667667
msg = 'starting primary after failure'
@@ -1184,7 +1184,7 @@ def update_failsafe(self, data: Dict[str, Any]) -> Union[int, str, None]:
11841184
11851185
:returns: the reason why caller shouldn't continue as a primary or the current value of received/replayed LSN.
11861186
"""
1187-
if self.state_handler.state == PostgresqlState.RUNNING and self.state_handler.role == 'primary':
1187+
if self.state_handler.state == PostgresqlState.RUNNING and self.state_handler.role == PostgresqlRole.PRIMARY:
11881188
return 'Running as a leader'
11891189
self._failsafe.update(data)
11901190
return self._last_wal_lsn

patroni/postgresql/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from .cancellable import CancellableSubprocess
2929
from .config import ConfigHandler, mtime
3030
from .connection import ConnectionPool, get_connection_cursor
31-
from .misc import parse_history, parse_lsn, postgres_major_version_to_int, PostgresqlState
31+
from .misc import parse_history, parse_lsn, postgres_major_version_to_int, PostgresqlRole, PostgresqlState
3232
from .mpp import AbstractMPP
3333
from .postmaster import PostmasterProcess
3434
from .slots import SlotsHandler

patroni/postgresql/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ..utils import compare_values, get_postgres_version, is_subpath, \
2121
maybe_convert_from_base_unit, parse_bool, parse_int, split_host_port, uri, validate_directory
2222
from ..validator import EnumValidator, IntValidator
23-
from .misc import get_major_from_minor_version, postgres_version_to_int, PostgresqlState
23+
from .misc import get_major_from_minor_version, postgres_version_to_int, PostgresqlRole, PostgresqlState
2424
from .validator import recovery_parameters, transform_postgresql_parameter_value, transform_recovery_parameter_value
2525

2626
if TYPE_CHECKING: # pragma: no cover

patroni/postgresql/misc.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ def __repr__(self) -> str:
3434
return self.value
3535

3636

37+
class PostgresqlRole(str, Enum):
38+
"""Possible values of :attr:`Postgresql.role`."""
39+
40+
PRIMARY = 'primary'
41+
MASTER = 'master'
42+
STANDBY_LEADER = 'standby_leader'
43+
REPLICA = 'replica'
44+
DEMOTED = 'demoted'
45+
UNINITIALIZED = 'uninitialized'
46+
PROMOTED = 'promoted'
47+
48+
def __repr__(self) -> str:
49+
"""Get a string representation of a :class:`PostgresqlRole` member."""
50+
return self.value
51+
52+
3753
def postgres_version_to_int(pg_version: str) -> int:
3854
"""Convert the server_version to integer
3955

patroni/postgresql/mpp/citus.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from ...dcs import Cluster
1010
from ...psycopg import connect, ProgrammingError, quote_ident
1111
from ...utils import parse_int
12-
from ..misc import PostgresqlState
12+
from ..misc import PostgresqlRole, PostgresqlState
1313
from . import AbstractMPP, AbstractMPPHandler
1414

1515
if TYPE_CHECKING: # pragma: no cover
@@ -478,7 +478,7 @@ def sync_meta_data(self, cluster: Cluster) -> None:
478478
for groupid, worker in cluster.workers.items():
479479
leader = worker.leader
480480
if leader and leader.conn_url\
481-
and leader.data.get('role') in ('master', 'primary')\
481+
and leader.data.get('role') in (PostgresqlRole.MASTER, PostgresqlRole.PRIMARY)\
482482
and leader.data.get('state') == PostgresqlState.RUNNING:
483483
self.add_task('after_promote', groupid, worker, leader.name, leader.conn_url)
484484

tests/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from patroni.exceptions import PostgresConnectionException
1616
from patroni.ha import _MemberStatus
1717
from patroni.postgresql.config import get_param_diff
18-
from patroni.postgresql.misc import PostgresqlState
18+
from patroni.postgresql.misc import PostgresqlRole, PostgresqlState
1919
from patroni.psycopg import OperationalError
2020
from patroni.utils import RetryFailedError, tzutc
2121

@@ -51,7 +51,7 @@ class MockPostgresql:
5151
connection_pool = MockConnectionPool()
5252
name = 'test'
5353
state = PostgresqlState.RUNNING
54-
role = 'primary'
54+
role = PostgresqlRole.PRIMARY
5555
server_version = 90625
5656
major_version = 90600
5757
sysid = 'dummysysid'

0 commit comments

Comments
 (0)