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

Components · Storage

Cinder

Block volumes are PVCs of a CSI StorageClass (Rook-Ceph, Longhorn, NetApp, Huawei Dorado, Pure Storage), with CSI snapshots and cinder-backup backups.

Go Any block CSIopenkeel-cinder

The module

OpenKeel implementation in Go of OpenStack Cinder, the Block Storage API v3, 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, Glance's cinder store, python-cinderclient, Skyline): same routes, status codes, error bodies, microversions 3.0–3.71 and policies. Volumes are Kubernetes PVCs on a block CSI StorageClass (Longhorn by default), snapshots and backups are CSI VolumeSnapshots, volumes from images are CDI clones, and attachments are KubeVirt hotplugs. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist is in docs/SECURITY.md; the build plan with the status of every operation is in docs/PLAN.md.

  • Go module: github.com/openkeel/openkeel-cinder
  • Binaries (one image): | Binary | Role | Ports | |---|---|---| | cinder-api | REST API v3; also -migrate for the database migrations | 8776, admin 9090 | | cinder-scheduler | places volumes on backends and backups on backup hosts, purges expired reservations and messages | admin 9090 | | cinder-volume | drives PVCs, VolumeSnapshots, DataVolumes and PV handovers for the volumes of its backends | admin 9090 | | cinder-backup | creates, deletes and restores backups (VolumeSnapshots of the backup class) | admin 9090 | The workers poll the database for transient statuses and elect one active replica each with a Kubernetes Lease.
  • 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-cinder/README.md (in English).

REST API

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

  • 147Implemented
  • 25Partial
  • 46Not implemented

How compatibility is tested

Python Cinder's functional-test exchanges are replayed against the Go service, Nova's attachment contract is tested, and concurrency is checked on Galera.

Replay of recorded exchanges

E2E replay of functional tests

967 exchanges of 196 Python functional tests give the same status and body, with the functional-test fixture emulated.

How it runs

make e2e, on go-mysql-server and MariaDB 11.4 (E2E_MYSQL_DSN); E2E_STRICT=1 passes with test/e2e/known-differences.txt.

Latest result 832 / 967 identical (834 on MariaDB); in scope only 832 / 854 (97.4 %), the rest being groups and manage (out of scope).

Source: openkeel-cinder/docs/CONFORMANCE.md

Client contract

Nova attachment contract

Attachments API at 3.44, idempotent update and delete, service-token rule and error statuses that Nova maps match its expectations.

How it runs

TestNovaAttachmentFlow, router tests and TestQuotaExceeded.

Latest result Tested; os-reimage and Nova external events implemented but not replayed against Nova.

Source: openkeel-cinder/docs/CONFORMANCE.md

Unit and golden tests

Unit, policy and flow tests

Policy personas on 161 of the 167 default rules, quota and transfer vectors, router rules and the CSI driver behave as specified.

How it runs

go test ./... (13 packages), CSI driver on client-go fakes.

Latest result All pass.

Source: openkeel-cinder/docs/CONFORMANCE.md

Concurrency on Galera

Concurrency on MariaDB Galera

Quota and reservation hold when creations arrive through three Galera nodes at once.

How it runs

make galera-test on a 3-node cluster: 30 creations for a quota of 10, 9 concurrent os-reserve.

Latest result Pass, 3 runs out of 3: exactly 10 × 202, 20 × 413, no 5xx; one os-reserve winner.

Source: openkeel-cinder/docs/CONFORMANCE.md

Tempest

Tempest and client replays

Tempest tempest/api/volume, cinder-tempest-plugin and replays of cinderclient, Nova and Glance store calls.

How it runs

Need a kind cluster with Keystone, Longhorn, CDI and KubeVirt; no recorded client invocations exist.

Latest result Not run.

Source: openkeel-cinder/docs/CONFORMANCE.md

Left out of the rewrite

Cinder keeps the volume API but delegates the data path to CSI (Longhorn by default), which removes vendor drivers, backend migration and replication, and the RPC topology.

Done by the Cloud Native platform

Vendor volume drivers and FC zone manager

Taken over by CSI (Longhorn by default)

Why it was left out

Every backend is a CSI StorageClass with CSI snapshots and KubeVirt hotplug; connection info is a kubernetes_pvc that the OpenKeel Nova consumes.

Why the solution is not affected

Nova, Glance's cinder store, cinderclient and Skyline use the same API. Any storage with a CSI driver can be a backend.

Source: openkeel-cinder/docs/CONFORMANCE.md

Done by the Cloud Native platform

Volume migration between backends

Taken over by CSI

Why it was left out

Data copy between StorageClasses goes through retype with the on-demand migration policy.

Why the solution is not affected

os-migrate_volume answers 400 with a message pointing to os-retype, which moves the data.

Source: openkeel-cinder/docs/CONFORMANCE.md

Done by the Cloud Native platform

Cinder replication and failover_host

Taken over by CSI

Why it was left out

CSI backends have no Cinder-managed replication.

Why the solution is not affected

failover_host answers 400 'no replication target configured'. Redundancy is the storage backend's own, configured outside the Cinder API.

Source: openkeel-cinder/docs/CONFORMANCE.md

Done by the Cloud Native platform

Barbican key per encrypted volume

Taken over by Longhorn encrypted volumes

Why it was left out

Encryption is done by the StorageClass, so Cinder's path needs no key manager.

Why the solution is not affected

Encrypted volume types still work; a fixed key id is recorded and hidden from 3.64 views.

Source: openkeel-cinder/docs/CONFORMANCE.md

Internal machinery simplified

RPC casts and per-pool stats scheduling

Why it was left out

The API records the transient status and the workers poll the database; CSI drivers report no capacity, so there is one pool per backend and AZ.

Why the solution is not affected

Volume states and API answers are unchanged; interrupted operations are resumed by the next pass, so workers/cleanup returns empty lists.

Source: openkeel-cinder/docs/CONFORMANCE.md

Internal machinery simplified

Active-active clusters and os-hosts

Taken over by Kubernetes Leases

Why it was left out

Each worker holds one Kubernetes Lease, so Cinder's active-active clusters do not exist.

Why the solution is not affected

Cluster and os-hosts lists are empty and writes answer 501; high availability comes from the Lease takeover.

Source: openkeel-cinder/docs/CONFORMANCE.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

Cinder interactions

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

Diagram openkeel-cinder.svg Full screen
The 10 interactions of the model
FromToProtocolWhat
SkylineCinder APIREST APIaggregated lists
Nova APICinder APIREST APIvolume attach
Cinder APINova APIREST APIvolume events
Cinder APIGlanceREST APIvolume from image
Cinder APICinder volume driverRabbitMQRPC create/attach
Cinder volume driverCSI driver (Longhorn)Kubernetes APIPVC (Block), VolumeSnapshot
Cinder volume driverKubeVirtKubernetes APIvolume hotplug
Heat engineCinder APIREST APIOS::Cinder::*
EC2 APICinder APIREST APIvolumes, snapshots
Zun computeCinder APIREST APIattachments → kubernetes_pvc

Specifications