From 2f168cb8021b61eba4035983e1be7ff3761be5b8 Mon Sep 17 00:00:00 2001 From: Alex Lutay <1928266+taurus-forever@users.noreply.github.com> Date: Sat, 20 Jun 2026 01:06:33 +0200 Subject: [PATCH] [DPE-10454] Use better status instead of blocked for transient update failures Use maintenance/waiting status instead of blocked one. The 'failed to update cluster members on member' BlockedStatus was misleading: these are transient, self-recovering conditions (a RetryError from update_config(), or a peer IP not yet published) rather than states needing operator intervention. Replace them with MaintenanceStatus / WaitingStatus and a 'pending update cluster members on member' message. Update test_on_peer_relation_changed accordingly, and set an explicit BlockedStatus before exercising the early-exit guard so that path stays covered. Assisted-by: Claude:claude-4.8-opus --- src/charm.py | 6 +++--- tests/unit/test_charm.py | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/charm.py b/src/charm.py index f9000f96be..74a215a8c2 100755 --- a/src/charm.py +++ b/src/charm.py @@ -1193,7 +1193,7 @@ def _on_peer_relation_changed(self, event: HookEvent): # Update the members of the cluster in the Patroni configuration on this unit. self.update_config() except RetryError: - self.set_unit_status(BlockedStatus("failed to update cluster members on member")) + self.set_unit_status(MaintenanceStatus("pending update cluster members on member")) return except ValueError as e: self.set_unit_status(BlockedStatus("Configuration Error. Please check the logs")) @@ -1412,9 +1412,9 @@ def add_cluster_member(self, member: str) -> None: try: self.update_config() except RetryError: - self.set_unit_status(BlockedStatus("failed to update cluster members on member")) + self.set_unit_status(MaintenanceStatus("pending update cluster members on member")) else: - self.set_unit_status(BlockedStatus("failed to update cluster members on member")) + self.set_unit_status(WaitingStatus("pending update cluster members on member")) def _get_unit_ip(self, unit: Unit, relation_name: str = PEER) -> str | None: """Get the IP address of a specific unit. diff --git a/tests/unit/test_charm.py b/tests/unit/test_charm.py index 5210a97d65..1d79f7cc15 100644 --- a/tests/unit/test_charm.py +++ b/tests/unit/test_charm.py @@ -2233,11 +2233,12 @@ def test_on_peer_relation_changed(harness): _update_config.assert_called_once() _start_patroni.assert_not_called() _update_new_unit_status.assert_not_called() - assert isinstance(harness.model.unit.status, BlockedStatus) + assert isinstance(harness.model.unit.status, MaintenanceStatus) # Test event is early exiting when in blocked status. _update_config.side_effect = None _member_started.return_value = False + harness.model.unit.status = BlockedStatus() harness.charm._on_peer_relation_changed(mock_event) _start_patroni.assert_not_called() @@ -2526,8 +2527,8 @@ def test_add_cluster_member(harness): _update_config.side_effect = RetryError(last_attempt=None) harness.charm.add_cluster_member("postgresql-0") _update_config.assert_called_once_with() - assert isinstance(harness.charm.unit.status, BlockedStatus) - assert harness.charm.unit.status.message == "failed to update cluster members on member" + assert isinstance(harness.charm.unit.status, MaintenanceStatus | WaitingStatus) + assert harness.charm.unit.status.message == "pending update cluster members on member" _update_config.reset_mock() # Not ready error if not all members are ready