Shares NFS multi-tenant: un gateway NFS-Ganesha por red de share, dentro de la red del tenant.
Go NFS-Ganeshaopenkeel-manila
El módulo
OpenKeel implementation in Go of OpenStack Manila (manila-api, manila-scheduler, manila-share), 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-manila
Binaries: manila-api (API on port 8786, health and metrics on 9090), manila-scheduler and manila-share (workers fed by the database task queue, no RabbitMQ), manila-ganesha-agent (side-car of the NFS-Ganesha gateway pods). Each process binary is the same program with another default -process.
Back end: multi-tenant (driver_handles_share_servers: true): one NFS-Ganesha gateway pod per share network subnet, attached to the tenant network through a Neutron port, Longhorn RWO volumes behind it, CSI snapshots (07 § 3.5; design in docs/CONFORMANCE.md D1)
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-manila/README.md (en inglés).
API REST
258 operaciones de la API REST original (rutas y acciones de cuerpo) y su estado en OpenKeel.
Los escenarios grabados de Manila en Python se reproducen en orden contra el servicio Go, se ejercita el contrato de Neutron y se montaron recursos compartidos de tenant en un clúster de laboratorio.
Replay de los intercambios grabados
Replay E2E de los escenarios grabados
283 intercambios de 29 escenarios ordenados, con tres back ends y el Neutron simulado del adaptador, dan el mismo estado, las mismas cabeceras y el mismo cuerpo.
Ejecución
go test -tags e2e ./test/e2e/; E2E_STRICT=1 se supera con test/e2e/known-differences.txt.
Último resultado 279 / 283 idénticos, con las 4 diferencias explicadas (dos errores de Python no reproducidos).
Fuente: openkeel-manila/docs/CONFORMANCE.md
Contrato de cliente
Flujos de cliente
Los flujos grabados de python-manilaclient/OSC, Manila CSI, Skyline y manila-ui funcionan sin cambios en sus microversiones.
Ejecución
Sus flujos grabados forman parte del replay.
Último resultado Se reproducen de forma idéntica.
Fuente: openkeel-manila/docs/CONFORMANCE.md
Contrato de cliente
Contrato de Neutron
Las seis peticiones a Neutron que envía Manila (extensiones, redes, subredes, creación, listado y eliminación de puertos) coinciden con las llamadas grabadas.
Ejecución
Ejercitado por el replay contra un port en Go del Neutron simulado del adaptador.
Fuente: openkeel-manila/docs/CONFORMANCE.md
De extremo a extremo en un laboratorio
Recurso compartido de tenant en un clúster de laboratorio
Un miembro del proyecto crea una share network y un recurso compartido; un cliente lo monta por NFSv4.1 a través de OVN, los demás son rechazados; la eliminación lo limpia todo.
Ejecución
scripts/manila-test.sh en el perfil openkeel-lab manila-dataplane (kind, dos chassis OVN).
Último resultado Validado en un clúster (2026-11-02) para el attachment openkeel-ovn; kube-ovn y multus no validados.
Fuente: openkeel-manila/docs/CONFORMANCE.md
Excluido del rewrite
Manila conserva su API y su scheduler, pero sirve recursos compartidos NFS desde pasarelas NFS-Ganesha sobre volúmenes CSI de bloque, lo que elimina los drivers de fabricante, el bus RPC, CIFS y la reversión in situ.
Asumido por la plataforma Cloud Native
Drivers de recursos compartidos de fabricantes
Asumido por NFS-Ganesha sobre CSI (Longhorn)
Por qué se excluyó
Un único back end multi-tenant (DHSS=True): una pasarela Ganesha por red de recursos compartidos, conectada a la red del tenant mediante un puerto de Neutron, con un volumen Longhorn por recurso compartido.
Por qué la solución no se ve afectada
Manila CSI, manilaclient, Skyline y manila-ui reproducen sus flujos de forma idéntica; el aislamiento entre tenants procede de Neutron y de las listas de acceso por exportación.
Fuente: openkeel-manila/docs/CONFORMANCE.md
Mecánica interna simplificada
RPC de RabbitMQ y bloqueos locales del host
Asumido por Kubernetes Leases
Por qué se excluyó
Los casts pasan a ser tareas en base de datos reservadas con un lease; los informes de capacidades son filas; una réplica de manila-share por back end mantiene un Lease de Kubernetes.
Por qué la solución no se ve afectada
Sin RabbitMQ para Manila, y las tareas de los workers caídos se retoman. Los servicios Manila en Python no pueden funcionar junto a los de Go: la migración es un cambio de una sola vez.
Fuente: openkeel-manila/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Recursos compartidos CIFS y reversión in situ a un snapshot
Asumido por CSI
Por qué se excluyó
El back end ganesha solo sirve NFS, y CSI no puede sustituir un volumen in situ.
Por qué la solución no se ve afectada
CIFS se rechaza y revert_to_snapshot_support se notifica como False; se pueden seguir creando nuevos recursos compartidos a partir de snapshots.
Fuente: openkeel-manila/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 Manila
Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.