Imágenes almacenadas en PVC de bloque mediante DataVolumes de CDI; los cuatro métodos de importación interoperables.
Go CDI y CSIopenkeel-glance
El módulo
OpenKeel implementation in Go of OpenStack Glance, the image service, 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 (Nova, Cinder, glanceclient/OpenStackClient, Skyline): same routes, status codes, webob error pages, policies, image state machine, data path (md5 + multihash, format inspection) and the four interoperable import methods. Image data lives in PVCs of a block StorageClass (Longhorn by default) through CDI DataVolumes. 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-glance
Binaries: glance-api (API on port 9292, health and metrics on 9090, import tasks in its task pool), glance-scrubber (delayed delete), glance-manage (db sync, db load_metadefs)
Stores: csi (CDI DataVolume img-<image id> in namespace openkeel-images, shared with openkeel-cinder and openkeel-nova; the uploaded bytes are also kept as sent on a ReadWriteMany volume, so downloads match the checksums of qcow2/vmdk images that CDI converts to raw), file (development, tests, staging), http (read-only locations)
Conformance: 1988 of 2442 recorded exchanges replayed identically (go-mysql-server and MariaDB 11.4), Galera concurrency test 4/4
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-glance/README.md (en inglés).
API REST
83 operaciones de la API REST original (rutas y acciones de cuerpo) y su estado en OpenKeel.
Los tests funcionales de Glance en Python se regrabaron con su configuración por petición y se reprodujeron contra el servicio Go; también se verifican las expectativas de los clientes y la concurrencia en Galera.
Replay de los intercambios grabados
Replay E2E de los tests funcionales regrabados
Los intercambios de 239 tests funcionales de Python, con sus sustituciones de configuración y sus reglas de políticas, dan las mismas respuestas.
Ejecución
make e2e en go-mysql-server y MariaDB 11.4; make e2e-strict se supera con test/e2e/known-differences.txt (116 archivos, cada uno con su motivo).
Último resultado 1988 / 2442 idénticos (81.4 %) en ambos motores; la principal carencia es la caché de imágenes, fuera del alcance.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Contrato de cliente
Expectativas de los clientes
La lista de versiones, la API de locations para Nova y Cinder, las descargas 204, los hashes, las páginas de error, los tipos JSON-patch, copy-image y el esquema de imagen coinciden con lo que esperan los clientes.
Ejecución
Verificado frente a las expectativas de la reverse-spec 07 § 4, mediante el replay y los handlers.
Último resultado Todas se cumplen; v2.14 (caché) nunca se enumera.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Concurrencia en Galera
Concurrencia en MariaDB Galera
El bloqueo de importación, el estado de carga y las creaciones de imágenes con el mismo id y de namespaces con el mismo nombre tienen un único ganador a través de tres nodos.
Ejecución
make galera-test en un clúster de 3 nodos.
Último resultado 4 / 4: exactamente un ganador, ningún error escapa a los reintentos, cada nodo lee el mismo estado.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Tests unitarios y golden tests
Build y tests unitarios
El servicio se compila y supera las comprobaciones estáticas y sus tests unitarios.
Ejecución
go build ./..., go vet ./..., go test ./....
Último resultado Superado.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Excluido del rewrite
Glance conserva la API de imágenes y los cuatro métodos de importación, pero almacena las imágenes mediante CDI sobre CSI, lo que elimina la caché de imágenes, los demás drivers de store y la conversión con qemu-img.
Asumido por la plataforma Cloud Native
Caché de imágenes y herramientas glance-cache
Asumido por CDI
Por qué se excluyó
CDI clona los datos de las imágenes en volúmenes; una caché de archivos por nodo no tiene utilidad.
Por qué la solución no se ve afectada
/v2/cache responde 404 como un Glance sin caché, y glanceclient indica que los comandos de caché no son compatibles. El arranque desde imagen se resuelve con clones de CDI.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Stores rbd, swift, s3, cinder y vmware
Asumido por CDI, CSI (Longhorn)
Por qué se excluyó
El store csi guarda las imágenes como DataVolumes de CDI en una StorageClass configurable, tras el mismo contrato de store; file y http se mantienen para pruebas y ubicaciones de solo lectura.
Por qué la solución no se ve afectada
Nova, Cinder, OpenStackClient y Skyline ven la misma API; la elección del almacenamiento pasa a la StorageClass.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Plugin image_conversion (qemu-img)
Asumido por CDI
Por qué se excluyó
La imagen es distroless y CDI ya convierte qcow2 y vmdk a raw en el store csi.
Por qué la solución no se ve afectada
El plugin no es configurable, pero las imágenes se siguen convirtiendo para las VM; el original subido se conserva y se sirve por defecto en la descarga.
Fuente: openkeel-glance/docs/CONFORMANCE.md
Mecánica interna simplificada
Ejecutor de taskflow
Por qué se excluyó
Las tareas de importación se ejecutan en un pool de goroutines de la réplica en lugar de en hilos de taskflow.
Por qué la solución no se ve afectada
Misma semántica de tareas, bloqueo de importación y caducidad; la reproducción solo muestra diferencias de tiempo.
Fuente: openkeel-glance/config/dropped-options.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 Glance
Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.