diff --git a/patroni/dcs/__init__.py b/patroni/dcs/__init__.py index a61c6b59..2f270dc0 100644 --- a/patroni/dcs/__init__.py +++ b/patroni/dcs/__init__.py @@ -239,23 +239,26 @@ class Member(NamedTuple): class RemoteMember(Member): - """Represents a remote member (typically a primary) for a standby cluster""" + """Represents a remote member (typically a primary) for a standby cluster. + + :cvar ALLOWED_KEYS: Controls access to relevant key names that could be in stored :attr:`~RemoteMember.data`. + """ + + ALLOWED_KEYS: Tuple[str, ...] = ( + 'primary_slot_name', + 'create_replica_methods', + 'restore_command', + 'archive_cleanup_command', + 'recovery_min_apply_delay', + 'no_replication_slot' + ) @classmethod def from_name_and_data(cls, name: str, data: Dict[str, Any]) -> 'RemoteMember': return super(RemoteMember, cls).__new__(cls, -1, name, None, data) - @staticmethod - def allowed_keys() -> Tuple[str, ...]: - return ('primary_slot_name', - 'create_replica_methods', - 'restore_command', - 'archive_cleanup_command', - 'recovery_min_apply_delay', - 'no_replication_slot') - def __getattr__(self, name: str) -> Any: - if name in RemoteMember.allowed_keys(): + if name in RemoteMember.ALLOWED_KEYS: return self.data.get(name) diff --git a/patroni/ha.py b/patroni/ha.py index c55b327b..5f5de4fa 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -1896,7 +1896,7 @@ class Ha(object): cluster_params = self.global_config.get_standby_cluster_config() if cluster_params: - data.update({k: v for k, v in cluster_params.items() if k in RemoteMember.allowed_keys()}) + data.update({k: v for k, v in cluster_params.items() if k in RemoteMember.ALLOWED_KEYS}) data['no_replication_slot'] = 'primary_slot_name' not in cluster_params conn_kwargs = member.conn_kwargs() if member else \ {k: cluster_params[k] for k in ('host', 'port') if k in cluster_params}