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

Components · Compute and capacity

Nova

Instances run as KubeVirt VirtualMachines; conductor with the scheduler in process, one agent per node.

Go KubeVirt and CDIopenkeel-nova

The module

OpenKeel implementation in Go of OpenStack nova (the compute API, its conductor with the scheduler in process, and a per-node compute agent), with KubeVirt as hypervisor and Ironic for bare-metal flavors, 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: same routes, status codes, error bodies, microversions and policies. 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-nova
  • Binaries (one image): nova-api (API on port 8774, health and metrics on 9090), nova-conductor (consumes the conductor queue on RabbitMQ, schedules through Placement, drives KubeVirt and Ironic), nova-compute-agent (DaemonSet on compute nodes: service record, heartbeat, hypervisor row, Placement inventory), nova-ironic-agent (Deployment, one replica active behind a Lease: the same for each Ironic node, rendered when peers.ironic_endpoint is set), nova-console-proxy (Deployment, consoleProxy.enabled: noVNC and console websockets on port 6080, see Consoles below)
  • Backends: the skill reference nova-kubevirt.md (flavor → instancetype/preference, VirtualMachine per server in os-<project>), bare-metal flavors (resources:CUSTOM_BAREMETAL_*=1) to openkeel-ironic, node placement per openkeel-docs/NODE-PLACEMENT.md of the workspace
  • 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-nova/README.md (in English).

REST API

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

  • 141Implemented
  • 1Partial
  • 75Not implemented
  • 56Removed upstream

How compatibility is tested

The API-sample exchanges of Python Nova are replayed against the Go service, concurrency is tested on Galera, and real KubeVirt guests are booted and drained on the lab.

Replay of recorded exchanges

E2E replay of the API samples

Each recorded API-sample exchange of Python Nova gives the same status and body from the Go service, on a fresh database per file.

How it runs

make e2e (1233 files), on go-mysql-server and on MariaDB 11.4 with E2E_MYSQL_DSN; report in test/e2e/report.json.

Latest result 1957 / 2590 identical on both engines; remaining differences are mainly unimplemented APIs (501) and tests that stub the database.

Source: openkeel-nova/docs/CONFORMANCE.md

Unit and golden tests

Unit, policy and flavor vectors

Router pipeline, validation messages, the 214 policy rules, state map, scheduler resources and flavor-to-KubeVirt conversion behave as specified.

How it runs

make test; flavor vectors in internal/driver/kubevirt/flavor_test.go.

Latest result Pass; flavor to KubeVirt vectors 6 / 6.

Source: openkeel-nova/docs/CONFORMANCE.md

Concurrency on Galera

Concurrency on MariaDB Galera

Quotas, unique names and concurrent actions hold when requests arrive through three Galera nodes at once.

How it runs

test/galera on a 3-node cluster: concurrent boots, key pairs, server groups, same-name creations and stops.

Latest result Pass, 3 runs out of 3: exactly 10 servers for a quota of 10 out of 30 boots, no 5xx.

Source: openkeel-nova/docs/CONFORMANCE.md

End to end on a lab

VM NICs on Neutron ports, real guests

POST /servers with Neutron ports boots real guests that get their Neutron addresses, are isolated between projects and survive live migration.

How it runs

Disposable kind cluster, openkeel-lab profile dataplane: real OVN, KubeVirt v1.9.1, cirros guests, real Glance, Placement and Neutron.

Latest result Pass (2026-10-31); live migration through the conductor on a local-path disk is refused by KubeVirt and covered by unit tests only.

Source: openkeel-nova/docs/CONFORMANCE.md

Scenario

kubectl drain of a compute node

A drain live-migrates the guest, and Nova adopts the migration: host, port binding, OVN chassis and Placement allocation follow.

How it runs

openkeel-lab/scripts/drain-test.sh on the dataplane lab, with two servers created by POST /servers.

Latest result Pass (2026-10-31); a peer lost 1 ping out of 55. No shared disk migrated, no node fully emptied.

Source: openkeel-nova/docs/CONFORMANCE.md

Tempest

Tempest compute

The upstream Tempest compute API tests against a deployed Nova.

How it runs

Needs a kind cluster with KubeVirt, CDI, Longhorn and the OpenKeel peers.

Latest result Not run.

Source: openkeel-nova/docs/CONFORMANCE.md

Left out of the rewrite

Nova keeps its API and scheduling model but hands the hypervisor to KubeVirt, which removes cells, per-host nova-compute services and the deprecated proxy APIs.

Internal machinery simplified

Cells v2, cell0 and build requests

Why it was left out

A Kubernetes-native deployment runs one cell: one schema holds the tables of nova_api and the cell database, and the instance row is written at once.

Why the solution is not affected

API-visible concepts (instance mappings, request specs, BUILD and ERROR states with faults) are kept, so clients see the same server lifecycle.

Source: openkeel-nova/docs/CONFORMANCE.md

Done by the Cloud Native platform

Per-host nova-compute and libvirt drivers

Taken over by KubeVirt

Why it was left out

KubeVirt runs the guests cluster-wide; the conductor drives it through one RabbitMQ quorum queue and the scheduler is a library of the conductor. A per-node agent only reports resources.

Why the solution is not affected

Boot, stop, resize, live migration and drain work through KubeVirt; the libvirt, VMware and Hyper-V option groups disappear with the drivers.

Source: openkeel-nova/docs/CONFORMANCE.md

Obsolete or unused upstream

Deprecated proxy APIs (images, volumes, networks)

Why it was left out

The proxies to Glance, Cinder and Neutron (images, os-volumes, os-snapshots, os-networks, os-floating-ips, os-security-groups, os-hosts, os-baremetal-nodes) are deprecated upstream.

Why the solution is not affected

These routes answer 501. Current clients, including ok and Skyline, call Glance, Cinder and Neutron directly, which OpenKeel provides.

Source: openkeel-nova/docs/PLAN.md

Done by the Cloud Native platform

Suspend to disk

Taken over by KubeVirt

Why it was left out

KubeVirt has no save of guest memory to disk.

Why the solution is not affected

suspend is accepted but stops the VM: the guest's memory state is lost and it boots again on resume. Disks and data are kept.

Source: openkeel-nova/docs/CONFORMANCE.md

Done by the Cloud Native platform

network-vif-plugged wait and VIF plugging timeouts

Taken over by OVN CNI

Why it was left out

KubeVirt starts the guest once the CNI plugin has seen OVN program its ports; Nova no longer holds a paused guest waiting for the event.

Why the solution is not affected

The server stays BUILD until Neutron reports its ports ACTIVE. The event is still accepted, so Neutron is unchanged and a lost event costs nothing.

Source: openkeel-nova/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

Nova interactions

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

Diagram openkeel-nova.svg Full screen
The 22 interactions of the model
FromToProtocolWhat
SkylineNova APIREST APIaggregated lists
Nova APIPlacementREST APIusages, quotas
Nova APIGlanceREST APIimage metadata
Nova APINeutron serverREST APIports
Nova APICinder APIREST APIvolume attach
Nova APIBarbicanREST APIencryption keys
Neutron serverNova APIREST APInetwork-vif-plugged
Cinder APINova APIREST APIvolume events
Masakari engine + monitorsNova APIREST APIserver state, host disable
Nova APINova conductor + schedulerRabbitMQRPC build/resize
Nova conductor + schedulerNova compute agentRabbitMQRPC
Nova conductor + schedulerPlacementREST APIallocation candidates, claims
Nova compute agentPlacementREST APIinventory, traits
Nova conductor + schedulerKubeVirtKubernetes APIVirtualMachine, Instancetype, Preference
Nova console proxyKubeVirtKubernetes APIVNC and serial websockets, console log
Nova APINova console proxyREST APIconsole log, with a token
Nova compute agentKubernetes API serverKubernetes APIwatch node allocatable
Nova conductor + schedulerIronic APIREST APIbare metal flavors: provision nodes
Nova compute agentIronic APIREST APInodes → Placement inventory (planned)
Heat engineNova APIREST APIOS::Nova::*
EC2 APINova APIREST APIinstances
Nova conductor + schedulerCDIKubernetes APIroot DataVolume: clone of the image PVC

Specifications