API EC2 Query (97 acciones), firmas SigV2 y SigV4 verificadas por Keystone: AWS CLI, boto3, Terraform.
Go Nova, Neutron, Cinderopenkeel-ec2-api
El módulo
OpenKeel implementation in Go of OpenStack ec2-api (ec2-api), generated from the reverse-specification of branch 17.0.0 by the generate-go-from-spec skill. It replaces the Python service without its clients noticing: the same EC2 Query API (97 actions of ec2-api 17.0.0, SigV2 and SigV4 verified by Keystone ec2tokens), the same XML documents and error codes, the same EC2 identifiers and the same ec2api database. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist is in docs/SECURITY.md.
Clients: the AWS CLI and boto3, Terraform's AWS provider with a custom endpoint, euca2ools/boto2
Backends: Nova, Neutron (with VPNaaS for the VPN actions), Cinder and Glance, called with the caller's token; the EC2 IDs and tags are in MariaDB (items, tags). Not included: ec2-api-metadata (Nova's metadata service or cloud-init serves instances) and ec2-api-s3 (Swift s3api) — docs/CONFORMANCE.md D9, D10
Go module: github.com/openkeel/openkeel-ec2-api
Binary: ec2-api (API on port 8788, 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
Extracto de openkeel-ec2-api/README.md (en inglés).
Acciones de API
100 acciones de la API original y su estado en OpenKeel.
El ec2-api retirado se verifica frente a su comportamiento grabado y, sobre todo, frente a los clientes AWS reales: la AWS CLI y el provider AWS de Terraform.
Replay de los intercambios grabados
Errores de validación y sondas grabados
Los intercambios de error grabados dan el mismo estado, el mismo código EC2 y el mismo mensaje; las sondas del dispatcher comparan los errores en texto plano y las raíces de las respuestas.
Ejecución
test/e2e/exchanges_test.go y test/e2e/probes_test.go.
Último resultado 40 / 40 idénticos; sondas: 9 idénticas byte a byte, 6 deliberadamente distintas (2026-11-02).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Escenario
Escenario de todas las familias de acciones
Cada familia de acciones se ejecuta, y las estructuras de respuesta se comparan con las grabadas desde Python.
Ejecución
test/e2e/scenario_test.go.
Último resultado 97 / 97 acciones superadas; 93 estructuras de respuesta comprobadas, ningún elemento sin explicar (2026-11-02).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Contrato de cliente
AWS CLI v2
La AWS CLI real funciona en 42 acciones, con SigV4 verificado por el algoritmo de keystoneclient.
Ejecución
test/awscli (build tag awscli), AWS CLI v2 2.18.
Último resultado Superado (2026-11-02).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Contrato de cliente
Provider AWS de Terraform
Terraform aplica una VPC, una subred, una puerta de enlace, rutas, un grupo de seguridad, un par de claves, una instancia, una EIP y un volumen, luego no planifica ningún cambio y lo destruye todo.
Ejecución
test/terraform (build tag terraform), Terraform 1.5.4 y hashicorp/aws 5.100.0, sobre MariaDB.
Último resultado Superado en MariaDB (2026-11-02).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Concurrencia en Galera
Concurrencia en MariaDB Galera
Una VPC por defecto y un ID EC2 por servidor con peticiones concurrentes en tres nodos; las escrituras de etiquetas convergen.
Ejecución
test/galera (build tag galera) en un clúster de 3 nodos.
Último resultado Superado, 3 ejecuciones, ningún 5xx (2026-11-02).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Tempest
ec2api-tempest-plugin
El plugin de Tempest upstream del proyecto.
Ejecución
Retirado junto con el proyecto upstream.
Último resultado No ejecutado.
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Excluido del rewrite
La API EC2 (retirada en upstream en 2024) conserva sus acciones, pero prescinde de su propio servidor S3 y de su servicio de metadatos, que la plataforma ya proporciona.
Asumido por la plataforma Cloud Native
Servidor ec2-api-s3
Asumido por Rook-Ceph RGW
Por qué se excluyó
El servidor S3 de Python no está autenticado; el almacenamiento de objetos con S3 lo proporciona la plataforma.
Por qué la solución no se ve afectada
Los clientes S3 usan el endpoint de RGW con credenciales EC2 de Keystone (okadm --ceph-s3).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Servicio ec2-api-metadata
Asumido por KubeVirt (cloud-init)
Por qué se excluyó
Las instancias obtienen sus metadatos a través de los datasources OpenStack y NoCloud de cloud-init (config drive).
Por qué la solución no se ve afectada
Los invitados arrancan y se configuran como siempre; solo faltan en sus metadatos los identificadores EC2 (i-, ami-, r-).
Fuente: openkeel-ec2-api/docs/CONFORMANCE.md
Mecánica interna simplificada
Bloqueo de archivo por host para la VPC por defecto
Por qué se excluyó
Varias réplicas y un Galera multiescritor requieren un bloqueo a escala de clúster: una fila de base de datos con caducidad.
Por qué la solución no se ve afectada
Las VPC por defecto se siguen creando una vez por proyecto, ahora de forma segura entre réplicas.
Fuente: openkeel-ec2-api/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 API EC2
Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.