Ein einziges Go-Binary: die Konsolen-API, die Dateien der React-Konsole und ein Proxy zum Keystone-Katalog.
Go Upstream-React-Konsoleopenkeel-skyline
Das Modul
OpenKeel implementation in Go of OpenStack skyline-apiserver, the back end of the Skyline dashboard, generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. skyline-console runs unchanged against it: same routes under /api/openstack/skyline/api/v1, same session cookie and JWT, same profile, list and error bodies. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist, including the session key handling, is in docs/SECURITY.md.
One image and one process do what the Python container did with nginx and gunicorn:
the Skyline API (login, TOTP, WebSSO, profile, project and region switch, aggregated lists of servers, volumes, snapshots and ports, policies for the UI, settings, Prometheus queries, and the OpenKeel addition GET /extension/server_metrics: CPU, memory and disk usage of the project's instances for the console's Metrics page);
the skyline-console files under /, with the single-page fallback; they are built into the image (/usr/share/skyline-console) from the stable/2026.2 sources;
the reverse proxy /api/openstack/<region>/<service>/ to the OpenStack APIs of the Keystone catalog, re-read every minute (no restart when the catalog changes).
Peers: Keystone (openkeel-keystone), Nova, Cinder, Glance, Neutron through the catalog, Prometheus, and a small MariaDB Galera database (revoked_token, settings).
Name: openkeel-skyline, not openkeel-skyline-apiserver, because the project covers the Skyline server side as a whole (the API and the nginx of the Python container) while skyline-console stays upstream. The binary keeps the upstream name skyline-apiserver; the reverse-specification is reverse-spec-skyline-apiserver/.
Go module: github.com/openkeel/openkeel-skyline
Binary: skyline-apiserver (API, console and proxy on port 9998, health and readiness on 9090)
Configuration: YAML, see config/config.example.yaml
Setting up a development environment, the database and the tests: docs/GETTING-STARTED.md
Database schema, migrations and upgrades: docs/DATABASE.md
Auszug aus openkeel-skyline/README.md (auf Englisch).
REST-API
30 Operationen der Original-REST-API (Routen und Body-Aktionen) und ihr Status in OpenKeel.
Ziel ist die unveränderte skyline-console: Aufgezeichnete Szenarien werden mit ihren ausgehenden Aufrufen wiedergegeben, Policies und Sitzungstokens mit Python verglichen, und die gebaute Konsole wird gegen Go wiedergegeben.
Replay aufgezeichneter Austausche
E2E-Replay mit ausgehenden Aufrufen
Aufgezeichnete Szenarien liefern denselben Status, Body und dieselben Cookies sowie dieselben Nicht-Keystone-Aufrufe an OpenStack in derselben Reihenfolge.
Ausführung
make e2e gegen internal/fakeos, auf go-mysql-server und MariaDB 11.4.
Letztes Ergebnis 44 / 45 identisch auf beiden Engines, 1 bewusster Unterschied; 118 ausgehende Aufrufe statt 222.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Unit- und Golden Tests
Policy-Vektoren und Sitzungs-JWT
Alle eingebetteten Policy-Regeln entscheiden wie oslo.policy, und das Sitzungstoken ist bytegleich mit dem von python-jose.
Ausführung
internal/skypolicy/testdata/policy-vectors.json und internal/session/session_test.go.
Letztes Ergebnis 1 862 Regeln × 7 Personas identisch; bytegleiches JWT für dieselbe Nutzlast und denselben Schlüssel.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Client-Vertrag
Smoke-Replay von skyline-console
Mit der gebauten Konsole aufgezeichnete Anfragen erhalten die aufgezeichneten Status, und weitergeleitete Aufrufe erreichen ihre Endpoints mit den erwarteten Headern.
Ausführung
test/e2e/console_test.go mit E2E_CONSOLE_DIR auf den Konsolendateien des Images.
Letztes Ergebnis 35 / 35.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
End-to-End in einem Lab
Live-Durchlauf gegen das Go-Keystone
Anmeldung, Profil, Policies, Projektwechsel, contrib-Endpoints, Text bei falschem Passwort, Abmeldung und der Keystone-Proxy funktionieren gegen openkeel-keystone.
Ausführung
Live-Durchlauf gegen ein mit MariaDB befülltes Go-Keystone, nur Identity-Endpoint.
Letztes Ergebnis System-Admin-Policies: 1 817 / 1 860 erlaubt, wie Python gegen seinen Fake.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Nebenläufigkeit auf Galera
Nebenläufigkeit auf MariaDB Galera
Nebenläufige erste Schreibvorgänge einer Einstellung und nebenläufige Abmeldungen bleiben über drei Knoten konsistent.
Ausführung
make galera-test auf galera1 bis galera3.
Letztes Ergebnis Bestanden, 3 von 3 Durchläufen: eine Zeile, derselbe Wert auf jedem Knoten, 0 × 5xx.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Szenario
Cypress-Suite von skyline-console
Die eigene Cypress-Suite der Konsole gegen die Go-Dienste.
Ausführung
Erfordert die Go-Dienste in einem kind-Cluster (Python-Skyline in kind: 31 / 34).
Letztes Ergebnis Nicht ausgeführt.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Im Rewrite ausgelassen
Skyline wird zu einem einzigen Go-Binary, das die Konsole, ihre API und den Proxy ausliefert, ohne generiertes nginx, die CORS-Option oder die FastAPI-Dokumentationsrouten.
Vereinfachte interne Mechanik
nginx und skyline-nginx-generator
Warum es ausgelassen wurde
Der Go-Server liefert den Build der Konsole aus und leitet die OpenStack-APIs mit den Pfadregeln des Generators weiter.
Warum die Lösung nicht beeinträchtigt ist
Katalogänderungen werden alle 60 s eingelesen, statt einen Neustart zu erfordern, und der Start schlägt nicht mehr fehl, wenn Keystone nicht erreichbar ist.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Upstream veraltet oder ungenutzt
Zulässige CORS-Origins
Warum es ausgelassen wurde
Die Konsole hat dieselbe Origin, und die Option verhindert ohnehin den Start unter Starlette 1.x.
Warum die Lösung nicht beeinträchtigt ist
Keine für die Konsole, die von derselben Origin wie ihre API ausgeliefert wird.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Vereinfachte interne Mechanik
FastAPI-Dokumentationsrouten und Offline-Generatoren
Warum es ausgelassen wurde
/docs, /redoc und openapi.json werden nicht ausgeliefert, und die Generatoren policy-manager, swagger und sample-config sind Offline-Werkzeuge des Python-Pakets.
Warum die Lösung nicht beeinträchtigt ist
Das OpenAPI-Dokument liegt in der reverse-spec und die Policy-Regeln sind eingebettet; die Konsole nutzt diese Routen nicht.
Quelle: openkeel-skyline/docs/CONFORMANCE.md
Hier ist nur aufgeführt, was bewusst ausgelassen wurde; noch nicht erledigte Arbeit steht in den Known gaps der docs/CONFORMANCE.md des Moduls. Alle Module
Skyline-Interaktionen
Dienstansicht, vom Diagramm-Skill aus dem OpenKeel-Modell generiert.