Skip to content

Commit 1609fa2

Browse files
authored
[DPE-7594] Add custom users to pg_hba filter (#1072)
* Filter out only the trigger users * Update lib * Add unit test * Add back database check
1 parent 823e0a0 commit 1609fa2

File tree

3 files changed

+70
-7
lines changed

3 files changed

+70
-7
lines changed

lib/charms/postgresql_k8s/v1/postgresql.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,8 @@ def create_database(
330330
raise PostgreSQLCreateDatabaseError() from e
331331

332332
# Enable preset extensions
333-
self.enable_disable_extensions(dict.fromkeys(plugins, True), database)
333+
if plugins:
334+
self.enable_disable_extensions(dict.fromkeys(plugins, True), database)
334335

335336
def create_user(
336337
self,

src/charm.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2497,15 +2497,21 @@ def relations_user_databases_map(self) -> dict:
24972497
})
24982498
return user_database_map
24992499
try:
2500-
for user in self.postgresql.list_users_from_relation(
2501-
current_host=self.is_connectivity_enabled
2502-
):
2503-
databases = ",".join(
2500+
for user in self.postgresql.list_users(current_host=self.is_connectivity_enabled):
2501+
if user in (
2502+
"backup",
2503+
"monitoring",
2504+
"operator",
2505+
"postgres",
2506+
"replication",
2507+
"rewind",
2508+
):
2509+
continue
2510+
if databases := ",".join(
25042511
self.postgresql.list_accessible_databases_for_user(
25052512
user, current_host=self.is_connectivity_enabled
25062513
)
2507-
)
2508-
if databases:
2514+
):
25092515
user_database_map[user] = databases
25102516
else:
25112517
logger.debug(f"User {user} has no databases to connect to")

tests/unit/test_charm.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2678,3 +2678,59 @@ def test_generate_user_hash(harness):
26782678
assert harness.charm.generate_user_hash == sentinel.hash
26792679

26802680
_shake_128.assert_called_once_with(b"{'relation_id_2': 'test_db'}")
2681+
2682+
2683+
def test_relations_user_databases_map(harness):
2684+
with (
2685+
patch("charm.PostgresqlOperatorCharm.postgresql") as _postgresql,
2686+
patch("charm.Patroni.member_started", new_callable=PropertyMock) as _member_started,
2687+
patch(
2688+
"charm.PostgresqlOperatorCharm.is_cluster_initialised", new_callable=PropertyMock
2689+
) as _is_cluster_initialised,
2690+
):
2691+
# Initial empty results from the functions used in the property that's being tested.
2692+
_postgresql.list_users_from_relation.return_value = set()
2693+
_postgresql.list_accessible_databases_for_user.return_value = set()
2694+
_postgresql.list_access_groups.return_value = {
2695+
"identity_access",
2696+
"internal_access",
2697+
"relation_access",
2698+
}
2699+
2700+
# Test when the cluster isn't initialised yet.
2701+
_is_cluster_initialised.return_value = False
2702+
_member_started.return_value = True
2703+
assert harness.charm.relations_user_databases_map == {
2704+
"operator": "all",
2705+
"replication": "all",
2706+
"rewind": "all",
2707+
}
2708+
2709+
# Test when the cluster is initialised but the cluster member hasn't started yet.
2710+
_is_cluster_initialised.return_value = True
2711+
_member_started.return_value = False
2712+
assert harness.charm.relations_user_databases_map == {
2713+
"operator": "all",
2714+
"replication": "all",
2715+
"rewind": "all",
2716+
}
2717+
2718+
# Test when there are no relation users in the database.
2719+
_member_started.return_value = True
2720+
assert harness.charm.relations_user_databases_map == {}
2721+
2722+
# Test when there are relation users in the database.
2723+
_postgresql.list_users.return_value = ["user1", "user2"]
2724+
_postgresql.list_accessible_databases_for_user.side_effect = [["db1", "db2"], ["db3"]]
2725+
assert harness.charm.relations_user_databases_map == {"user1": "db1,db2", "user2": "db3"}
2726+
2727+
# Test when the access groups where not created yet.
2728+
_postgresql.list_accessible_databases_for_user.side_effect = [["db1", "db2"], ["db3"]]
2729+
_postgresql.list_access_groups.return_value = set()
2730+
assert harness.charm.relations_user_databases_map == {
2731+
"user1": "db1,db2",
2732+
"user2": "db3",
2733+
"operator": "all",
2734+
"replication": "all",
2735+
"rewind": "all",
2736+
}

0 commit comments

Comments
 (0)