OpenKeel implementation in Go of OpenStack keystone (keystone-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-keystone
Binaries: keystone-api (API on port 5000, health and metrics on 9090) and keystone-customers (the controller of the OpenKeelCustomer resources, below)
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
Excerpt from openkeel-keystone/README.md (in English).
REST API
259 operations of the original REST API (routes and body actions), and their state in OpenKeel.
Python Keystone's recorded unit-test exchanges are replayed against the Go service; the Go Keystone is also used by Skyline, the CLIs and every other service on the lab.
Replay of recorded exchanges
E2E replay of recorded exchanges
The exchanges recorded from Python Keystone's tests give the same status and body from the Go service.
How it runs
make e2e; report in test/e2e/report.json, accepted differences in test/e2e/known-differences.txt.
Latest result 7345 / 8896 requests identical in the last report (1489 files).
Source: openkeel-keystone/test/e2e/report.json
Unit and golden tests
Unit tests and ported s3tokens vectors
Unit tests, including the EC2 and S3 signature vectors of test_contrib_s3_core ported by hand.
How it runs
make test (vet and race detector); internal/keystone/ec2sign_test.go, internal/api/s3tokens_test.go.
Source: openkeel-keystone/docs/CONFORMANCE.md
Client contract
Skyline against the Go Keystone
Login, profile, policies, project switch, regions, domains, endpoints, wrong-password text and logout work as against Python.
How it runs
Live run of openkeel-skyline against a MariaDB-seeded Go Keystone.
Latest result System admin policies: 1 817 / 1 860 allowed, as Python against its fake.
Source: openkeel-skyline/docs/CONFORMANCE.md
End to end on a lab
Lab smoke test
Project- and system-scoped admin tokens and a catalog listing every expected service, used by the other services' checks.
How it runs
make lab-smoke runs labctl smoke in the lab cluster.
Source: openkeel-lab/README.md
Left out of the rewrite
Keystone keeps its API and leaves out the oslo service plumbing and the basic notification format, auditing with CADF events instead.
Internal machinery simplified
basic notification format
Why it was left out
Only CADF, the upstream default, is implemented; events go through the audit emitter (JSON on stdout, oslo.messaging when enabled).
Why the solution is not affected
Setting basic logs a warning and CADF is sent. No OpenKeel service consumes Keystone's basic payloads.
Source: openkeel-keystone/docs/CONFORMANCE.md
Done by the Cloud Native platform
File logging, osprofiler, healthcheck, CORS
Taken over by Kubernetes probes, OpenTelemetry, Ingress
Why it was left out
Logs go to stdout as JSON, traces to OpenTelemetry, health to Kubernetes probes and CORS to the ingress.
Why the solution is not affected
Operators use the cluster's tooling; the identity API is unchanged.