Immagini archiviate in PVC a blocchi tramite i DataVolume di CDI; i quattro metodi di importazione interoperabili.
Go CDI e CSIopenkeel-glance
Il modulo
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
Estratto da openkeel-glance/README.md (in inglese).
API REST
83 operazioni dell'API REST originale (route e azioni nel corpo) e il loro stato in OpenKeel.
I test funzionali di Glance Python sono stati riregistrati con la loro configurazione per richiesta e riprodotti sul servizio Go; vengono verificate anche le aspettative dei client e la concorrenza su Galera.
Replay degli scambi registrati
Replay E2E dei test funzionali riregistrati
Gli scambi di 239 test funzionali Python, con le loro sostituzioni di configurazione e regole di policy, restituiscono le stesse risposte.
Esecuzione
make e2e su go-mysql-server e MariaDB 11.4; make e2e-strict superato con test/e2e/known-differences.txt (116 file, ciascuno con la sua motivazione).
Ultimo risultato 1988 / 2442 identici (81.4 %) su entrambi i motori; la lacuna principale è la cache delle immagini, fuori ambito.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Contratto client
Aspettative dei client
L'elenco delle versioni, l'API locations per Nova e Cinder, i download 204, gli hash, le pagine di errore, i tipi JSON-patch, copy-image e lo schema delle immagini corrispondono a ciò che i client si aspettano.
Esecuzione
Verificato rispetto alle aspettative della reverse-spec 07 § 4, tramite il replay e gli handler.
Ultimo risultato Tutte soddisfatte; v2.14 (cache) non viene mai elencata.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Concorrenza su Galera
Concorrenza su MariaDB Galera
Il lock di importazione, lo stato di upload e le creazioni di immagini con lo stesso id e di namespace con lo stesso nome hanno un solo vincitore su tre nodi.
Esecuzione
make galera-test su un cluster a 3 nodi.
Ultimo risultato 4 / 4: esattamente un vincitore, nessun errore sfugge ai tentativi ripetuti, ogni nodo legge lo stesso stato.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Test unitari e golden test
Build e test unitari
Il servizio viene compilato e supera i controlli statici e i suoi test unitari.
Esecuzione
go build ./..., go vet ./..., go test ./....
Ultimo risultato Superato.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Escluso dal rewrite
Glance mantiene l'API delle immagini e i quattro metodi di importazione ma archivia le immagini tramite CDI su CSI, eliminando la cache delle immagini, gli altri driver di store e la conversione con qemu-img.
Gestito dalla piattaforma Cloud Native
Cache delle immagini e strumenti glance-cache
Gestito da CDI
Perché è stato escluso
I dati delle immagini vengono clonati da CDI nei volumi; una cache di file per nodo non ha alcuna utilità.
Perché la soluzione non ne risente
/v2/cache risponde 404 come un Glance senza cache, e glanceclient segnala i comandi di cache come non supportati. L'avvio da immagine è gestito da cloni CDI.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Gestito dalla piattaforma Cloud Native
Store rbd, swift, s3, cinder e vmware
Gestito da CDI, CSI (Longhorn)
Perché è stato escluso
Lo store csi conserva le immagini come DataVolume CDI su una StorageClass configurabile, dietro lo stesso contratto di store; file e http restano per i test e le posizioni in sola lettura.
Perché la soluzione non ne risente
Nova, Cinder, OpenStackClient e Skyline vedono la stessa API; la scelta dello storage passa alla StorageClass.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Gestito dalla piattaforma Cloud Native
Plugin image_conversion (qemu-img)
Gestito da CDI
Perché è stato escluso
L'immagine è distroless e CDI converte già qcow2 e vmdk in raw sullo store csi.
Perché la soluzione non ne risente
Il plugin non è configurabile, ma le immagini vengono comunque convertite per le VM; l'originale caricato è conservato e servito per impostazione predefinita al download.
Fonte: openkeel-glance/docs/CONFORMANCE.md
Meccanismi interni semplificati
Executor taskflow
Perché è stato escluso
I task di importazione girano in un pool di goroutine della replica anziché in thread taskflow.
Perché la soluzione non ne risente
Stessa semantica dei task, stesso lock di importazione e stessa scadenza; il replay mostra solo differenze di tempistica.
Fonte: openkeel-glance/config/dropped-options.md
Qui è elencato solo ciò che è stato escluso per scelta progettuale; il lavoro non ancora svolto si trova nei Known gaps del docs/CONFORMANCE.md del modulo. Tutti i moduli
Interazioni Glance
Vista del servizio generata dalla skill dei diagrammi a partire dal modello OpenKeel.