@@ -1688,7 +1688,41 @@ def _setup_ldap_sync(self, postgres_snap: snap.Snap | None = None) -> None:
1688
1688
logger .debug ("Starting LDAP sync service" )
1689
1689
postgres_snap .restart (services = ["ldap-sync" ])
1690
1690
1691
- def _start_primary (self , event : StartEvent ) -> None : # noqa: C901
1691
+ def _setup_users (self ) -> None :
1692
+ self .postgresql .create_predefined_instance_roles ()
1693
+
1694
+ # Create the default postgres database user that is needed for some
1695
+ # applications (not charms) like Landscape Server.
1696
+
1697
+ # This event can be run on a replica if the machines are restarted.
1698
+ # For that case, check whether the postgres user already exits.
1699
+ users = self .postgresql .list_users ()
1700
+ # Create the backup user.
1701
+ if BACKUP_USER not in users :
1702
+ self .postgresql .create_user (
1703
+ BACKUP_USER , new_password (), extra_user_roles = [ROLE_BACKUP ]
1704
+ )
1705
+ self .postgresql .grant_database_privileges_to_user (BACKUP_USER , "postgres" , ["connect" ])
1706
+ if MONITORING_USER not in users :
1707
+ # Create the monitoring user.
1708
+ self .postgresql .create_user (
1709
+ MONITORING_USER ,
1710
+ self .get_secret (APP_SCOPE , MONITORING_PASSWORD_KEY ),
1711
+ extra_user_roles = [ROLE_STATS ],
1712
+ )
1713
+
1714
+ self .postgresql .set_up_database (
1715
+ temp_location = "/var/snap/charmed-postgresql/common/data/temp"
1716
+ )
1717
+
1718
+ access_groups = self .postgresql .list_access_groups ()
1719
+ if access_groups != set (ACCESS_GROUPS ):
1720
+ self .postgresql .create_access_groups ()
1721
+ self .postgresql .grant_internal_access_group_memberships ()
1722
+
1723
+ self .postgresql_client_relation .oversee_users ()
1724
+
1725
+ def _start_primary (self , event : StartEvent ) -> None :
1692
1726
"""Bootstrap the cluster."""
1693
1727
# Set some information needed by Patroni to bootstrap the cluster.
1694
1728
if not self ._patroni .bootstrap_cluster ():
@@ -1715,33 +1749,11 @@ def _start_primary(self, event: StartEvent) -> None: # noqa: C901
1715
1749
return
1716
1750
1717
1751
try :
1718
- self .postgresql . create_predefined_instance_roles ()
1752
+ self ._setup_users ()
1719
1753
except PostgreSQLCreatePredefinedRolesError as e :
1720
1754
logger .exception (e )
1721
1755
self .unit .status = BlockedStatus ("Failed to create pre-defined roles" )
1722
1756
return
1723
-
1724
- # Create the default postgres database user that is needed for some
1725
- # applications (not charms) like Landscape Server.
1726
- try :
1727
- # This event can be run on a replica if the machines are restarted.
1728
- # For that case, check whether the postgres user already exits.
1729
- users = self .postgresql .list_users ()
1730
- # Create the backup user.
1731
- if BACKUP_USER not in users :
1732
- self .postgresql .create_user (
1733
- BACKUP_USER , new_password (), extra_user_roles = [ROLE_BACKUP ]
1734
- )
1735
- self .postgresql .grant_database_privileges_to_user (
1736
- BACKUP_USER , "postgres" , ["connect" ]
1737
- )
1738
- if MONITORING_USER not in users :
1739
- # Create the monitoring user.
1740
- self .postgresql .create_user (
1741
- MONITORING_USER ,
1742
- self .get_secret (APP_SCOPE , MONITORING_PASSWORD_KEY ),
1743
- extra_user_roles = [ROLE_STATS ],
1744
- )
1745
1757
except PostgreSQLGrantDatabasePrivilegesToUserError as e :
1746
1758
logger .exception (e )
1747
1759
self .unit .status = BlockedStatus ("Failed to grant database privileges to user" )
@@ -1755,22 +1767,6 @@ def _start_primary(self, event: StartEvent) -> None: # noqa: C901
1755
1767
event .defer ()
1756
1768
return
1757
1769
1758
- self .postgresql .set_up_database (
1759
- temp_location = "/var/snap/charmed-postgresql/common/data/temp"
1760
- )
1761
-
1762
- access_groups = self .postgresql .list_access_groups ()
1763
- if access_groups != set (ACCESS_GROUPS ):
1764
- self .postgresql .create_access_groups ()
1765
- self .postgresql .grant_internal_access_group_memberships ()
1766
-
1767
- access_groups = self .postgresql .list_access_groups ()
1768
- if access_groups != set (ACCESS_GROUPS ):
1769
- self .postgresql .create_access_groups ()
1770
- self .postgresql .grant_internal_access_group_memberships ()
1771
-
1772
- self .postgresql_client_relation .oversee_users ()
1773
-
1774
1770
# Set the flag to enable the replicas to start the Patroni service.
1775
1771
self ._peers .data [self .app ]["cluster_initialised" ] = "True"
1776
1772
@@ -1949,6 +1945,12 @@ def _was_restore_successful(self) -> bool:
1949
1945
logger .debug ("Restore check early exit: Patroni has not started yet" )
1950
1946
return False
1951
1947
1948
+ try :
1949
+ self ._setup_users ()
1950
+ except Exception as e :
1951
+ logger .exception (e )
1952
+ return False
1953
+
1952
1954
restoring_backup = self .app_peer_data .get ("restoring-backup" )
1953
1955
restore_timeline = self .app_peer_data .get ("restore-timeline" )
1954
1956
restore_to_time = self .app_peer_data .get ("restore-to-time" )
0 commit comments