Inventarios de recursos y asignaciones; el primer componente reescrito en Go.
Go MariaDB Galeraopenkeel-placement
El módulo
OpenKeel implementation in Go of OpenStack placement (placement-api), generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. It replaces the Python service without its clients noticing: same routes, status codes, error bodies, microversions and policies. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist is in docs/SECURITY.md.
Go module: github.com/openkeel/openkeel-placement
Binary: placement-api (API on port 8778, health and metrics 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-placement/README.md (en inglés).
API REST
37 operaciones de la API REST original (rutas y acciones de cuerpo) y su estado en OpenKeel.
Los intercambios gabbi grabados de Placement en Python se reproducen contra el servicio Go, y la propia suite funcional de Nova se ejecuta con el servicio Go en lugar de Placement en Python.
Replay de los intercambios grabados
Replay E2E de los intercambios gabbi
Cada petición de los 79 archivos gabbi upstream da el mismo estado y el mismo cuerpo que el servicio Python grabado.
Ejecución
make e2e, con E2E_MYSQL_DSN para MariaDB; informe en test/e2e/report.json, diferencias enumeradas en known-differences.txt.
Último resultado 1303 / 1316 idénticos en MariaDB 11.4 (1301 / 1316 en go-mysql-server); ninguna de las diferencias restantes es un error funcional.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Tests unitarios y golden tests
Casos del algoritmo allocation-candidates
El algoritmo allocation-candidates devuelve los mismos candidatos que Python en 83 casos grabados, con hasta 6000 providers.
Ejecución
go test -tags e2e -run TestAllocationCandidateCases ./test/e2e/; informe en test/e2e/cases-report.json.
Último resultado 81 / 83 idénticos, 83 / 83 en el número de candidatos.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Test diferencial
Tests funcionales de Nova contra Placement en Go
La suite de tests funcionales de Nova se supera cuando cada llamada a Placement la sirve el servicio Go en lugar de Placement en Python.
Ejecución
Los tests funcionales de Nova se ejecutan mediante test/nova-functional/run.sh, en go-mysql-server y MariaDB 11.4, comparados con una referencia de Placement en Python.
Último resultado Subconjunto 859 / 859 en MariaDB 11.4 (como Python); suite completa 3314 superados, 1 fallido (un error del motor) en go-mysql-server (2026-10-28).
Las asignaciones concurrentes a través de tres instancias del servicio en tres nodos Galera nunca sobreasignan un resource provider.
Ejecución
GALERA_DSNS=... go test -tags galera ./test/galera/ en un clúster MariaDB Galera 11.4 de 3 nodos.
Último resultado Superado: 180 asignaciones concurrentes para 100 VCPU dan exactamente 100 asignaciones, 0 estados inesperados.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Tempest
Tempest con un Placement real
Tempest y tests funcionales de Nova contra un Placement desplegado en un clúster.
Ejecución
Requiere un clúster kind (reverse-spec 07 § 7 paso 5).
Último resultado No ejecutado.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Excluido del rewrite
Placement conserva toda su API y solo prescinde del modo de prueba sin autenticación, las antiguas migraciones de datos y la infraestructura de servicio oslo que Kubernetes ya proporciona.
Mecánica interna simplificada
Modo sin autenticación noauth2
Por qué se excluyó
Una API sin autenticación no tiene cabida en producción; las suites de pruebas inyectan en su lugar un validador de tokens.
Por qué la solución no se ve afectada
Los clientes siempre se autentican a través de Keystone, como en cualquier despliegue real. Nova, Neutron y osc-placement no se ven afectados.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Obsoleto o sin uso en upstream
Migraciones de datos en línea para bases de datos antiguas
Por qué se excluyó
set_root_provider_ids y create_incomplete_consumers solo corrigen bases de datos anteriores a la rama reproducida.
Por qué la solución no se ve afectada
Una base de datos nueva o actualizada nunca las necesita; las bases de datos anteriores a la rama se rechazan en lugar de migrarse in situ.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Middleware CORS
Asumido por Ingress (Gateway API)
Por qué se excluyó
Las cabeceras cross-origin corresponden al borde HTTP, no a cada proceso de API.
Por qué la solución no se ve afectada
Ningún cliente de OpenKeel llama a Placement desde un navegador en otro origen; cuando es necesario, CORS se configura una sola vez en el ingress.
Fuente: openkeel-placement/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Logs en archivos, osprofiler, middleware healthcheck
Asumido por Kubernetes probes, OpenTelemetry
Por qué se excluyó
Los logs van a stdout en JSON, las trazas a OpenTelemetry y el estado de salud a las probes de Kubernetes; 101 de las 108 opciones oslo dejaron de ser útiles.
Por qué la solución no se ve afectada
Los operadores obtienen la misma información con las herramientas de logs, trazas y probes del clúster; la API no cambia.
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 Placement
Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.