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

Composants · Calcul et capacités

Placement

Inventaires et allocations de ressources ; premier composant réécrit en Go.

Go MariaDB Galeraopenkeel-placement

Le module

OpenKeel implementation in Go of OpenStack placement (placement-api), 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-placement
  • Binary: placement-api (API on port 8778, 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

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

API REST

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

  • 37Implémenté

Comment la compatibilité est testée

Les échanges gabbi enregistrés de Placement Python sont rejoués contre le service Go, et la propre suite fonctionnelle de Nova s'exécute avec le service Go à la place de Placement Python.

Rejeu des échanges enregistrés

Rejeu E2E des échanges gabbi

Chaque requête des 79 fichiers gabbi amont donne le même statut et le même corps que le service Python enregistré.

Exécution

make e2e, avec E2E_MYSQL_DSN pour MariaDB ; rapport dans test/e2e/report.json, différences listées dans known-differences.txt.

Dernier résultat 1303 / 1316 identiques sur MariaDB 11.4 (1301 / 1316 sur go-mysql-server) ; aucune des différences restantes n'est un bogue fonctionnel.

Source : openkeel-placement/docs/CONFORMANCE.md

Tests unitaires et golden tests

Cas de l'algorithme allocation-candidates

L'algorithme allocation-candidates renvoie les mêmes candidats que Python sur 83 cas enregistrés, jusqu'à 6000 providers.

Exécution

go test -tags e2e -run TestAllocationCandidateCases ./test/e2e/ ; rapport dans test/e2e/cases-report.json.

Dernier résultat 81 / 83 identiques, 83 / 83 sur le nombre de candidats.

Source : openkeel-placement/docs/CONFORMANCE.md

Test différentiel

Tests fonctionnels de Nova contre Placement Go

La suite de tests fonctionnels de Nova réussit lorsque chaque appel à Placement est servi par le service Go au lieu de Placement Python.

Exécution

Les tests fonctionnels de Nova s'exécutent via test/nova-functional/run.sh, sur go-mysql-server et MariaDB 11.4, comparés à une référence Placement Python.

Dernier résultat Sous-ensemble 859 / 859 sur MariaDB 11.4 (comme Python) ; suite complète 3314 réussis, 1 échec (un bogue du moteur) sur go-mysql-server (2026-10-28).

Source : openkeel-placement/docs/NOVA-FUNCTIONAL.md

Concurrence sur Galera

Concurrence sur MariaDB Galera

Des allocations concurrentes via trois instances du service sur trois nœuds Galera ne surallouent jamais un resource provider.

Exécution

GALERA_DSNS=... go test -tags galera ./test/galera/ sur un cluster MariaDB Galera 11.4 à 3 nœuds.

Dernier résultat Réussi : 180 allocations concurrentes pour 100 VCPU donnent exactement 100 allocations, 0 statut inattendu.

Source : openkeel-placement/docs/CONFORMANCE.md

Tempest

Tempest avec un vrai Placement

Tempest et tests fonctionnels de Nova contre un Placement déployé sur un cluster.

Exécution

Nécessite un cluster kind (reverse-spec 07 § 7 étape 5).

Dernier résultat Non exécuté.

Source : openkeel-placement/docs/CONFORMANCE.md

Écarté de la réécriture

Placement conserve toute son API et ne laisse de côté que le mode de test non authentifié, les anciennes migrations de données et la plomberie de service oslo que Kubernetes fournit déjà.

Mécanique interne simplifiée

Mode non authentifié noauth2

Pourquoi c'est écarté

Une API sans authentification n'a pas sa place en production ; les suites de tests injectent plutôt un validateur de jetons.

Pourquoi la solution n'est pas affectée

Les clients s'authentifient toujours via Keystone, comme dans tout déploiement réel. Nova, Neutron et osc-placement ne sont pas concernés.

Source : openkeel-placement/docs/CONFORMANCE.md

Obsolète ou inutilisé en amont

Migrations de données en ligne pour les anciennes bases

Pourquoi c'est écarté

set_root_provider_ids et create_incomplete_consumers ne corrigent que les bases antérieures à la branche reproduite.

Pourquoi la solution n'est pas affectée

Une base neuve ou à jour n'en a jamais besoin ; les bases antérieures à la branche sont refusées au lieu d'être migrées sur place.

Source : openkeel-placement/docs/CONFORMANCE.md

Assuré par la plateforme Cloud Native

Middleware CORS

Repris par Ingress (Gateway API)

Pourquoi c'est écarté

Les en-têtes cross-origin relèvent de la périphérie HTTP, pas de chaque processus d'API.

Pourquoi la solution n'est pas affectée

Aucun client OpenKeel n'appelle Placement depuis un navigateur sur une autre origine ; si besoin, CORS se configure une fois sur l'ingress.

Source : openkeel-placement/docs/CONFORMANCE.md

Assuré par la plateforme Cloud Native

Logs dans des fichiers, osprofiler, middleware healthcheck

Repris par Kubernetes probes, OpenTelemetry

Pourquoi c'est écarté

Les logs partent sur stdout en JSON, les traces vers OpenTelemetry et la santé vers les probes Kubernetes ; 101 des 108 options oslo sont devenues inutiles.

Pourquoi la solution n'est pas affectée

Les opérateurs obtiennent les mêmes informations via les outils de logs, de traçage et de probes du cluster ; l'API est inchangée.

Source : openkeel-placement/config/dropped-options.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 Placement

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

Diagramme openkeel-placement.svg Plein écran
Les 5 interactions du modèle
DeVersProtocoleQuoi
Nova APIPlacementAPI RESTusages, quotas
Nova conductor + schedulerPlacementAPI RESTallocation candidates, claims
Nova compute agentPlacementAPI RESTinventory, traits
Zun APIPlacementAPI RESTallocation candidates, claims
Zun compute agentPlacementAPI RESTinventory (Node UID provider)

Spécifications