OpenKeel: la solución Cloud soberana, francesa y de alcance europeo, del grupo inherent Descubrir inherent

Componentes · Consola y herramientas

Skyline

Un único binario Go: la API de la consola, los archivos de la consola React y un proxy hacia el catálogo de Keystone.

Go Consola React upstreamopenkeel-skyline

El módulo

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

Extracto de openkeel-skyline/README.md (en inglés).

API REST

30 operaciones de la API REST original (rutas y acciones de cuerpo) y su estado en OpenKeel.

  • 26Implementado
  • 4No servido

Cómo se prueba la compatibilidad

El objetivo es la skyline-console sin modificar: los escenarios grabados se reproducen con sus llamadas salientes, las políticas y los tokens de sesión se comparan con Python, y la consola compilada se reproduce contra Go.

Replay de los intercambios grabados

Replay E2E con llamadas salientes

Los escenarios grabados dan el mismo estado, el mismo cuerpo y las mismas cookies, y las mismas llamadas a OpenStack ajenas a Keystone en el mismo orden.

Ejecución

make e2e contra internal/fakeos, en go-mysql-server y MariaDB 11.4.

Último resultado 44 / 45 idénticos en ambos motores, 1 diferencia deliberada; 118 llamadas salientes en lugar de 222.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Tests unitarios y golden tests

Vectores de políticas y JWT de sesión

Todas las reglas de políticas integradas deciden como oslo.policy, y el token de sesión es idéntico byte a byte al de python-jose.

Ejecución

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

Último resultado 1 862 reglas × 7 personas idénticas; JWT idéntico byte a byte para la misma carga útil y la misma clave.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Contrato de cliente

Replay smoke de skyline-console

Las peticiones grabadas con la consola compilada obtienen los estados grabados, y las llamadas reenviadas llegan a sus endpoints con las cabeceras esperadas.

Ejecución

test/e2e/console_test.go con E2E_CONSOLE_DIR sobre los archivos de la consola de la imagen.

Último resultado 35 / 35.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

De extremo a extremo en un laboratorio

Ejecución en vivo contra el Keystone en Go

El inicio de sesión, el perfil, las políticas, el cambio de proyecto, los endpoints contrib, el texto de contraseña incorrecta, el cierre de sesión y el proxy de Keystone funcionan contra openkeel-keystone.

Ejecución

Ejecución en vivo contra un Keystone en Go poblado desde MariaDB, solo endpoint de identidad.

Último resultado Políticas de administrador del sistema: 1 817 / 1 860 permitidas, como Python frente a su simulación.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Concurrencia en Galera

Concurrencia en MariaDB Galera

Las primeras escrituras concurrentes de un mismo ajuste y los cierres de sesión concurrentes se mantienen coherentes en tres nodos.

Ejecución

make galera-test en galera1 a galera3.

Último resultado Superado, 3 ejecuciones de 3: una fila, el mismo valor en cada nodo, 0 × 5xx.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Escenario

Suite Cypress de skyline-console

La propia suite Cypress de la consola contra los servicios Go.

Ejecución

Requiere los servicios Go en un clúster kind (Skyline en Python en kind: 31 / 34).

Último resultado No ejecutado.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Excluido del rewrite

Skyline pasa a ser un único binario Go que sirve la consola, su API y el proxy, sin el nginx generado, la opción CORS ni las rutas de documentación de FastAPI.

Mecánica interna simplificada

nginx y skyline-nginx-generator

Por qué se excluyó

El servidor Go sirve la build de la consola y redirige las API de OpenStack con las reglas de rutas del generador.

Por qué la solución no se ve afectada

Los cambios del catálogo se leen cada 60 s en lugar de requerir un reinicio, y el arranque ya no falla mientras Keystone no está disponible.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Obsoleto o sin uso en upstream

Orígenes permitidos de CORS

Por qué se excluyó

La consola comparte origen, y la opción impide de todos modos el arranque con Starlette 1.x.

Por qué la solución no se ve afectada

Ninguno para la consola, que se sirve desde el mismo origen que su API.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Mecánica interna simplificada

Rutas de documentación de FastAPI y generadores sin conexión

Por qué se excluyó

/docs, /redoc y openapi.json no se sirven, y los generadores policy-manager, swagger y sample-config son herramientas sin conexión del paquete Python.

Por qué la solución no se ve afectada

El documento OpenAPI está en la reverse-spec y las reglas de política están integradas; la consola no usa estas rutas.

Fuente: openkeel-skyline/docs/CONFORMANCE.md

Aquí solo figura lo que se excluyó por diseño; el trabajo aún no realizado está en los Known gaps del docs/CONFORMANCE.md del módulo. Todos los módulos

Interacciones Skyline

Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.

Diagrama openkeel-skyline.svg Pantalla completa
Las 8 interacciones del modelo
DeAProtocoloQué
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)

Especificaciones