OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Components · Storage

Glance

Images stored in block PVCs through CDI DataVolumes; the four interoperable import methods.

Go CDI and CSIopenkeel-glance

The 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

Excerpt from openkeel-glance/README.md (in English).

REST API

83 operations of the original REST API (routes and body actions), and their state in OpenKeel.

  • 76Implemented
  • 7Partial

How compatibility is tested

Python Glance's functional tests were re-recorded with their per-request configuration and replayed against the Go service; client expectations and Galera concurrency are checked too.

Replay of recorded exchanges

E2E replay of re-recorded functional tests

The exchanges of 239 Python functional tests, with their configuration overrides and policy rules, give the same answers.

How it runs

make e2e on go-mysql-server and MariaDB 11.4; make e2e-strict passes with test/e2e/known-differences.txt (116 files, each with its reason).

Latest result 1988 / 2442 identical (81.4 %) on both engines; the main gap is the image cache, out of scope.

Source: openkeel-glance/docs/CONFORMANCE.md

Client contract

Client expectations

Version list, locations API for Nova and Cinder, 204 downloads, hashes, error pages, JSON-patch types, copy-image and image schema match what the clients expect.

How it runs

Checked against reverse-spec 07 § 4 expectations, through the replay and the handlers.

Latest result All met; v2.14 (cache) is never listed.

Source: openkeel-glance/docs/CONFORMANCE.md

Concurrency on Galera

Concurrency on MariaDB Galera

Import lock, upload status, same-id image and same-name namespace creations have one winner through three nodes.

How it runs

make galera-test on a 3-node cluster.

Latest result 4 / 4: exactly one winner, no error escapes the retries, every node reads the same state.

Source: openkeel-glance/docs/CONFORMANCE.md

Unit and golden tests

Build and unit tests

The service builds, passes static checks and its unit tests.

How it runs

go build ./..., go vet ./..., go test ./....

Latest result Pass.

Source: openkeel-glance/docs/CONFORMANCE.md

Left out of the rewrite

Glance keeps the image API and the four import methods but stores images through CDI on CSI, which removes the image cache, the other store drivers and qemu-img conversion.

Done by the Cloud Native platform

Image cache and glance-cache tools

Taken over by CDI

Why it was left out

Image data is cloned by CDI into volumes; a per-node file cache has no use.

Why the solution is not affected

/v2/cache answers 404 as on a Glance without cache, and glanceclient reports cache commands as not supported. Boot from image is served by CDI clones.

Source: openkeel-glance/docs/CONFORMANCE.md

Done by the Cloud Native platform

rbd, swift, s3, cinder and vmware stores

Taken over by CDI, CSI (Longhorn)

Why it was left out

The csi store keeps images as CDI DataVolumes on a configurable StorageClass, behind the same store contract; file and http remain for tests and read-only locations.

Why the solution is not affected

Nova, Cinder, OpenStackClient and Skyline see the same API; storage choice moves to the StorageClass.

Source: openkeel-glance/docs/CONFORMANCE.md

Done by the Cloud Native platform

image_conversion plugin (qemu-img)

Taken over by CDI

Why it was left out

The image is distroless and CDI already converts qcow2 and vmdk to raw on the csi store.

Why the solution is not affected

The plugin cannot be configured, but images are still converted for VMs; the uploaded original is kept and served on download by default.

Source: openkeel-glance/docs/CONFORMANCE.md

Internal machinery simplified

Taskflow executor

Why it was left out

Import tasks run in a goroutine pool of the replica instead of taskflow threads.

Why the solution is not affected

Same task semantics, import lock and expiry; the replay shows timing differences only.

Source: openkeel-glance/config/dropped-options.md

Only what was left out by design is listed here; the work not done yet is in the Known gaps of the module's docs/CONFORMANCE.md. Every module

Glance interactions

Service view generated by the diagram skill from the OpenKeel model.

Diagram openkeel-glance.svg Full screen
The 9 interactions of the model
FromToProtocolWhat
SkylineGlanceREST APIimages
Nova APIGlanceREST APIimage metadata
Cinder APIGlanceREST APIvolume from image
GlanceBarbicanREST APIimage signatures
GlanceGlance store driverREST APIin-process driver
Glance store driverCDIKubernetes APIDataVolume upload (upload proxy), import, clone
Ironic conductorGlanceREST APIimage download (cache)
EC2 APIGlanceREST APIAMIs
Glance store driverKubeVirtKubernetes APIVirtualMachineExport (download without keep_original)

Specifications