Skip to content

Commit fcc17af

Browse files
authored
Create users and roles on restoration (#991)
1 parent 1e9eb89 commit fcc17af

File tree

2 files changed

+43
-40
lines changed

2 files changed

+43
-40
lines changed

src/charm.py

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,41 @@ def _setup_ldap_sync(self, postgres_snap: snap.Snap | None = None) -> None:
16881688
logger.debug("Starting LDAP sync service")
16891689
postgres_snap.restart(services=["ldap-sync"])
16901690

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:
16921726
"""Bootstrap the cluster."""
16931727
# Set some information needed by Patroni to bootstrap the cluster.
16941728
if not self._patroni.bootstrap_cluster():
@@ -1715,33 +1749,11 @@ def _start_primary(self, event: StartEvent) -> None: # noqa: C901
17151749
return
17161750

17171751
try:
1718-
self.postgresql.create_predefined_instance_roles()
1752+
self._setup_users()
17191753
except PostgreSQLCreatePredefinedRolesError as e:
17201754
logger.exception(e)
17211755
self.unit.status = BlockedStatus("Failed to create pre-defined roles")
17221756
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-
)
17451757
except PostgreSQLGrantDatabasePrivilegesToUserError as e:
17461758
logger.exception(e)
17471759
self.unit.status = BlockedStatus("Failed to grant database privileges to user")
@@ -1755,22 +1767,6 @@ def _start_primary(self, event: StartEvent) -> None: # noqa: C901
17551767
event.defer()
17561768
return
17571769

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-
17741770
# Set the flag to enable the replicas to start the Patroni service.
17751771
self._peers.data[self.app]["cluster_initialised"] = "True"
17761772

@@ -1949,6 +1945,12 @@ def _was_restore_successful(self) -> bool:
19491945
logger.debug("Restore check early exit: Patroni has not started yet")
19501946
return False
19511947

1948+
try:
1949+
self._setup_users()
1950+
except Exception as e:
1951+
logger.exception(e)
1952+
return False
1953+
19521954
restoring_backup = self.app_peer_data.get("restoring-backup")
19531955
restore_timeline = self.app_peer_data.get("restore-timeline")
19541956
restore_to_time = self.app_peer_data.get("restore-to-time")

tests/unit/test_charm.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,7 @@ def test_on_update_status_after_restore_operation(harness):
907907
patch(
908908
"charms.postgresql_k8s.v1.postgresql.PostgreSQL.get_current_timeline"
909909
) as _get_current_timeline,
910+
patch("charm.PostgresqlOperatorCharm._setup_users") as _setup_users,
910911
patch("charm.PostgresqlOperatorCharm.update_config") as _update_config,
911912
patch("charm.Patroni.member_started", new_callable=PropertyMock) as _member_started,
912913
patch("charm.Patroni.get_member_status") as _get_member_status,

0 commit comments

Comments
 (0)