Skip to content

fix(credentials): persist postgres/pgadmin access entries with group_id - #164

Open
Dilmand wants to merge 1 commit into
stagingfrom
fix/persist-postgres-pgadmin-credentials
Open

fix(credentials): persist postgres/pgadmin access entries with group_id#164
Dilmand wants to merge 1 commit into
stagingfrom
fix/persist-postgres-pgadmin-credentials

Conversation

@Dilmand

@Dilmand Dilmand commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Was war kaputt

Auf staging zeigte die Credentials-Sektion fuer ansible_postgres_group_db-Deploys nur einen Eintrag: SSH lecturer@…. Keine Postgres-Connect-URL, keine pgAdmin-URL, keine Gruppen-DB-Logins.

Ursache: Der CredentialGeneratorService erzeugt zwar {postgres: {...}, pgadmin: {...}} pro Gruppe und fuer den Teacher, aber deploy_tasks.py packte beim Aufbau des user_json-Payloads nur das instance-Feld zusammen (Linux-SSH). Das applications[]-Feld blieb leer, der Persistenz-Service _extract_access_entries hatte nichts zu extrahieren.

Fix

src/tasks/deploy_tasks.py

Beim Aufbau von credentials_for_db:

  1. Collect alle non-linux Credential-Types die generated produziert hat (durch eine Iteration ueber deployment_groups[*].<type> und teacher.<type>, mit Skip auf Metakeys wie username, students, group_name etc.).
  2. Pro Typ eine application-Entry bauen mit:
    • credentials[] — pro Gruppe ein Eintrag mit email / db_user / password / database_name / group_id (course_group_id-Stamp wie schon bei instance.credentials)
    • admin_credentials — Teacher-Variante (group_id=NULL, landet in "Dozent"-Tab)

src/services/deployment_credential_service.py

_extract_access_entries hatte zwei kleinere Bugs die durch die staging-Logik nie zum Tragen kamen (weil applications[] nie befuellt wurde):

  1. group_id wurde fuer application.credentials nicht weitergereicht — selbst wenn jemand das Feld gesetzt haette, waeren alle DB/Web-Eintraege als Lecturer-Row gespeichert worden (im "Dozent"-Tab statt im "Gruppen"-Tab).
  2. pgAdmin wurde auf AccessType.DATABASE gemappt statt WEB_URL. Der Frontend-Code rendert die beiden unterschiedlich (DB → Connection-String code-Block, Web-URL → klickbarer Link). Per database-name wird ausserdem jetzt eine postgresql://user@ip/dbname-URL gebaut.

tests/unit/test_deployment_credential_service.py

test_extracts_postgres_credentials erwartete pauschal AccessType.DATABASE fuer alle vier Eintraege. Geupdated auf das gemischte Mapping (postgres → DATABASE, pgadmin → WEB_URL).

Wie testen

  1. Deployment mit PostgreSQL Group DB-Template + 1-2 Gruppen anlegen.
  2. Im Frontend Credentials-Sektion oeffnen:
    • "Dozent"-Tab zeigt: SSH lecturer@<ip>, DATABASE postgresql://teacher@<ip>/..., WEB_URL http://<ip>/pgadmin4/
    • "Gruppen"-Tab zeigt pro Gruppe ein Akkordeon mit der Gruppen-DB und dem Gruppen-pgAdmin-Account
  3. SQL: SELECT access_type, username, group_id FROM deployment_instance_access WHERE deployment_instance_id IN (SELECT id FROM deployment_instances WHERE deployment_id='<id>') sollte ~5+ Rows liefern statt 1.

Tests

406 passed, 4 skipped

Die zwei test_github_app_service-Fails kommen aus der Env-Konfig — sie existieren auf staging genauso (nicht durch diesen PR verursacht).

PostgreSQL- und pgAdmin-Credentials waren auf staging zwar generiert, landeten
aber nie in der DeploymentInstanceAccess-Tabelle. Im Frontend zeigte die
Credentials-Sektion daher nur den Teacher-SSH-Eintrag — kein DB-Connect, keine
pgAdmin-URL, keine Gruppen-DB-Zugaenge.

Ursache: `deploy_tasks.py` baute das `user_json` an `persist_credentials_for_stack`
nur mit dem `instance`-Feld (Linux-SSH der Gruppen + Teacher), aber ohne
`applications[]`. Der Persistenz-Service unterstuetzt `applications[]` schon —
nur niemand fuettert es.

Fixes:

* `deploy_tasks.py`: collect alle non-linux Credential-Types die der
  CredentialGeneratorService produziert hat (postgres, pgadmin, ...) und baue
  pro Type einen Eintrag in `applications[]` mit den Gruppen-Credentials und
  den Teacher-Admin-Credentials. `group_id` wird wie beim instance-Pfad aus
  `GroupInfo.course_group_id` durchgereicht.

* `deployment_credential_service._extract_access_entries`:
  - kopiert jetzt `group_id` aus jeder application-credential (vorher fehlte
    es → alle Postgres/pgAdmin-Eintraege landeten als Lecturer-Row mit
    group_id=NULL und damit im "Dozent"-Tab statt im "Gruppen"-Tab).
  - mappt pgAdmin auf `AccessType.WEB_URL` (frontend rendert die URL klickbar);
    postgres bleibt `AccessType.DATABASE` und bekommt jetzt eine richtige
    postgresql://-Connection-URL inkl. database_name.

* `tests/unit/test_deployment_credential_service.py`: erwartet jetzt das
  WEB_URL-Mapping fuer pgAdmin (statt blanket "alles DATABASE").
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant