Images, über CDI-DataVolumes in Block-PVCs gespeichert; die vier interoperablen Importmethoden.
Go CDI und CSIopenkeel-glance
Das Modul
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
Auszug aus openkeel-glance/README.md (auf Englisch).
REST-API
83 Operationen der Original-REST-API (Routen und Body-Aktionen) und ihr Status in OpenKeel.
Die Funktionstests von Python-Glance wurden mit ihrer Konfiguration pro Anfrage neu aufgezeichnet und gegen den Go-Dienst wiedergegeben; Client-Erwartungen und Nebenläufigkeit auf Galera werden ebenfalls geprüft.
Replay aufgezeichneter Austausche
E2E-Replay der neu aufgezeichneten Funktionstests
Die Austausche aus 239 funktionalen Python-Tests liefern mit ihren Konfigurationsüberschreibungen und Policy-Regeln dieselben Antworten.
Ausführung
make e2e auf go-mysql-server und MariaDB 11.4; make e2e-strict besteht mit test/e2e/known-differences.txt (116 Dateien, jeweils mit Begründung).
Letztes Ergebnis 1988 / 2442 identisch (81.4 %) auf beiden Engines; die größte Lücke ist der Image-Cache, außerhalb des Umfangs.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Client-Vertrag
Client-Erwartungen
Versionsliste, Locations-API für Nova und Cinder, 204-Downloads, Hashes, Fehlerseiten, JSON-Patch-Typen, copy-image und Image-Schema entsprechen den Erwartungen der Clients.
Ausführung
Geprüft gegen die Erwartungen der reverse-spec 07 § 4, über das Replay und die Handler.
Letztes Ergebnis Alle erfüllt; v2.14 (Cache) wird nie aufgeführt.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Nebenläufigkeit auf Galera
Nebenläufigkeit auf MariaDB Galera
Import-Lock, Upload-Status sowie Erstellungen von Images mit gleicher ID und Namespaces mit gleichem Namen haben über drei Knoten genau einen Gewinner.
Ausführung
make galera-test auf einem Cluster mit 3 Knoten.
Letztes Ergebnis 4 / 4: genau ein Gewinner, kein Fehler entgeht den Wiederholungen, jeder Knoten liest denselben Zustand.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Unit- und Golden Tests
Build und Unit-Tests
Der Dienst wird gebaut und besteht die statischen Prüfungen und seine Unit-Tests.
Ausführung
go build ./..., go vet ./..., go test ./....
Letztes Ergebnis Bestanden.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Im Rewrite ausgelassen
Glance behält die Image-API und die vier Importmethoden, speichert Images aber über CDI auf CSI; damit entfallen der Image-Cache, die übrigen Store-Treiber und die Konvertierung mit qemu-img.
Von der Cloud-Native-Plattform übernommen
Image-Cache und glance-cache-Werkzeuge
Übernommen von CDI
Warum es ausgelassen wurde
Image-Daten werden von CDI in Volumes geklont; ein Dateicache pro Knoten hat keinen Nutzen.
Warum die Lösung nicht beeinträchtigt ist
/v2/cache antwortet 404 wie ein Glance ohne Cache, und glanceclient meldet Cache-Befehle als nicht unterstützt. Der Start aus einem Image erfolgt über CDI-Klone.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Von der Cloud-Native-Plattform übernommen
Stores rbd, swift, s3, cinder und vmware
Übernommen von CDI, CSI (Longhorn)
Warum es ausgelassen wurde
Der csi-Store hält Images als CDI-DataVolumes auf einer konfigurierbaren StorageClass, hinter demselben Store-Vertrag; file und http bleiben für Tests und schreibgeschützte Speicherorte.
Warum die Lösung nicht beeinträchtigt ist
Nova, Cinder, OpenStackClient und Skyline sehen dieselbe API; die Wahl des Speichers wandert in die StorageClass.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Von der Cloud-Native-Plattform übernommen
Plugin image_conversion (qemu-img)
Übernommen von CDI
Warum es ausgelassen wurde
Das Image ist distroless, und CDI konvertiert qcow2 und vmdk auf dem csi-Store bereits nach raw.
Warum die Lösung nicht beeinträchtigt ist
Das Plugin ist nicht konfigurierbar, aber Images werden für VMs weiterhin konvertiert; das hochgeladene Original wird aufbewahrt und standardmäßig beim Download ausgeliefert.
Quelle: openkeel-glance/docs/CONFORMANCE.md
Vereinfachte interne Mechanik
Taskflow-Executor
Warum es ausgelassen wurde
Import-Tasks laufen in einem Goroutine-Pool der Replik statt in taskflow-Threads.
Warum die Lösung nicht beeinträchtigt ist
Gleiche Task-Semantik, Importsperre und Ablaufzeit; der Replay zeigt nur Unterschiede im Timing.
Quelle: openkeel-glance/config/dropped-options.md
Hier ist nur aufgeführt, was bewusst ausgelassen wurde; noch nicht erledigte Arbeit steht in den Known gaps der docs/CONFORMANCE.md des Moduls. Alle Module
Glance-Interaktionen
Dienstansicht, vom Diagramm-Skill aus dem OpenKeel-Modell generiert.