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.
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.