@@ -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
0 commit comments