Partages NFS multi-tenant : une passerelle NFS-Ganesha par réseau de partage, dans le réseau du tenant.
Go NFS-Ganeshaopenkeel-manila
Le module
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
Extrait de openkeel-manila/README.md (en anglais).
API REST
258 opérations de l'API REST d'origine (routes et actions de corps), et leur état dans OpenKeel.
Les scénarios enregistrés de Manila Python sont rejoués dans l'ordre contre le service Go, le contrat Neutron est exercé, et des partages de tenant ont été montés sur un cluster de lab.
Rejeu des échanges enregistrés
Rejeu E2E des scénarios enregistrés
283 échanges de 29 scénarios ordonnés, avec trois back ends et le faux Neutron de l'adaptateur, donnent le même statut, les mêmes en-têtes et le même corps.
Exécution
go test -tags e2e ./test/e2e/ ; E2E_STRICT=1 réussit avec test/e2e/known-differences.txt.
Dernier résultat 279 / 283 identiques, les 4 différences expliquées (deux bogues Python non reproduits).
Source : openkeel-manila/docs/CONFORMANCE.md
Contrat client
Flux clients
Les flux enregistrés de python-manilaclient/OSC, Manila CSI, Skyline et manila-ui fonctionnent sans modification à leurs microversions.
Exécution
Leurs flux enregistrés font partie du rejeu.
Dernier résultat Rejouent à l'identique.
Source : openkeel-manila/docs/CONFORMANCE.md
Contrat client
Contrat Neutron
Les six requêtes Neutron qu'envoie Manila (extensions, réseaux, sous-réseaux, création, listage et suppression de port) correspondent aux appels enregistrés.
Exécution
Exercé par le rejeu contre un portage Go du faux Neutron de l'adaptateur.
Source : openkeel-manila/docs/CONFORMANCE.md
De bout en bout sur un lab
Partage de tenant sur un cluster de lab
Un membre de projet crée un share network et un partage ; un client le monte en NFSv4.1 via OVN, les autres sont refusés ; la suppression nettoie tout.
Exécution
scripts/manila-test.sh sur le profil openkeel-lab manila-dataplane (kind, deux chassis OVN).
Dernier résultat Validé sur un cluster (2026-11-02) pour l'attachement openkeel-ovn ; kube-ovn et multus non validés.
Source : openkeel-manila/docs/CONFORMANCE.md
Écarté de la réécriture
Manila conserve son API et son scheduler mais sert les partages NFS depuis des passerelles NFS-Ganesha sur des volumes CSI en mode bloc, ce qui supprime les drivers constructeurs, le bus RPC, CIFS et le retour sur place.
Assuré par la plateforme Cloud Native
Drivers de partage constructeurs
Repris par NFS-Ganesha sur CSI (Longhorn)
Pourquoi c'est écarté
Un seul back end multi-tenant (DHSS=True) : une passerelle Ganesha par réseau de partage, rattachée au réseau du tenant par un port Neutron, avec un volume Longhorn par partage.
Pourquoi la solution n'est pas affectée
Manila CSI, manilaclient, Skyline et manila-ui rejouent leurs flux à l'identique ; l'isolation des tenants vient de Neutron et des listes d'accès par export.
Source : openkeel-manila/docs/CONFORMANCE.md
Mécanique interne simplifiée
RPC RabbitMQ et verrous locaux à l'hôte
Repris par Kubernetes Leases
Pourquoi c'est écarté
Les casts deviennent des tâches en base réservées par un bail ; les rapports de capacités sont des lignes ; une réplique manila-share par back end détient un Lease Kubernetes.
Pourquoi la solution n'est pas affectée
Pas de RabbitMQ pour Manila, et les tâches des workers tombés sont reprises. Les services Manila Python ne peuvent pas tourner à côté de ceux en Go : la migration est une bascule.
Source : openkeel-manila/docs/CONFORMANCE.md
Assuré par la plateforme Cloud Native
Partages CIFS et retour sur place à un snapshot
Repris par CSI
Pourquoi c'est écarté
Le back end ganesha ne sert que NFS, et CSI ne peut pas remplacer un volume sur place.
Pourquoi la solution n'est pas affectée
CIFS est refusé et revert_to_snapshot_support est signalé à False ; de nouveaux partages peuvent toujours être créés à partir de snapshots.
Source : openkeel-manila/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 Manila
Vue « service » générée par la skill diagramme depuis le modèle d'OpenKeel.