Refactor: Service-Extraktion aus deploy/admin/security_router (+ Install-Skripte aus main.py) — Enabler für #55-Tests #95

Open
opened 2026-06-09 21:52:53 +00:00 by chinux · 0 comments
Owner

Ziel

Business-Logik aus den drei groessten Routern in Services extrahieren — Router werden duenn (HTTP/Validierung/Streaming-Rahmen), Logik wird testbar und wiederverwendbar.

Ist-Zustand

  • server/routers/deploy_router.py1.240 Zeilen
  • server/routers/admin_router.py1.190 Zeilen (Enrollment/OS-Detection lebte hier → #66-Bug-Klasse)
  • server/routers/security_router.py1.151 Zeilen (Port-Dedup, CVE-Ecosystem-Mapping)
  • dazu server/main.py931 Zeilen inkl. Install-Skript-Generierung (gehoert nicht in den App-Bootstrap)
  • dagegen nur 8 Service-Module — die Schicht existiert (services/kernel_cleanup.py ist das Vorbild: Logik im Service, Router ruft nur auf), ist aber unterbesetzt.

Warum (OSS + #55)

An Router gekoppelte Logik ist kaum unit-testbar — genau deshalb hat #55 bis heute nur 1 Smoke-Test. Die in #55 priorisierten Test-Ziele leben fast alle in diesen Routern. Extraktion = Logik wird als reine Funktion testbar, Tests folgen fast gratis.

Extraktions-Kandidaten (konkret)

  • services/enrollment.py: OS-Detection-Kette (cache→ostype→live, os_override), Install-Dispatch, Enrollment-SSE-Schritte (aus admin_router).
  • services/install_scripts.py: _make_install_script_rust + Windows-Variante (aus main.py raus; main.py nur noch Bootstrap/Routing).
  • services/port_scan.py: _dedup_ports, Persistenz-Aufbereitung (aus security_router).
  • services/cve_scan.py: OS→Ecosystem-Mapper, skipped-Logik (aus security_router).
  • services/bulk_updates.py: Bulk-/Self-Update-Orchestrierung, Version-Pfad-Logik (aus deploy_router).
  • Regel danach: Router = HTTP + Auth + Validierung + Response/SSE-Rahmen. Services = alles, was man testen will.

Vorgehen (kein Big-Bang!)

  • Pro Kandidat ein kleiner Commit: Funktion(en) verschieben, Router-Importe umbiegen, Verhalten 1:1.
  • Opportunistisch: jeder Endpoint, der fuer einen Bugfix ohnehin angefasst wird, gibt seine Logik dabei an einen Service ab.
  • Pro extrahiertem Service direkt 2-3 pytest-Unit-Tests in server/tests/ (deckt die #55-Liste ab: _dedup_ports, Ecosystem-Mapping, notify-Gating, Version-Pfad ...).

Akzeptanz

  • Die 5 Kandidaten-Services existieren, Router-Zeilenzahlen deutlich gesunken (Ziel: kein Router > ~600 Z.).
  • server/tests/ deckt die extrahierten Funktionen ab (>= 10 echte Unit-Tests statt 1 Smoke).
  • main.py enthaelt keine Install-Skript-Generierung mehr.
  • Verhalten aller Endpoints unveraendert.

Bezug

#55 (Tests/CI — direkter Enabler), #56 (Haertung), Projekt-Struktur-Review 09.06.2026. Vorbild im Repo: services/kernel_cleanup.py (#26).

Branch

refactor/extract-router-services

## Ziel Business-Logik aus den drei groessten Routern in **Services** extrahieren — Router werden duenn (HTTP/Validierung/Streaming-Rahmen), Logik wird **testbar** und wiederverwendbar. ## Ist-Zustand - `server/routers/deploy_router.py` — **1.240 Zeilen** - `server/routers/admin_router.py` — **1.190 Zeilen** (Enrollment/OS-Detection lebte hier → #66-Bug-Klasse) - `server/routers/security_router.py` — **1.151 Zeilen** (Port-Dedup, CVE-Ecosystem-Mapping) - dazu `server/main.py` — **931 Zeilen** inkl. Install-Skript-Generierung (gehoert nicht in den App-Bootstrap) - dagegen nur **8 Service-Module** — die Schicht existiert (`services/kernel_cleanup.py` ist das Vorbild: Logik im Service, Router ruft nur auf), ist aber unterbesetzt. ## Warum (OSS + #55) An Router gekoppelte Logik ist kaum unit-testbar — genau deshalb hat #55 bis heute nur 1 Smoke-Test. Die in #55 priorisierten Test-Ziele leben fast alle in diesen Routern. Extraktion = Logik wird als reine Funktion testbar, Tests folgen fast gratis. ## Extraktions-Kandidaten (konkret) - **`services/enrollment.py`**: OS-Detection-Kette (cache→ostype→live, os_override), Install-Dispatch, Enrollment-SSE-Schritte (aus admin_router). - **`services/install_scripts.py`**: `_make_install_script_rust` + Windows-Variante (aus `main.py` raus; main.py nur noch Bootstrap/Routing). - **`services/port_scan.py`**: `_dedup_ports`, Persistenz-Aufbereitung (aus security_router). - **`services/cve_scan.py`**: OS→Ecosystem-Mapper, skipped-Logik (aus security_router). - **`services/bulk_updates.py`**: Bulk-/Self-Update-Orchestrierung, Version-Pfad-Logik (aus deploy_router). - Regel danach: **Router = HTTP + Auth + Validierung + Response/SSE-Rahmen. Services = alles, was man testen will.** ## Vorgehen (kein Big-Bang!) - Pro Kandidat ein kleiner Commit: Funktion(en) verschieben, Router-Importe umbiegen, Verhalten 1:1. - **Opportunistisch**: jeder Endpoint, der fuer einen Bugfix ohnehin angefasst wird, gibt seine Logik dabei an einen Service ab. - Pro extrahiertem Service direkt 2-3 pytest-Unit-Tests in `server/tests/` (deckt die #55-Liste ab: `_dedup_ports`, Ecosystem-Mapping, notify-Gating, Version-Pfad ...). ## Akzeptanz - Die 5 Kandidaten-Services existieren, Router-Zeilenzahlen deutlich gesunken (Ziel: kein Router > ~600 Z.). - `server/tests/` deckt die extrahierten Funktionen ab (>= 10 echte Unit-Tests statt 1 Smoke). - `main.py` enthaelt keine Install-Skript-Generierung mehr. - Verhalten aller Endpoints unveraendert. ## Bezug #55 (Tests/CI — direkter Enabler), #56 (Haertung), Projekt-Struktur-Review 09.06.2026. Vorbild im Repo: `services/kernel_cleanup.py` (#26). ## Branch `refactor/extract-router-services`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#95
No description provided.