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