Upstream OpenStack Ironic (Python, 2026.2) in OpenKeel: a Helm chart, not a Go rewrite. Design, decisions and evidence are in openkeel-docs/IRONIC-DESIGN.md.
Excerpt from openkeel-ironic/README.md (in English).
REST API
131 operations of the original REST API (routes and body actions), and their state in OpenKeel.
Ironic stays the upstream Python service in a Helm chart; tests check that it works through Go Keystone, the standard client and Go Nova, on a fake Redfish machine.
End to end on a lab
Smoke test on fake Redfish hardware
openstack baremetal through Go Keystone enrols a sushy-tools machine, walks it to available, deploys to wait call-back and undeploys.
How it runs
openkeel-ironic/test/smoke.sh from a client pod (python-ironicclient 6.3.0) on a kind cluster.
Latest result Verified (2026-10-31). No machine boots: IPA and active are not covered.
Source: openkeel-docs/IRONIC-DESIGN.md
End to end on a lab
okadm install, lab and production
The chart installed by okadm install --components ironic passes the smoke test in both deployment modes.
How it runs
okadm install in lab mode (kind, 3 nodes) and production mode (3 API, 2 conductors, Galera 3), then smoke.sh on each.
Latest result Run on 2026-11-02; production on kind needed two test-only additions (DNS NetworkPolicy workaround, automated_clean: false).
Source: openkeel-docs/IRONIC-DESIGN.md
Scenario
Bare metal server through Nova
openstack server create with a bare metal flavor drives Ironic through Go Nova, and delete frees the node.
How it runs
openkeel-ironic/test/nova.sh on a lab with Nova and Ironic, Neutron flat and sushy-tools.
Latest result Verified on kind up to wait call-back; a real machine, IPA, the config drive and active not verified.
Source: openkeel-nova/docs/CONFORMANCE.md
Left out of the rewrite
Ironic stays upstream Python in an OpenKeel chart, deployed without RabbitMQ, Swift temporary URLs or the Kolla start-up scripts.
Internal machinery simplified
RabbitMQ RPC between API and conductor
Why it was left out
Ironic needs RabbitMQ for nothing else; json-rpc on the conductor's port 8089, with per-Pod DNS names from the StatefulSet, does the same job.
Why the solution is not affected
API and conductor behave as upstream; notifications stay off. JSON-RPC is not yet encrypted, and a NetworkPolicy limits it to the API.
Source: openkeel-docs/IRONIC-DESIGN.md
Internal machinery simplified
Swift temporary URLs for images
Why it was left out
OpenKeel has no Swift service of its own.
Why the solution is not affected
Images and config drives are served by the conductor's HTTP server (image_download_source http, configdrive_use_object_store false), so deployment still works.
Source: openkeel-docs/IRONIC-DESIGN.md
Internal machinery simplified
Kolla start-up scripts and sudo
Taken over by Kubernetes
Why it was left out
The Kolla images are pinned by digest and their binaries run directly, configured from a ConfigMap, without kolla_start or sudo.
Why the solution is not affected
Same Ironic code; the API and conductor run unprivileged with a read-only root and no capabilities.
Source: openkeel-docs/IRONIC-DESIGN.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
Ironic interactions
Service view generated by the diagram skill from the OpenKeel model.