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

Componentes · Almacenamiento

Glance

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.

  • 76Implementado
  • 7Parcial

Cómo se prueba la compatibilidad

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.

Diagrama openkeel-glance.svg Pantalla completa
Las 9 interacciones del modelo
DeAProtocoloQué
SkylineGlanceAPI RESTimages
Nova APIGlanceAPI RESTimage metadata
Cinder APIGlanceAPI RESTvolume from image
GlanceBarbicanAPI RESTimage signatures
GlanceGlance store driverAPI RESTin-process driver
Glance store driverCDIAPI de KubernetesDataVolume upload (upload proxy), import, clone
Ironic conductorGlanceAPI RESTimage download (cache)
EC2 APIGlanceAPI RESTAMIs
Glance store driverKubeVirtAPI de KubernetesVirtualMachineExport (download without keep_original)

Especificaciones