Images stockées dans des PVC bloc via des DataVolumes CDI ; les quatre méthodes d'import interopérables.
Go CDI et CSIopenkeel-glance
Le module
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
Extrait de openkeel-glance/README.md (en anglais).
API REST
83 opérations de l'API REST d'origine (routes et actions de corps), et leur état dans OpenKeel.
Les tests fonctionnels de Glance Python ont été réenregistrés avec leur configuration par requête et rejoués contre le service Go ; les attentes des clients et la concurrence sur Galera sont également vérifiées.
Rejeu des échanges enregistrés
Rejeu E2E des tests fonctionnels réenregistrés
Les échanges de 239 tests fonctionnels Python, avec leurs surcharges de configuration et leurs règles de politique, donnent les mêmes réponses.
Exécution
make e2e sur go-mysql-server et MariaDB 11.4 ; make e2e-strict réussit avec test/e2e/known-differences.txt (116 fichiers, chacun avec sa raison).
Dernier résultat 1988 / 2442 identiques (81.4 %) sur les deux moteurs ; le principal écart est le cache d'images, hors périmètre.
Source : openkeel-glance/docs/CONFORMANCE.md
Contrat client
Attentes des clients
La liste des versions, l'API locations pour Nova et Cinder, les téléchargements 204, les empreintes, les pages d'erreur, les types JSON-patch, copy-image et le schéma d'image correspondent aux attentes des clients.
Exécution
Vérifié par rapport aux attentes de la reverse-spec 07 § 4, via le rejeu et les handlers.
Dernier résultat Toutes satisfaites ; v2.14 (cache) n'est jamais listée.
Source : openkeel-glance/docs/CONFORMANCE.md
Concurrence sur Galera
Concurrence sur MariaDB Galera
Le verrou d'import, le statut d'upload, les créations d'image de même id et de namespace de même nom n'ont qu'un gagnant sur trois nœuds.
Exécution
make galera-test sur un cluster à 3 nœuds.
Dernier résultat 4 / 4 : exactement un gagnant, aucune erreur n'échappe aux nouvelles tentatives, chaque nœud lit le même état.
Source : openkeel-glance/docs/CONFORMANCE.md
Tests unitaires et golden tests
Build et tests unitaires
Le service se compile, passe les vérifications statiques et ses tests unitaires.
Exécution
go build ./..., go vet ./..., go test ./....
Dernier résultat Réussi.
Source : openkeel-glance/docs/CONFORMANCE.md
Écarté de la réécriture
Glance conserve l'API d'images et les quatre méthodes d'import mais stocke les images via CDI sur CSI, ce qui supprime le cache d'images, les autres drivers de store et la conversion qemu-img.
Assuré par la plateforme Cloud Native
Cache d'images et outils glance-cache
Repris par CDI
Pourquoi c'est écarté
Les données d'image sont clonées par CDI dans des volumes ; un cache de fichiers par nœud n'a aucune utilité.
Pourquoi la solution n'est pas affectée
/v2/cache répond 404 comme un Glance sans cache, et glanceclient signale les commandes de cache comme non prises en charge. Le démarrage depuis une image est assuré par des clones CDI.
Source : openkeel-glance/docs/CONFORMANCE.md
Assuré par la plateforme Cloud Native
Stores rbd, swift, s3, cinder et vmware
Repris par CDI, CSI (Longhorn)
Pourquoi c'est écarté
Le store csi conserve les images sous forme de DataVolumes CDI sur une StorageClass configurable, derrière le même contrat de store ; file et http restent pour les tests et les emplacements en lecture seule.
Pourquoi la solution n'est pas affectée
Nova, Cinder, OpenStackClient et Skyline voient la même API ; le choix du stockage passe à la StorageClass.
Source : openkeel-glance/docs/CONFORMANCE.md
Assuré par la plateforme Cloud Native
Plugin image_conversion (qemu-img)
Repris par CDI
Pourquoi c'est écarté
L'image est distroless et CDI convertit déjà qcow2 et vmdk en raw sur le store csi.
Pourquoi la solution n'est pas affectée
Le plugin n'est pas configurable, mais les images sont toujours converties pour les VM ; l'original téléversé est conservé et servi par défaut au téléchargement.
Source : openkeel-glance/docs/CONFORMANCE.md
Mécanique interne simplifiée
Exécuteur taskflow
Pourquoi c'est écarté
Les tâches d'import s'exécutent dans un pool de goroutines de la réplique au lieu de threads taskflow.
Pourquoi la solution n'est pas affectée
Même sémantique des tâches, même verrou d'import et même expiration ; le rejeu ne montre que des écarts de durée.
Seul ce qui a été écarté par choix de conception figure ici ; le travail pas encore fait se trouve dans les Known gaps du docs/CONFORMANCE.md du module. Tous les modules
Interactions de Glance
Vue « service » générée par la skill diagramme depuis le modèle d'OpenKeel.