Skip to content

Commit e809bbe

Browse files
committed
Merge branch 'refresh-v3' into parallel-restart-port
2 parents 69eb31c + 70cc32f commit e809bbe

File tree

6 files changed

+29
-15
lines changed

6 files changed

+29
-15
lines changed

.github/workflows/promote.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ on:
2424

2525
jobs:
2626
promote:
27-
name: Promote charm
28-
uses: canonical/data-platform-workflows/.github/workflows/_promote_charm.yaml@v35.0.2
27+
name: Promote charms
28+
uses: canonical/data-platform-workflows/.github/workflows/_promote_charms.yaml@v39.1.0
2929
with:
3030
track: '16'
3131
from-risk: ${{ inputs.from-risk }}

poetry.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ lightkube-models = "^1.28.1.4"
1919
psycopg2 = "^2.9.10"
2020
httpx = "^0.28.1"
2121
postgresql-charms-single-kernel = "16.1.3"
22-
charm-refresh = "^3.1.0.2"
22+
charm-refresh = "^3.1.1.2"
2323

2424
[tool.poetry.group.charm-libs.dependencies]
2525
# data_platform_libs/v0/data_interfaces.py

src/charm.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ def __init__(self, *args):
253253
self.framework.observe(self.on.promote_to_primary_action, self._on_promote_to_primary)
254254
self.framework.observe(self.on.get_primary_action, self._on_get_primary)
255255
self.framework.observe(self.on.update_status, self._on_update_status)
256+
# Do not use collect status events elsewhere—otherwise ops will prioritize statuses incorrectly
257+
# https://canonical-charm-refresh.readthedocs-hosted.com/latest/add-to-charm/status/#implementation
256258
self.framework.observe(self.on.collect_unit_status, self._reconcile_refresh_status)
257259
self.framework.observe(self.on.secret_remove, self._on_secret_remove)
258260

@@ -278,6 +280,7 @@ def __init__(self, *args):
278280
except ModelError:
279281
logger.exception("failed to open port")
280282

283+
self.can_set_app_status = True
281284
try:
282285
self.refresh = charm_refresh.Kubernetes(
283286
PostgreSQLRefresh(
@@ -287,8 +290,10 @@ def __init__(self, *args):
287290
_charm=self,
288291
)
289292
)
293+
except charm_refresh.KubernetesJujuAppNotTrusted:
294+
self.refresh = None
295+
self.can_set_app_status = False
290296
except (
291-
charm_refresh.KubernetesJujuAppNotTrusted,
292297
charm_refresh.PeerRelationNotReady,
293298
charm_refresh.UnitTearingDown,
294299
):
@@ -386,7 +391,9 @@ def _reconcile_refresh_status(self, _=None):
386391
new_refresh_unit_status = self.refresh.unit_status_higher_priority.message
387392
elif self.unit.status.message == last_refresh_unit_status:
388393
if self.refresh is not None and (
389-
refresh_status := self.refresh.unit_status_lower_priority()
394+
refresh_status := self.refresh.unit_status_lower_priority(
395+
workload_is_running=self._is_workload_running
396+
)
390397
):
391398
self.unit.status = refresh_status
392399
new_refresh_unit_status = refresh_status.message
@@ -396,7 +403,11 @@ def _reconcile_refresh_status(self, _=None):
396403
elif (
397404
isinstance(self.unit.status, ActiveStatus)
398405
and self.refresh is not None
399-
and (refresh_status := self.refresh.unit_status_lower_priority())
406+
and (
407+
refresh_status := self.refresh.unit_status_lower_priority(
408+
workload_is_running=self._is_workload_running
409+
)
410+
)
400411
):
401412
self.unit.status = refresh_status
402413
new_refresh_unit_status = refresh_status.message
@@ -1158,7 +1169,7 @@ def _on_postgresql_pebble_ready(self, event: WorkloadEvent) -> None:
11581169
# Safeguard against starting while refreshing.
11591170
if self.refresh is None:
11601171
logger.warning("Warning on_postgresql_pebble_ready: Refresh could be in progress")
1161-
elif self.refresh.in_progress:
1172+
elif self.refresh.in_progress and not self.refresh.next_unit_allowed_to_refresh:
11621173
logger.debug("Defer on_postgresql_pebble_ready: Refresh in progress")
11631174
event.defer()
11641175
return

src/refresh.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def is_compatible(
3131
old_workload_version: str,
3232
new_workload_version: str,
3333
) -> bool:
34-
"""Checks charm version compatibility."""
34+
"""Checks charm and workload version compatibility."""
3535
if not super().is_compatible(
3636
old_charm_version=old_charm_version,
3737
new_charm_version=new_charm_version,
@@ -51,9 +51,9 @@ def run_pre_refresh_checks_after_1_unit_refreshed(self) -> None:
5151
"""Implement pre-refresh checks after 1 unit refreshed."""
5252
logger.debug("Running pre-refresh checks")
5353
if not self._charm._patroni.are_all_members_ready():
54-
raise charm_refresh.PrecheckFailed("Not all members are ready yet.")
54+
raise charm_refresh.PrecheckFailed("PostgreSQL is not running on 1+ units")
5555
if self._charm._patroni.is_creating_backup:
56-
raise charm_refresh.PrecheckFailed("A backup is being created.")
56+
raise charm_refresh.PrecheckFailed("Backup in progress")
5757

5858
def run_pre_refresh_checks_before_any_units_refreshed(self) -> None:
5959
"""Implement pre-refresh checks before any unit refreshed."""
@@ -64,6 +64,7 @@ def run_pre_refresh_checks_before_any_units_refreshed(self) -> None:
6464
primary_unit_name = self._charm._patroni.get_primary(unit_name_pattern=True)
6565
unit_zero_name = f"{self._charm.app.name}/0"
6666
if primary_unit_name != unit_zero_name:
67-
raise charm_refresh.PrecheckFailed(
67+
logger.warning(
6868
f"Switch primary to {unit_zero_name} to avoid multiple switchovers during refresh."
6969
)
70+
raise charm_refresh.PrecheckFailed(f"Switch primary to {unit_zero_name}")

src/relations/async_replication.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,8 @@ def _remove_previous_cluster_information(self) -> None:
682682

683683
def set_app_status(self) -> None:
684684
"""Set the app status."""
685+
if not self.charm.can_set_app_status:
686+
return
685687
if self.charm.refresh is not None and self.charm.refresh.app_status_higher_priority:
686688
self.charm.app.status = self.charm.refresh.app_status_higher_priority
687689
return

0 commit comments

Comments
 (0)