OpenKeel implementation in Go of OpenStack neutron-vpnaas on the OVN path, generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. neutron-vpnaas-api serves the VPN API (/v2.0/vpn and the agent scheduler) and replaces the ovn-vpnaas service plugin and its driver: same routes, status codes, error bodies and policies, same tables. neutron-vpnaas-agent replaces neutron-ovn-vpn-agent: it runs strongSwan, the original's daemon, in one qvpn-<router> namespace per router. It runs beside openkeel-neutron, on its database and its OVN; clients reach it through a proxy in openkeel-neutron: see docs/NEUTRON-INTEGRATION.md. 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-vpnaas
Binaries: neutron-vpnaas-api (API on port 9696, agent API on 9697, health and metrics on 9090), neutron-vpnaas-agent (health on 9091; needs Linux, root and strongSwan: Dockerfile.agent)
Configuration: YAML, see config/config.example.yaml and config/agent.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-neutron-vpnaas/README.md (in English).
REST API
35 operations of the original REST API (routes and body actions), and their state in OpenKeel.
Recorded exchanges of the OVN profile are replayed against the Go service, configuration rendering is compared with the original templates, and real IPsec tunnels are brought up end to end.
Replay of recorded exchanges
E2E replay of the OVN profile
The recorded VPNaaS exchanges served by this service give the same answers; those served by Neutron are checked on the real stack.
How it runs
make e2e-strict, on go-mysql-server and on MariaDB 11.4.
Latest result 84 replayed, 84 pass (2026-10-31); 25 of the 108 recorded exchanges belong to Neutron or no longer apply.