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

Composants · Services et orchestration

CloudKitty

Valorisation (FinOps) : usage collecté depuis Prometheus, valorisé par des règles hashmap et des scripts CEL, historique valorisé dans InfluxDB ; avec openkeel-pricing (devis de coût et de carbone), il alimente la page FinOps / GreenOps de Skyline.

Go Prometheus, InfluxDBopenkeel-cloudkitty

Le module

OpenKeel implementation in Go of OpenStack CloudKitty, the rating service (cloudkitty-api and cloudkitty-processor), generated from the reverse-specification of branch stable/2026.2 (reverse-spec-cloudkitty/, files 00–07 and _rewrite/) by the generate-go-from-spec skill. It replaces the Python service without its clients noticing (python-cloudkittyclient, cloudkitty-dashboard): same routes (66 operations of v1, hashmap, pyscripts and v2), status codes, WSME and flask-restful error bodies, and policies.

What it does: the processor lists the scopes (Keystone projects with the rating role, Prometheus label values or a static list), collects their usage from Prometheus every period, prices it with the enabled rating modules (hashmap rules, CEL scripts in place of PyScripts), and stores the rated data in InfluxDB (1.x or 2.x); the API manages the rules and returns summaries, rated data frames and instant quotes.

OpenKeel decisions (details and reasons in docs/CONFORMANCE.md):

  • PyScripts are CEL expressions, evaluated per data point, never Python (exec); tools/pyscript2cel.py translates the scripts written in the documented pattern; skip_datapoints_expression is CEL too.
  • Collector: Prometheus only (kube-prometheus-stack); storage: InfluxDB only; no RabbitMQ: quotes are computed in the API, scope resets go to the processor through the database; one active processor elected with a Kubernetes Lease.
  • Fixed upstream defects: scoped deletes, unprotected GET /v2/rating/modules, quotes with a flat desc, InfluxQL built from escaped literals, no unverified Keystone call, reprocessing and reset windows. 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-cloudkitty
  • Binaries: cloudkitty-api (API on port 8889, health and metrics on 9090) and cloudkitty-processor (health 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-cloudkitty/README.md (en anglais).

API REST

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

  • 66Implémenté

Comment la compatibilité est testée

Les trois suites gabbi de CloudKitty sont rejouées contre le service Go, avec des vecteurs hashmap enregistrés depuis les tests Python et un déploiement en lab relu à travers l'ingress.

Rejeu des échanges enregistrés

Rejeu E2E des suites gabbi

223 échanges de 19 fichiers gabbi (v1, hashmap, pyscripts, v2) donnent le même statut et le même corps.

Exécution

make e2e, aussi sur MariaDB 11.4 (E2E_MYSQL_DSN) ; le mode strict passe avec les différences connues listées.

Dernier résultat 153 / 223 identiques ; les 70 autres sont expliqués (faux objets des tests Python, stockage v1, CORS, scripts Python refusés).

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

Tests unitaires et golden tests

Vecteurs hashmap

24 vecteurs de valorisation hashmap enregistrés depuis cloudkitty.tests.test_hashmap donnent le même prix au chiffre près, les décimaux vérifiés avec CPython.

Exécution

go test ./... (19 paquets).

Dernier résultat 24 / 24 identiques.

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

De bout en bout sur un lab

Déploiement en lab

Type de catalogue rating, modules, règles hashmap, devis, un script Python refusé et un script CEL accepté, dataframes poussées puis relues par /v2/summary ; le processor valorise depuis le début du mois.

Exécution

okadm install --mode lab avec cloudkitty, appels à travers l'ingress avec un jeton admin ; page FinOps / GreenOps de Skyline.

Dernier résultat Réussi, 0 échec de valorisation.

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

Contrat client

Attentes des clients

python-cloudkittyclient, cloudkitty-dashboard et cloudkitty-tempest-plugin.

Exécution

Pas encore rétro-spécifiés.

Dernier résultat Non exécuté.

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

Écarté de la réécriture

CloudKitty garde ses 66 opérations d'API et sa valorisation ; il collecte depuis Prometheus et stocke dans InfluxDB uniquement, et les PyScripts deviennent des expressions CEL.

Mécanique interne simplifiée

PyScripts (Python exécuté par le service)

Repris par CEL

Pourquoi c'est écarté

Exécuter le Python des opérateurs avec exec, c'est du code arbitraire dans le service ; CEL n'a ni instructions ni E/S, avec des limites de coût et de temps.

Pourquoi la solution n'est pas affectée

Même valorisation par point de donnée ; les scripts écrits selon le modèle documenté sont traduits par tools/pyscript2cel.py, les autres sont réécrits.

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

Assuré par la plateforme Cloud Native

Collecteurs Gnocchi et Aetos, fetcher Gnocchi

Repris par Prometheus

Pourquoi c'est écarté

OpenKeel ne déploie pas Gnocchi : l'usage vient de Prometheus (kube-prometheus-stack, openstack-exporter).

Pourquoi la solution n'est pas affectée

Mêmes données valorisées à partir des métriques Prometheus ; les collecteurs peuvent être ajoutés à la demande.

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

Assuré par la plateforme Cloud Native

Elasticsearch, OpenSearch, Loki et stockage v1

Repris par InfluxDB

Pourquoi c'est écarté

L'historique valorisé va dans InfluxDB 1.x ou 2.x ; les autres backends ne sont pas déployés.

Pourquoi la solution n'est pas affectée

Résumés et dataframes comme avec le stockage v2 ; les défauts amont de filtre de scope de ces backends ne peuvent pas se produire.

Source : openkeel-cloudkitty/docs/CONFORMANCE.md

Mécanique interne simplifiée

RPC RabbitMQ et verrous tooz

Repris par Kubernetes Leases

Pourquoi c'est écarté

Les devis sont calculés dans l'API avec le même code de valorisation ; les remises à zéro de scope passent au processor par la base de données ; un seul processor actif détient un Lease.

Pourquoi la solution n'est pas affectée

Même comportement d'API, une dépendance de moins, correct sur plusieurs hôtes.

Source : openkeel-cloudkitty/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

Spécifications