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.
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.