OpenKeel: la soluzione Cloud sovrana, francese e di portata europea, del gruppo inherent Scopri inherent

Componenti · Console e strumenti

Skyline

Un unico binario Go: l'API della console, i file della console React e un proxy verso il catalogo Keystone.

Go Console React upstreamopenkeel-skyline

Il modulo

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

Estratto da openkeel-skyline/README.md (in inglese).

API REST

30 operazioni dell'API REST originale (route e azioni nel corpo) e il loro stato in OpenKeel.

  • 26Implementato
  • 4Non servito

Come viene testata la compatibilità

L'obiettivo è la skyline-console invariata: gli scenari registrati vengono riprodotti con le loro chiamate in uscita, le policy e i token di sessione vengono confrontati con Python, e la console compilata viene riprodotta su Go.

Replay degli scambi registrati

Replay E2E con chiamate in uscita

Gli scenari registrati restituiscono lo stesso stato, lo stesso corpo e gli stessi cookie, e le stesse chiamate non Keystone a OpenStack nello stesso ordine.

Esecuzione

make e2e su internal/fakeos, su go-mysql-server e MariaDB 11.4.

Ultimo risultato 44 / 45 identici su entrambi i motori, 1 differenza deliberata; 118 chiamate in uscita invece di 222.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Test unitari e golden test

Vettori di policy e JWT di sessione

Tutte le regole di policy integrate decidono come oslo.policy, e il token di sessione è identico byte per byte a quello di python-jose.

Esecuzione

internal/skypolicy/testdata/policy-vectors.json e internal/session/session_test.go.

Ultimo risultato 1 862 regole × 7 personas identiche; JWT identico byte per byte a parità di payload e chiave.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Contratto client

Replay smoke di skyline-console

Le richieste registrate con la console compilata ottengono gli stati registrati, e le chiamate inoltrate raggiungono i rispettivi endpoint con le intestazioni attese.

Esecuzione

test/e2e/console_test.go con E2E_CONSOLE_DIR sui file della console dell'immagine.

Ultimo risultato 35 / 35.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

End-to-end su un laboratorio

Esecuzione reale sul Keystone Go

Accesso, profilo, policy, cambio di progetto, endpoint contrib, testo per password errata, logout e proxy Keystone funzionano con openkeel-keystone.

Esecuzione

Esecuzione reale su un Keystone Go popolato da MariaDB, solo endpoint di identità.

Ultimo risultato Policy di amministratore di sistema: 1 817 / 1 860 consentite, come Python con il suo simulatore.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Concorrenza su Galera

Concorrenza su MariaDB Galera

Le prime scritture concorrenti di una stessa impostazione e i logout concorrenti restano coerenti su tre nodi.

Esecuzione

make galera-test da galera1 a galera3.

Ultimo risultato Superato, 3 esecuzioni su 3: una riga, lo stesso valore su ogni nodo, 0 × 5xx.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Scenario

Suite Cypress di skyline-console

La suite Cypress della console stessa sui servizi Go.

Esecuzione

Richiede i servizi Go in un cluster kind (Skyline Python in kind: 31 / 34).

Ultimo risultato Non eseguito.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Escluso dal rewrite

Skyline diventa un unico binario Go che serve la console, la sua API e il proxy, senza il nginx generato, l'opzione CORS né le route di documentazione FastAPI.

Meccanismi interni semplificati

nginx e skyline-nginx-generator

Perché è stato escluso

Il server Go serve la build della console e fa da proxy alle API OpenStack con le regole di percorso del generatore.

Perché la soluzione non ne risente

Le modifiche al catalogo vengono rilette ogni 60 s anziché richiedere un riavvio, e l'avvio non fallisce più quando Keystone non è disponibile.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Obsoleto o inutilizzato upstream

Origini consentite CORS

Perché è stato escluso

La console condivide la stessa origine, e l'opzione impedisce comunque l'avvio su Starlette 1.x.

Perché la soluzione non ne risente

Nessuno per la console, servita dalla stessa origine della sua API.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Meccanismi interni semplificati

Route di documentazione FastAPI e generatori offline

Perché è stato escluso

/docs, /redoc e openapi.json non vengono serviti, e i generatori policy-manager, swagger e sample-config sono strumenti offline del pacchetto Python.

Perché la soluzione non ne risente

Il documento OpenAPI si trova nella reverse-spec e le regole di policy sono integrate; la console non usa queste route.

Fonte: openkeel-skyline/docs/CONFORMANCE.md

Qui è elencato solo ciò che è stato escluso per scelta progettuale; il lavoro non ancora svolto si trova nei Known gaps del docs/CONFORMANCE.md del modulo. Tutti i moduli

Interazioni Skyline

Vista del servizio generata dalla skill dei diagrammi a partire dal modello OpenKeel.

Diagramma openkeel-skyline.svg Schermo intero
Le 8 interazioni del modello
DaAProtocolloCosa
SkylineIngress / Gateway APIAPI RESTall APIs
SkylineKeystoneAPI RESTlogin, catalog, system session
SkylineMariaDB GaleraSQL (MariaDB Galera)settings, revoked tokens
SkylineNova APIAPI RESTaggregated lists
SkylineCinder APIAPI RESTaggregated lists
SkylineNeutron serverAPI RESTextensions, ports, FWaaS, VPN, load balancers
SkylineGlanceAPI RESTimages
SkylineCeph RGWAPI RESTcontainers, objects (Swift API, proxied)

Specifiche