OpenKeel: la soluzione Cloud sovrana, francese e di portata europea, del gruppo inherent Scopri inherent

Componenti · Servizi e orchestrazione

CloudKitty

Tariffazione (FinOps): utilizzo raccolto da Prometheus, tariffato con regole hashmap e script CEL, storico tariffato in InfluxDB; con openkeel-pricing (preventivi di costo e di carbonio), alimenta la pagina FinOps / GreenOps di Skyline.

Go Prometheus, InfluxDBopenkeel-cloudkitty

Il modulo

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

Estratto da openkeel-cloudkitty/README.md (in inglese).

API REST

66 operazioni dell'API REST originale (route e azioni nel corpo) e il loro stato in OpenKeel.

  • 66Implementato

Come viene testata la compatibilità

Le tre suite gabbi di CloudKitty vengono rieseguite contro il servizio Go, con vettori hashmap registrati dai test Python e un deployment in lab riletto attraverso l'ingress.

Replay degli scambi registrati

Riesecuzione E2E delle suite gabbi

223 scambi di 19 file gabbi (v1, hashmap, pyscripts, v2) danno lo stesso stato e lo stesso corpo.

Esecuzione

make e2e, anche su MariaDB 11.4 (E2E_MYSQL_DSN); la modalità strict passa con le differenze note elencate.

Ultimo risultato 153 / 223 identici; gli altri 70 sono spiegati (fake dei test Python, storage v1, CORS, script Python rifiutati).

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Test unitari e golden test

Vettori hashmap

24 vettori di tariffazione hashmap registrati da cloudkitty.tests.test_hashmap danno lo stesso prezzo alla cifra, decimali verificati con CPython.

Esecuzione

go test ./... (19 pacchetti).

Ultimo risultato 24 / 24 identici.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

End-to-end su un laboratorio

Deployment in lab

Tipo di catalogo rating, moduli, regole hashmap, preventivi, uno script Python rifiutato e uno CEL accettato, dataframe inviati e riletti con /v2/summary; il processor tariffa dall'inizio del mese.

Esecuzione

okadm install --mode lab con cloudkitty, chiamate attraverso l'ingress con un token di amministratore; pagina FinOps / GreenOps di Skyline.

Ultimo risultato Superato, 0 errori di tariffazione.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Contratto client

Aspettative dei client

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

Esecuzione

Non ancora retro-specificati.

Ultimo risultato Non eseguito.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Escluso dal rewrite

CloudKitty mantiene le sue 66 operazioni API e la sua tariffazione; raccoglie solo da Prometheus e memorizza solo in InfluxDB, e i PyScripts diventano espressioni CEL.

Meccanismi interni semplificati

PyScripts (Python eseguito dal servizio)

Gestito da CEL

Perché è stato escluso

Eseguire il Python degli operatori con exec è codice arbitrario nel servizio; CEL non ha istruzioni né I/O, con limiti di costo e di tempo.

Perché la soluzione non ne risente

Stessa tariffazione per punto dati; gli script scritti secondo lo schema documentato sono tradotti da tools/pyscript2cel.py, gli altri vengono riscritti.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Gestito dalla piattaforma Cloud Native

Collector Gnocchi e Aetos, fetcher Gnocchi

Gestito da Prometheus

Perché è stato escluso

OpenKeel non distribuisce Gnocchi: l'utilizzo viene da Prometheus (kube-prometheus-stack, openstack-exporter).

Perché la soluzione non ne risente

Gli stessi dati tariffati dalle metriche Prometheus; i collector possono essere aggiunti su richiesta.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Gestito dalla piattaforma Cloud Native

Elasticsearch, OpenSearch, Loki e storage v1

Gestito da InfluxDB

Perché è stato escluso

Lo storico tariffato va in InfluxDB 1.x o 2.x; gli altri backend non sono distribuiti.

Perché la soluzione non ne risente

Riepiloghi e dataframe come con lo storage v2; i difetti upstream del filtro di scope di quei backend non possono verificarsi.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Meccanismi interni semplificati

RPC RabbitMQ e lock tooz

Gestito da Kubernetes Leases

Perché è stato escluso

I preventivi sono calcolati nell'API con lo stesso codice di tariffazione; i reset di scope arrivano al processor tramite il database; un solo processor attivo detiene un Lease.

Perché la soluzione non ne risente

Stesso comportamento dell'API, una dipendenza in meno, corretto su più host.

Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md

Qui è elencato solo ciò che è stato escluso per scelta progettuale; il lavoro non ancora svolto si trova nei Known gaps del docs/CONFORMANCE.md del modulo. Tutti i moduli

Specifiche