enhancement
major
#29947
Steueranwendung: Workspace-Management – leere TopLogic-Anwendung in einem Docker-Container anlegen, starten, stoppen und aufräumen
Kontext
Erster Schritt der Steueranwendung aus #29946, in der ein KI-Agent TopLogic-Anwendungen baut. Gebaut wird hier die Grundlage aller weiteren Schritte: Jede verwaltete Anwendung bekommt einen Workspace in einem eigenen Docker-Container. Die Steueranwendung verwaltet den Lebenszyklus dieses Containers.
Definition of Done: In der Steueranwendung kann ein Anwender eine leere TopLogic-Anwendung anlegen, starten, stoppen und aufräumen. Die gestartete Anwendung ist über einen Vorschau-Link im Browser erreichbar.
Verhalten
Projekt anlegen
- Der Anwender legt ein Projekt an mit Name, Maven-Koordinaten (Group-ID, Artifact-ID) und Engine-Version. Die Engine-Version ist ein stabiles Release.
- Die Steueranwendung erzeugt den Workspace-Container mit seinen Volumes. Im Container erzeugt sie aus tl-archetype-app eine leere Anwendung in der gewählten Engine-Version und baut sie.
- Der Fortschritt und die Ausgabe des Anlegens und des Builds sind in der Steueranwendung sichtbar. Ein Fehler setzt den Workspace in einen Fehlerzustand und zeigt die Ausgabe an.
Starten
- Die Anwendung im Container läuft auf dem festen Port 8080.
- Beim Start des Containers bildet die Steueranwendung den Port auf einen freien Host-Port ab und merkt ihn sich am Workspace.
- Die Steueranwendung zeigt den Vorschau-Link an, sobald die Anwendung antwortet.
Stoppen
- Die Anwendung und der Container werden angehalten.
- Die Volumes mit Quellen, Workspace-Repository und Datenbank bleiben erhalten. Ein erneuter Start setzt auf diesem Stand auf.
Aufräumen
- Container und Volumes des Workspaces werden entfernt.
- Das Projekt bleibt erhalten und kann einen neuen Workspace anlegen.
- Die Steueranwendung räumt nur Container und Volumes auf, die sie selbst angelegt hat. Sie erkennt sie an Labels.
Zustand
- Ein Workspace hat einen sichtbaren Status: angelegt, wird gebaut, gestoppt, läuft, Fehler.
- Nach einem Neustart der Steueranwendung gleicht sie den Status mit den tatsächlich vorhandenen Containern ab.
Technische Umsetzung
- Neues Engine-Modul der Steueranwendung, Name noch festzulegen. Die Oberfläche entsteht in der React-View-Schicht (.view.xml).
- Modell: Project (Name, Maven-Koordinaten, Engine-Version) und Workspace (Container-ID, Status, Host-Port, Volumes).
- Abstraktion WorkspaceProvider für Anlegen, Starten, Stoppen, Entfernen, Status und Ausgabe-Stream. Erste Implementierung: Docker auf dem Host der Steueranwendung über die Docker-Engine-API. Den Zugriff auf Docker hat nur die Steueranwendung, kein Workspace-Container erhält den Docker-Socket.
- Workspace-Image mit JDK 21, Maven und Node. Harness und Browser kommen mit den Folgeschritten hinzu.
- Maven:
- Das Workspace-Repository für Snapshots liegt in einem Volume des Workspaces.
- Die Engine-Artefakte der gewählten Version löst ein eigener Resolver-Container einmal auf (mvn tl:resolve) und legt sie in einem gemeinsamen Volume ab. Die Workspace-Container binden dieses Volume nur lesend als Tail-Repository ein (maven.repo.local.tail).
- Docker-spezifische Werte wie Image, Netzwerk, Port-Bereich und Volume-Präfix sind in der Konfiguration des Providers festgelegt.
Abgrenzung
- Agenten-Harness im Container, Git-Repository und CI/CD gehören zu den Folgeschritten von #29946.
- Ressourcen-Limits und mehrere Workspaces je Projekt folgen in Version 2.
Verifikation
- Ein Integrationstest des Docker-Providers durchläuft Anlegen, Starten, Stoppen und Aufräumen. Ohne erreichbaren Docker-Daemon wird er übersprungen.
- Eine UI-Prüfung in der laufenden Steueranwendung: Projekt anlegen, starten, Vorschau-Link öffnen (Login-Seite der leeren Anwendung), stoppen, aufräumen.
Umsetzung
Module
- tl-factory (Fragment): Workspace-Abstraktion, Docker-Implementierung, Modell tl.factory (Project, Workspace), Hintergrund-Operationen, Abgleich beim Start und die Views. Andere Anwendungen können die Steueranwendung damit einbinden.
- tl-factory-app: lauffähige Steueranwendung (React-View-Schicht, Login root).
- Entwicklerartikel factory/index.md mit Konfiguration und Betriebsarten.
Workspace-Abstraktion
- WorkspaceProvider (plattformneutral): Images bauen und laden, Workspaces anlegen, starten, stoppen, entfernen, Status, Liste, Aufräumen, Kommandos im Container ausführen, gemeinsame Volumes.
- DockerWorkspaceProvider über die Docker-Engine-API (docker-java). Konfigurierbar sind Daemon-URI (unix:// oder tcp:// mit TLS), Netzwerk, öffentlicher Host für Vorschau-Links, Host-Port-Bereich, Label-Namensraum und Namenspräfix.
- Eigentum wird ausschließlich über Labels erkannt, nie über Namen. Fremde Container und Volumes und die Steueranwendung selbst bleiben beim Aufräumen unberührt.
- Es werden nur benannte Volumes angelegt, keine Bind-Mounts.
Anwendung im Workspace
- ApplicationWorkspaces erzeugt die Anwendung aus tl-archetype-app, baut sie und startet sie. Die Engine-Version ist konfigurierbar, Standard ist die neueste freigegebene Version.
- Das Workspace-Image (JDK 21, Maven, Node, git, Maven-Settings für das TopLogic-Release-Repository) wird über die Abstraktion gebaut. Sein Tag ist ein Hash des Build-Kontexts.
- Je Engine-Version gibt es ein gemeinsames Release-Repository als Volume. Ein Resolver-Container füllt es einmal (tl:resolve), die Workspaces binden es nur lesend als maven.repo.local.tail ein. Das Snapshot-Repository liegt in einem Volume des Workspaces.
- Ein Entry-Skript startet die Anwendung im Vordergrund auf Port 8080, sobald sie gebaut ist. Container starten und stoppen heißt damit Anwendung starten und stoppen.
- Jeder Workspace erhält ein zufälliges initiales root-Passwort (tl_initial_password). Es wird in der Detailansicht angezeigt.
Steueranwendung
- Lange Operationen (Anlegen, Starten bis zur Antwort der Anwendung) laufen im Hintergrund. Ihre Ausgabe wird gebündelt etwa jede Sekunde in das Log des Workspaces geschrieben, der Status in eigenen Transaktionen.
- Allgemeine Erweiterung der View-Schicht: CommitSource (in com.top_logic.layout.view). Mit dieser Kanalquelle folgen Views Commits anderer Threads innerhalb des Aktualisierungsintervalls des Kanals, z. B. dem Live-Log und dem Status.
- Beim Start gleicht die Steueranwendung die gespeicherten Workspaces mit den vorhandenen Containern ab. Ist Docker nicht erreichbar, blockiert das den Start nicht.
- Die Befehle Anlegen, Starten, Stoppen, Aufräumen und Projekt löschen sind je nach Status aktiv.
Betriebsarten
- Steueranwendung direkt auf dem Docker-Host: Sie greift über den lokalen Socket auf Docker zu.
- Steueranwendung selbst im Container: Die Workspaces laufen als Geschwister-Container auf demselben Daemon. Der Docker-Zugriff erfolgt über einen Socket-Proxy, der die API einschränkt, oder über einen entfernten Daemon (tcp:// mit TLS). Der Container der Steueranwendung wird mit dem Workspace-Netzwerk verbunden. Der öffentliche Host für die Vorschau-Links wird konfiguriert.
Verifikation
- TestDockerWorkspaceProvider: Lebenszyklus, Fehlerfälle und fremde Objekte gegen einen echten Docker-Daemon. Ohne Daemon laufen die Tests nicht.
- TestApplicationWorkspaces: kompletter Ablauf vom Anlegen bis zum Aufräumen inklusive Initialpasswort. Der Test läuft nur mit -Dtl.factory.integration=true, weil er Images und Engine-Artefakte lädt.
- TestWorkspaceReconciliation: Abgleich gegen einen Test-Provider.
- UI-Prüfung in tl-factory-app: Projekt anlegen, Live-Log, Vorschau öffnen, Login als root, stoppen, starten, aufräumen, löschen.
Offen für Folgeschritte
- Kommandos im Container haben keinen Timeout. Nur der Start der Anwendung ist zeitlich begrenzt.
- Die Container laufen als root.
- Die eigene Ausgabe der Anwendung (Container-Log) wird in der Steueranwendung nicht angezeigt.