|
49 | 49 | PostgreSQL,
|
50 | 50 | PostgreSQLEnableDisableExtensionError,
|
51 | 51 | PostgreSQLGetCurrentTimelineError,
|
| 52 | + PostgreSQLListUsersError, |
52 | 53 | PostgreSQLUpdateUserPasswordError,
|
53 | 54 | )
|
54 | 55 | from charms.postgresql_k8s.v0.postgresql_tls import PostgreSQLTLS
|
@@ -2304,33 +2305,47 @@ def client_relations(self) -> list[Relation]:
|
2304 | 2305 | @property
|
2305 | 2306 | def relations_user_databases_map(self) -> dict:
|
2306 | 2307 | """Returns a user->databases map for all relations."""
|
| 2308 | + user_database_map = {} |
| 2309 | + # Copy relations users directly instead of waiting for them to be created |
| 2310 | + for relation in self.model.relations[self.postgresql_client_relation.relation_name]: |
| 2311 | + user = f"relation_id_{relation.id}" |
| 2312 | + if database := self.postgresql_client_relation.database_provides.fetch_relation_field( |
| 2313 | + relation.id, "database" |
| 2314 | + ): |
| 2315 | + user_database_map[user] = database |
2307 | 2316 | if (
|
2308 | 2317 | not self.is_cluster_initialised
|
2309 | 2318 | or not self._patroni.member_started
|
2310 | 2319 | or self.postgresql.list_access_groups(current_host=self.is_connectivity_enabled)
|
2311 | 2320 | != set(ACCESS_GROUPS)
|
2312 | 2321 | ):
|
2313 |
| - return {USER: "all", REPLICATION_USER: "all", REWIND_USER: "all"} |
2314 |
| - user_database_map = {} |
2315 |
| - for user in self.postgresql.list_users_from_relation( |
2316 |
| - current_host=self.is_connectivity_enabled |
2317 |
| - ): |
2318 |
| - user_database_map[user] = ",".join( |
2319 |
| - self.postgresql.list_accessible_databases_for_user( |
2320 |
| - user, current_host=self.is_connectivity_enabled |
2321 |
| - ) |
2322 |
| - ) |
2323 |
| - |
2324 |
| - # Copy relations users directly instead of waiting for them to be created |
2325 |
| - for relation in self.model.relations[self.postgresql_client_relation.relation_name]: |
2326 |
| - user = f"relation_id_{relation.id}" |
2327 |
| - if user not in user_database_map and ( |
2328 |
| - database := self.postgresql_client_relation.database_provides.fetch_relation_field( |
2329 |
| - relation.id, "database" |
2330 |
| - ) |
| 2322 | + user_database_map.update({ |
| 2323 | + USER: "all", |
| 2324 | + REPLICATION_USER: "all", |
| 2325 | + REWIND_USER: "all", |
| 2326 | + }) |
| 2327 | + return user_database_map |
| 2328 | + try: |
| 2329 | + for user in sorted( |
| 2330 | + self.postgresql.list_users_from_relation(current_host=self.is_connectivity_enabled) |
2331 | 2331 | ):
|
2332 |
| - user_database_map[user] = database |
2333 |
| - return user_database_map |
| 2332 | + user_database_map[user] = ",".join( |
| 2333 | + self.postgresql.list_accessible_databases_for_user( |
| 2334 | + user, current_host=self.is_connectivity_enabled |
| 2335 | + ) |
| 2336 | + ) |
| 2337 | + if self.postgresql.list_access_groups( |
| 2338 | + current_host=self.is_connectivity_enabled |
| 2339 | + ) != set(ACCESS_GROUPS): |
| 2340 | + user_database_map.update({ |
| 2341 | + USER: "all", |
| 2342 | + REPLICATION_USER: "all", |
| 2343 | + REWIND_USER: "all", |
| 2344 | + }) |
| 2345 | + return user_database_map |
| 2346 | + except PostgreSQLListUsersError: |
| 2347 | + logger.debug("relations_user_databases_map: Unable to get users") |
| 2348 | + return {USER: "all", REPLICATION_USER: "all", REWIND_USER: "all"} |
2334 | 2349 |
|
2335 | 2350 | @property
|
2336 | 2351 | def generate_user_hash(self) -> str:
|
|
0 commit comments