OpenKeel: la solución Cloud soberana, francesa y de alcance europeo, del grupo inherent Descubrir inherent

Componentes · Cómputo y capacidad

Nova

Las instancias se ejecutan como VirtualMachines de KubeVirt; conductor con el scheduler integrado en el proceso, un agente por nodo.

Go KubeVirt y CDIopenkeel-nova

El módulo

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

Extracto de openkeel-nova/README.md (en inglés).

API REST

273 operaciones de la API REST original (rutas y acciones de cuerpo) y su estado en OpenKeel.

  • 141Implementado
  • 1Parcial
  • 75No implementado
  • 56Eliminado upstream

Cómo se prueba la compatibilidad

Los intercambios de los ejemplos de API de Nova en Python se reproducen contra el servicio Go, la concurrencia se prueba en Galera y en el laboratorio se arrancan y drenan instancias KubeVirt reales.

Replay de los intercambios grabados

Replay E2E de los ejemplos de API

Cada intercambio grabado de los ejemplos de API de Nova en Python da el mismo estado y el mismo cuerpo desde el servicio Go, con una base de datos nueva por archivo.

Ejecución

make e2e (1233 archivos), en go-mysql-server y en MariaDB 11.4 con E2E_MYSQL_DSN; informe en test/e2e/report.json.

Último resultado 1957 / 2590 idénticos en ambos motores; las diferencias restantes son sobre todo API no implementadas (501) y tests que simulan la base de datos.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Tests unitarios y golden tests

Vectores unitarios, de políticas y de flavor

El pipeline del router, los mensajes de validación, las 214 reglas de políticas, la tabla de estados, los recursos del scheduler y la conversión de flavor a KubeVirt se comportan según lo especificado.

Ejecución

make test; vectores de flavor en internal/driver/kubevirt/flavor_test.go.

Último resultado Superado; vectores de flavor a KubeVirt 6 / 6.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Concurrencia en Galera

Concurrencia en MariaDB Galera

Las cuotas, los nombres únicos y las acciones concurrentes se mantienen cuando las peticiones llegan simultáneamente a través de tres nodos Galera.

Ejecución

test/galera en un clúster de 3 nodos: arranques concurrentes, pares de claves, grupos de servidores, creaciones con el mismo nombre y paradas.

Último resultado Superado, 3 ejecuciones de 3: exactamente 10 servidores para una cuota de 10 sobre 30 arranques, ningún 5xx.

Fuente: openkeel-nova/docs/CONFORMANCE.md

De extremo a extremo en un laboratorio

NIC de VM en puertos de Neutron, instancias reales

POST /servers con puertos de Neutron arranca instancias reales que obtienen sus direcciones de Neutron, están aisladas entre proyectos y sobreviven a la migración en vivo.

Ejecución

Clúster kind desechable, perfil openkeel-lab dataplane: OVN real, KubeVirt v1.9.1, instancias cirros, Glance, Placement y Neutron reales.

Último resultado Superado (2026-10-31); KubeVirt rechaza la migración en vivo a través del conductor sobre un disco local-path, que solo cubren los tests unitarios.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Escenario

kubectl drain de un nodo de cómputo

Un drain migra en vivo la instancia invitada y Nova adopta la migración: host, vinculación de puerto, chassis OVN y asignación de Placement la siguen.

Ejecución

openkeel-lab/scripts/drain-test.sh en el laboratorio dataplane, con dos servidores creados mediante POST /servers.

Último resultado Superado (2026-10-31); un par perdió 1 ping de 55. Ningún disco compartido migrado, ningún nodo vaciado por completo.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Tempest

Tempest compute

Los tests de API compute de Tempest upstream contra un Nova desplegado.

Ejecución

Requiere un clúster kind con KubeVirt, CDI, Longhorn y los demás servicios de OpenKeel.

Último resultado No ejecutado.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Excluido del rewrite

Nova conserva su API y su modelo de planificación, pero confía el hipervisor a KubeVirt, lo que elimina las celdas, los servicios nova-compute por host y las API proxy obsoletas.

Mecánica interna simplificada

Cells v2, cell0 y build requests

Por qué se excluyó

Un despliegue nativo de Kubernetes ejecuta una sola celda: un mismo esquema contiene las tablas de nova_api y de la base de datos de la celda, y la fila de la instancia se escribe de una vez.

Por qué la solución no se ve afectada

Los conceptos visibles en la API (instance mappings, request specs, estados BUILD y ERROR con faults) se conservan, de modo que los clientes ven el mismo ciclo de vida del servidor.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Asumido por la plataforma Cloud Native

nova-compute por host y drivers libvirt

Asumido por KubeVirt

Por qué se excluyó

KubeVirt ejecuta los invitados en todo el clúster; el conductor lo controla mediante una única cola quorum de RabbitMQ y el scheduler es una biblioteca del conductor. Un agente por nodo solo notifica recursos.

Por qué la solución no se ve afectada

Arranque, parada, redimensionamiento, migración en caliente y drenaje funcionan a través de KubeVirt; los grupos de opciones de libvirt, VMware e Hyper-V desaparecen con los drivers.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Obsoleto o sin uso en upstream

API proxy obsoletas (imágenes, volúmenes, redes)

Por qué se excluyó

Los proxies hacia Glance, Cinder y Neutron (images, os-volumes, os-snapshots, os-networks, os-floating-ips, os-security-groups, os-hosts, os-baremetal-nodes) están obsoletos en upstream.

Por qué la solución no se ve afectada

Estas rutas responden 501. Los clientes actuales, incluidos ok y Skyline, llaman directamente a Glance, Cinder y Neutron, que OpenKeel proporciona.

Fuente: openkeel-nova/docs/PLAN.md

Asumido por la plataforma Cloud Native

Suspensión a disco

Asumido por KubeVirt

Por qué se excluyó

KubeVirt no permite guardar la memoria del invitado en disco.

Por qué la solución no se ve afectada

suspend se acepta pero detiene la VM: el estado de la memoria del invitado se pierde y vuelve a arrancar en resume. Los discos y los datos se conservan.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Asumido por la plataforma Cloud Native

Espera de network-vif-plugged y timeouts de conexión de VIF

Asumido por OVN CNI

Por qué se excluyó

KubeVirt arranca el invitado en cuanto el plugin CNI ha visto a OVN programar sus puertos; Nova ya no mantiene un invitado en pausa a la espera del evento.

Por qué la solución no se ve afectada

El servidor permanece en BUILD hasta que Neutron notifica sus puertos como ACTIVE. El evento se sigue aceptando, por lo que Neutron no cambia y un evento perdido no tiene coste.

Fuente: openkeel-nova/docs/CONFORMANCE.md

Aquí solo figura lo que se excluyó por diseño; el trabajo aún no realizado está en los Known gaps del docs/CONFORMANCE.md del módulo. Todos los módulos

Interacciones Nova

Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.

Diagrama openkeel-nova.svg Pantalla completa
Las 22 interacciones del modelo
DeAProtocoloQué
SkylineNova APIAPI RESTaggregated lists
Nova APIPlacementAPI RESTusages, quotas
Nova APIGlanceAPI RESTimage metadata
Nova APINeutron serverAPI RESTports
Nova APICinder APIAPI RESTvolume attach
Nova APIBarbicanAPI RESTencryption keys
Neutron serverNova APIAPI RESTnetwork-vif-plugged
Cinder APINova APIAPI RESTvolume events
Masakari engine + monitorsNova APIAPI RESTserver state, host disable
Nova APINova conductor + schedulerRabbitMQRPC build/resize
Nova conductor + schedulerNova compute agentRabbitMQRPC
Nova conductor + schedulerPlacementAPI RESTallocation candidates, claims
Nova compute agentPlacementAPI RESTinventory, traits
Nova conductor + schedulerKubeVirtAPI de KubernetesVirtualMachine, Instancetype, Preference
Nova console proxyKubeVirtAPI de KubernetesVNC and serial websockets, console log
Nova APINova console proxyAPI RESTconsole log, with a token
Nova compute agentKubernetes API serverAPI de Kuberneteswatch node allocatable
Nova conductor + schedulerIronic APIAPI RESTbare metal flavors: provision nodes
Nova compute agentIronic APIAPI RESTnodes → Placement inventory (planned)
Heat engineNova APIAPI RESTOS::Nova::*
EC2 APINova APIAPI RESTinstances
Nova conductor + schedulerCDIAPI de Kubernetesroot DataVolume: clone of the image PVC

Especificaciones