OpenKeel: die souveräne französische Cloud-Lösung mit europäischer Reichweite der inherent-Gruppe inherent entdecken

Komponenten · Konsole und Werkzeuge

Skyline

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.

  • 26Implementiert
  • 4Nicht bedient

Wie die Kompatibilität getestet wird

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.

Diagramm openkeel-skyline.svg Vollbild
Die 8 Interaktionen des Modells
VonNachProtokollWas
SkylineIngress / Gateway APIREST-APIall APIs
SkylineKeystoneREST-APIlogin, catalog, system session
SkylineMariaDB GaleraSQL (MariaDB Galera)settings, revoked tokens
SkylineNova APIREST-APIaggregated lists
SkylineCinder APIREST-APIaggregated lists
SkylineNeutron serverREST-APIextensions, ports, FWaaS, VPN, load balancers
SkylineGlanceREST-APIimages
SkylineCeph RGWREST-APIcontainers, objects (Swift API, proxied)

Spezifikationen