OpenKeel : la solution Cloud souveraine, française à portée européenne du groupe inherent Découvrir inherent

Composants · Réseau

Neutron

Réseaux, sous-réseaux, ports, routeurs et groupes de sécurité écrits dans la base OVN Northbound ; IPv4 et IPv6.

Go OVN et Open vSwitchopenkeel-neutron

Le module

OpenKeel implementation in Go of OpenStack neutron (neutron-api), generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. Scope: the Neutron core on ML2/OVN — networks, subnets (internal IPAM), ports with ML2 port binding and the binding-extended API used by Nova for live migration, security groups, routers (interfaces, gateway, extra routes) and floating IPs, plus quotas, tags, agents and availability zones read from the OVN Southbound database. Extensions (QoS, trunks, segments API, port forwarding, VPNaaS, BGP…) come later; their collections answer empty lists.

neutron-api also serves the Octavia v2 API (internal/lbaas, under /load-balancer): Python Octavia does not run, and openkeel-ovn-octavia-provider stays a separate service, the only back end. Design, seam and differences: docs/OCTAVIA.md.

The backend is a parallel OVN owned by Neutron (references/backends/neutron-ovn.md, design B): the service writes the OVN Northbound rows exactly as Python's ML2/OVN driver does — same tables, names, external_ids keys and options — because ovn-bgp-agent, ovn-octavia-provider and the OVN metadata agent stay in Python and read them. It turns Logical_Switch_Port.up into port status changes and sends Nova the network-vif-plugged / network-vif-unplugged / network-vif-deleted / network-changed external events.

It replaces the Python service without its clients noticing: same routes, status codes, NeutronError bodies and types, 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-neutron
  • Binary: neutron-api (API on port 9696, health and metrics on 9090)
  • 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
  • Build plan and operation checklist: docs/PLAN.md

Extrait de openkeel-neutron/README.md (en anglais).

API REST

368 opérations de l'API REST d'origine (routes et actions de corps), et leur état dans OpenKeel.

  • 138Implémenté
  • 19Partiel
  • 211Non implémenté

Comment la compatibilité est testée

Les échanges des tests unitaires ML2/OVN de Neutron Python et les échanges d'API d'Octavia sont rejoués contre le service Go ; les contrats avec Nova et OVN, la concurrence sur Galera et un vrai plan de données sont testés.

Rejeu des échanges enregistrés

Rejeu E2E des tests ML2/OVN

Les échanges enregistrés des tests unitaires ML2/OVN de Neutron Python donnent le même statut et le même corps depuis le service Go.

Exécution

make e2e sur go-mysql-server, E2E_MYSQL_DSN pour MariaDB 11.4 ; E2E_STRICT=1 réussit avec test/e2e/known-differences.txt.

Dernier résultat 2344 / 2728 identiques (86 %, 2026-10-31) ; 2331 / 2728 sur MariaDB 11.4, avec les mêmes fichiers.

Source : openkeel-neutron/docs/CONFORMANCE.md

Contrat client

Contrat Nova

La liaison de port à un chassis OVN, le statut de port, network-vif-plugged et les autres événements, ainsi que l'API de liaison pour la migration à chaud, se comportent comme Nova l'attend.

Exécution

TestNovaBootFlow dans internal/app ; types d'erreur client dans TestErrorTypes.

Dernier résultat Réussi.

Source : openkeel-neutron/docs/CONFORMANCE.md

Concurrence sur Galera

Concurrence sur MariaDB Galera

L'allocation des VNI et des IP reste unique lorsque réseaux et ports sont créés simultanément par trois nœuds Galera.

Exécution

make galera-test sur un cluster à 3 nœuds.

Dernier résultat Réussi : 20 réseaux pour 10 VNI donnent 10 créations avec des VNI distincts ; aucune adresse en double ; aucun 5xx ; chaque nœud lit les mêmes allocations.

Source : openkeel-neutron/docs/CONFORMANCE.md

De bout en bout sur un lab

Plan de données avec de vrais invités

Routeurs, SNAT, IP flottantes et répartition de charge fonctionnent pour de vrais invités sur OVN, avec isolation des projets.

Exécution

openkeel-lab/scripts/dataplane-test.sh (78 vérifications) après un make lab-up PROFILE=dataplane à froid.

Dernier résultat Réussi (2026-11-01).

Source : openkeel-neutron/docs/CONFORMANCE.md

Rejeu des échanges enregistrés

Rejeu de l'API Octavia

L'API Octavia v2 servie par neutron-api répond à l'identique aux échanges Octavia Python enregistrés, appels au provider compris.

Exécution

make e2e-lbaas sur un nœud MariaDB Galera ; E2E_STRICT=1 échoue sur toute différence inexpliquée.

Dernier résultat 8 598 / 8 691 identiques ; appels au provider 3 826 / 3 831. Le rejeu propre à Python donne 8 683 / 8 691.

Source : openkeel-neutron/docs/CONFORMANCE.md

Tempest

Tempest et neutron-tempest-plugin

Les tests d'API Neutron amont contre le service déployé.

Exécution

Pas encore dirigé vers le plan de données du lab.

Dernier résultat Non exécuté.

Source : openkeel-neutron/docs/CONFORMANCE.md

Écarté de la réécriture

Neutron conserve son API cœur sur ML2/OVN et sert aussi l'API Octavia : les agents non OVN, le service Octavia séparé avec ses amphorae et les notifications inutilisées disparaissent.

Assuré par la plateforme Cloud Native

Drivers de mécanisme non OVN et agents par hôte

Repris par OVN

Pourquoi c'est écarté

OVN assure lui-même routage, DHCP, groupes de sécurité et NAT ; le driver de mécanisme ML2 est fixé à OVN, si bien que les agents L3, DHCP, OVS et Linux bridge et leurs assistants privsep sont inutiles.

Pourquoi la solution n'est pas affectée

L'API des agents ne liste que les chassis OVN Southbound ; PUT et DELETE sur les agents sont acquittés sans effet. Réseaux, routeurs et IP flottantes fonctionnent comme sur ML2/OVN.

Source : openkeel-neutron/docs/CONFORMANCE.md

Assuré par la plateforme Cloud Native

Service Octavia, driver amphora et housekeeping

Repris par Load balancers OVN

Pourquoi c'est écarté

L'API Octavia v2 tourne dans le binaire neutron-api avec le provider OVN ; il n'y a pas de VM amphora, et la purge est une tâche périodique idempotente dans chaque réplique.

Pourquoi la solution n'est pas affectée

openstacksdk, le client openstack et octavia-tempest-plugin passent avec le provider OVN. Les routes amphora répondent comme une table vide.

Source : openkeel-neutron/docs/CONFORMANCE.md

Mécanique interne simplifiée

Terminaison TLS Octavia via Barbican

Pourquoi c'est écarté

Le provider OVN refuse de toute façon les listeners TLS : aucun gestionnaire de certificats n'est branché dans cette version.

Pourquoi la solution n'est pas affectée

Les requêtes de listener TLS sont validées, puis le provider répond 501. L'équilibrage TCP et UDP n'est pas concerné ; TLS peut se terminer dans les backends.

Source : openkeel-neutron/docs/CONFORMANCE.md

Mécanique interne simplifiée

Notifications AMQP sur les ressources

Pourquoi c'est écarté

Le cœur d'OpenKeel n'a aucun consommateur de network.create.end et d'événements similaires, tel que Ceilometer.

Pourquoi la solution n'est pas affectée

Les ressources se comportent de la même façon ; les consommateurs de ces événements ne reçoivent rien de Neutron. Chaque appel d'API reste enregistré dans la piste d'audit CADF.

Source : openkeel-neutron/docs/CONFORMANCE.md

Seul ce qui a été écarté par choix de conception figure ici ; le travail pas encore fait se trouve dans les Known gaps du docs/CONFORMANCE.md du module. Tous les modules

Interactions de Neutron

Vue « service » générée par la skill diagramme depuis le modèle d'OpenKeel.

Diagramme openkeel-neutron.svg Plein écran
Les 17 interactions du modèle
DeVersProtocoleQuoi
SkylineNeutron serverAPI RESTextensions, ports, FWaaS, VPN, load balancers
Nova APINeutron serverAPI RESTports
Neutron serverNova APIAPI RESTnetwork-vif-plugged
Neutron serverNeutron reconcilerSQL (MariaDB Galera)reconciled from DB
Neutron reconcilerKube-OVNAPI KubernetesVpc, Subnet, IP, SecurityGroup, OvnFip
Ironic conductorNeutron serverAPI RESTprovisioning/tenant ports
Heat engineNeutron serverAPI RESTOS::Neutron::*
EC2 APINeutron serverAPI RESTVPC, subnets, security groups
Neutron serverOVN Northbound DBOVSDBNB writes: switches, ports, routers, ACLs, NAT, DHCP; LSP.up monitor
Neutron serverOVN Southbound DBOVSDBSB reads: Chassis, Chassis_Private (liveness, binding)
Neutron reconcilerOVN Northbound DBOVSDBrepairs drift (maintenance loop)
Neutron serverNeutron FWaaSAPI RESTproxy /v2.0/fwaas/*, same token
Neutron serverNeutron VPNaaSAPI RESTproxy /v2.0/vpn/*, vpn-agents, same token
Neutron VPNaaSNeutron serverAPI RESTcore and L3 calls: gateway ports, routes
Neutron serverOVN Octavia providerAPI RESTOctavia driver API (:9877)
OVN Octavia providerNeutron serverAPI REST/internal/lbaas status updates, ports, subnets
Zun computeNeutron serverAPI RESTports bound to host (compute:zun)

Spécifications