Skip to content

feat(idmapping): add create/delete id-mapping write path - #1205

Merged
gtema merged 1 commit into
mainfrom
idmapping
Sep 4, 2026
Merged

gtema merged 1 commit into
mainfrom
idmapping

Conversation

@gtema

@gtema gtema commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

Idmapping domain only had get_by_local_id/get_by_public_id;
federated/shadow-user auth needs to actually create and remove mappings.

  • IdMappingBackend/Api/Service gain create_id_mapping and
    delete_id_mapping, mirroring python-keystone's
    MappingDriverBase.create_id_mapping/delete_id_mapping.
  • public_id is caller-supplied or auto-generated via the existing
    sha256 generate_public_id helper (bit-compatible with
    python-keystone's sha256 id generator).
  • SQL driver: create() resolves a same-local-entity PK race by
    returning the existing row (benign, matches upstream); a
    different-local-entity collision propagates Conflict. delete()
    is idempotent on no match. No migration needed - table already
    exists via entity-sync schema.
  • Verified conflict/race handling against a real in-memory sqlite
    db; MockDatabase can't synthesize a unique-violation sql_err().

Assisted-By: Claude Sonnet 5 noreply@anthropic.com
Signed-off-by: Artem Goncharov artem.goncharov@gmail.com

Idmapping domain only had get_by_local_id/get_by_public_id;
federated/shadow-user auth needs to actually create and remove mappings.

- IdMappingBackend/Api/Service gain create_id_mapping and
  delete_id_mapping, mirroring python-keystone's
  MappingDriverBase.create_id_mapping/delete_id_mapping.
- public_id is caller-supplied or auto-generated via the existing
  sha256 generate_public_id helper (bit-compatible with
  python-keystone's sha256 id generator).
- SQL driver: create() resolves a same-local-entity PK race by
  returning the existing row (benign, matches upstream); a
  different-local-entity collision propagates Conflict. delete()
  is idempotent on no match. No migration needed - table already
  exists via entity-sync schema.
- Verified conflict/race handling against a real in-memory sqlite
  db; MockDatabase can't synthesize a unique-violation sql_err().

Assisted-By: Claude Sonnet 5 <noreply@anthropic.com>
Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

🧪 Tempest Identity Compatibility Results (advisory, non-blocking)

rust

Totals
======
Ran: 129 tests in 32.8609 sec.
 - Passed: 63
 - Skipped: 4
 - Expected Fail: 0
 - Unexpected Success: 0
 - Failed: 62
Sum of execute time for each test: 21.9672 sec.
Failed test IDs
===== FAILED TESTS (target=rust) =====
tempest.api.identity.admin.v3.test_credentials.CredentialsTestJSON.test_credentials_create_get_update_delete[id-7cd59bf9-bda4-4c72-9467-d21cab278355,smoke]
tempest.api.identity.admin.v3.test_application_credentials.ApplicationCredentialsV3AdminTest.test_create_application_credential_with_roles[id-3b3dd48f-3388-406a-a9e6-4d078a552d0e]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_create_domain_without_description[id-2abf8764-309a-4fa9-bc58-201b799817ad]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_create_update_delete_domain[id-f2f5b44a-82e8-4dad-8084-0661ea3b18cf,smoke]
setUpClass (tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON)
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_domain_delete_cascades_content[id-d8d318b7-d1b3-4c37-94c5-3c5ba0b121ea]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_list_domains_filter_by_enabled[id-3fd19840-65c1-43f8-b48c-51bdd066dff9]
tempest.api.identity.admin.v3.test_default_project_id.TestDefaultProjectId.test_default_project_id[id-d6110661-6a71-49a7-a453-b5e26640ff6d]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_create_and_show_consumer[id-c8307ea6-a86c-47fd-ae7b-5b3b2caca76d]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_delete_consumer[id-fdfa1b7f-2a31-4354-b2c7-f6ae20554f93]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_list_consumers[id-09ca50de-78f2-4ffb-ac71-f2254036b2b8]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_update_consumer[id-080a9b1a-c009-47c0-9979-5305bf72e3dc]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_group_users_add_list_delete[id-1598521a-2f36-4606-8df9-30772bd51339,smoke]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_list_user_groups[id-64573281-d26a-4a52-b899-503cb0f4e4ec]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_domain_config_and_show_config_groups_and_options[id-9e3ff13c-f597-4f01-9377-d6c06c2a1477]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_update_and_delete_domain_config_groups_and_opts[id-c7510fa2-6661-4170-9c6b-4783a80651e9]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_show_default_group_config_and_options[id-11a02bf0-6f94-4380-b3b0-c8dc18fc0d22]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsStaticTestJSON.test_list_projects[id-1d830662-22ad-427c-8c3e-4ec854b0af44]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_group[id-26021436-d5a4-4256-943c-ded01e0d4b45]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_user[id-18b70e45-7687-4b72-8277-b8f1a47d7591]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_create_is_domain_project[id-a7eb9416-6f9b-4dbb-b71b-7f73aaef59d5]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_group[id-c7a8dda2-be50-4fb4-9a9c-e830771078b1]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_user[id-4e6f0366-97c8-423c-b2be-41eae6ac91c8]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_domain[id-3acf666e-5354-42ac-8e17-8b68893bcd36]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_project_tree[id-9f02ccd9-9b57-46b4-8f77-dd5a736f3a06]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_create_with_parent[id-1854f9c0-70bc-4d11-a08a-1c789d339e3d]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_get_equals_list[id-d1db68b6-aebe-4fa0-b79d-d724d2e21162]
setUpClass (tempest.api.identity.admin.v3.test_endpoint_groups.EndPointGroupsTest)
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_enabled[id-0fe7a334-675a-4509-b00e-1c4b95d5dae8]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_parent[id-6edc66f5-2941-4a17-9526-4073311c1fac]
tempest.api.identity.admin.v3.test_list_users.UsersV3TestJSON.test_list_users_with_not_enabled[id-bff8bf2f-9408-4ef5-b63a-753c8c2124eb]
tempest.api.identity.admin.v3.test_project_tags.IdentityV3ProjectTagsTest.test_list_update_delete_project_tags[id-7c123aac-999d-416a-a0fb-84b915ab10de]
tempest.api.identity.admin.v3.test_projects_negative.ProjectsNegativeStaticTestJSON.test_create_projects_name_length_over_64[id-502b6ceb-b0c8-4422-bf53-f08fdb21e2f0,negative]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_domain_roles[id-3859df7e-5b78-4e4d-b10e-214c8953842a]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_implied_roles_create_delete[id-c8828027-df48-4021-95df-b65b92c7429e]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_domain[id-4bf8a70b-e785-413a-ad53-9f91ce02faa7]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_project[id-cbf11737-1904-4690-9613-97bcbb3df1c4]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_system[id-c888fe4f-8018-48db-b959-542225c1b4b6]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_user_on_domain[id-6c9a2940-3625-43a3-ac02-5dcec62ef3bd]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_domain_roles[id-eb1e1c24-1bc4-4d47-9748-e127a1852c82]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_roles_create_check_show_delete[id-c90c316c-d706-4728-bcba-eb1912081b69]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_role_create_update_show_list[id-18afc6c0-46cf-4911-824e-9989cc056c3a,smoke]
tempest.api.identity.admin.v3.test_users_negative.UsersNegativeTest.test_create_user_for_non_existent_domain[id-e75f006c-89cc-477b-874d-588e4eab4b17,negative]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_get_available_domain_scopes[id-ec5ecb05-af64-4c04-ac86-4d9f6f12f185]
tempest.api.identity.admin.v3.test_users.UsersV3TestJSON.test_list_user_projects[id-a831e70c-e35b-430b-92ed-81ebbc5437b8]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_rescope_token[id-565fa210-1da1-4563-999b-f7b5b67cf112]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_all[id-4773ebd5-ecbf-4255-b8d8-b63e6f72b65d,smoke]
tempest.api.identity.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_query[id-6268b345-87ca-47c0-9ce3-37792b43403a]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_expire[id-0ed14b66-cefd-4b5c-a964-65759453e292]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential[id-8080c75c-eddc-4786-941a-c2da7039ae61]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_expires[id-852daf0c-42b5-4239-8466-d193d0543ed3]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_list_application_credentials[id-ff0cd457-6224-46e7-b79e-0ada4964a8a6]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_query_application_credentials[id-9bb5e5cc-5250-493a-8869-8b665f6aa5f6]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_impersonate[id-5a0a91a4-baef-4a14-baba-59bf4d7fcace]
tempest.api.identity.v3.test_projects.IdentityV3ProjectsTest.test_list_projects_returns_only_authorized_projects[id-86128d46-e170-4644-866a-cc487f699e1d]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_noimpersonate[id-ed2a8779-a7ac-49dc-afd7-30f32f936ed2]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265,smoke]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd,smoke]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_identity_v3_existence[id-79aec9ae-710f-4c54-a4fc-3aa25b4feac3]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_list_api_versions[id-721f480f-35b6-46c7-846e-047e6acea0dc,smoke]
tempest.api.identity.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
===== END FAILED TESTS (target=rust) =====

View full run

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

🦢 Load Test Results

Goose Attack Report

Plan Overview

Action Started Stopped Elapsed Users
Increasing 26-09-04 14:42:02 26-09-04 14:42:24 00:00:22 0 → 45
Maintaining 26-09-04 14:42:24 26-09-04 14:42:54 00:00:30 45
Decreasing 26-09-04 14:42:54 26-09-04 14:42:55 00:00:01 0 ← 45

Request Metrics

Method Name # Requests # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
DELETE DELETE /v3/auth/tokens 61 0 390.59 58 550 2.03 0.00
DELETE DELETE /v3/projects/:id (teardown) 1 0 166.00 166 166 0.03 0.00
DELETE DELETE /v3/roles/:id (teardown) 1 0 126.00 126 126 0.03 0.00
DELETE DELETE /v3/users/:id (teardown) 2 0 154.50 87 222 0.07 0.00
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 0 285.00 285 285 0.03 0.00
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 0 93.00 93 93 0.03 0.00
GET 842 0 418.75 215 655 28.07 0.00
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 1953 1953 15.09 1 1078 65.10 65.10
GET GET /v3/auth/tokens (validate new) 61 0 392.43 213 518 2.03 0.00
GET GET /v3/auth/tokens (validate revoked) 61 0 370.93 42 569 2.03 0.00
GET GET /v3/projects/:id 77 0 394.27 262 573 2.57 0.00
GET GET /v3/projects/:id (catalog) 114 0 384.60 229 642 3.80 0.00
GET GET /v3/role_assignments 57 0 432.23 280 619 1.90 0.00
GET GET /v3/role_assignments?role.id 58 0 399.43 241 546 1.93 0.00
GET GET /v3/role_assignments?scope.domain.id 60 0 341.32 244 445 2.00 0.00
GET GET /v3/role_assignments?user.id 59 0 396.31 277 542 1.97 0.00
GET GET /v3/roles 154 0 397.25 249 591 5.13 0.00
GET GET /v3/roles/:id 76 0 399.01 260 609 2.53 0.00
GET GET /v3/users/:id 149 0 409.51 263 604 4.97 0.00
GET GET /v3/users/:id (catalog) 146 0 413.03 258 609 4.87 0.00
GET GET /v4/api-keys 36 0 396.56 248 551 1.20 0.00
GET GET /v4/api-keys/:client_id 36 0 447.11 327 627 1.20 0.00
GET GET /v4/mappings/rulesets 37 0 391.76 241 540 1.23 0.00
GET GET /v4/mappings/rulesets/:mapping_id 38 0 415.50 292 537 1.27 0.00
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 939 0 47.53 8 190 31.30 0.00
GET GET /v4/oauth2/:domain_id/clients 38 0 409.82 291 550 1.27 0.00
GET GET /v4/oauth2/:domain_id/clients/:provider_id 38 0 391.63 255 635 1.27 0.00
GET GET /v4/oauth2/:domain_id/jwks 940 0 47.70 6 182 31.33 0.00
GET GET /v4/scim_realms 24 0 394.25 266 541 0.80 0.00
GET GET /v4/scim_realms/:domain_id/:provider_id 24 0 391.83 268 507 0.80 0.00
POST POST /v3/auth/tokens 59 0 357.46 210 535 1.97 0.00
POST POST /v3/auth/tokens (password, invalid) 34 0 910.38 501 1646 1.13 0.00
POST POST /v3/auth/tokens (password, project-scoped) 62 0 1110.94 729 1651 2.07 0.00
POST POST /v3/auth/tokens (password, unscoped) 61 0 889.74 556 1458 2.03 0.00
POST POST /v3/auth/tokens (rescope to system) 139 0 439.09 249 607 4.63 0.00
POST POST /v3/auth/tokens (rescope, invalid project) 84 0 362.76 175 579 2.80 0.00
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 58 0 1061.43 554 1624 1.93 0.00
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 0 339.00 339 339 0.03 0.00
PUT PUT /v4/scim_realms/:domain_id/:provider_id 24 0 489.67 318 662 0.80 0.00
Aggregated 6606 1953 207.68 1 1651 220.20 65.10

Response Time Metrics

Method Name 50%ile (ms) 60%ile (ms) 70%ile (ms) 80%ile (ms) 90%ile (ms) 95%ile (ms) 99%ile (ms) 100%ile (ms)
DELETE DELETE /v3/auth/tokens 390 420 430 450 500 500 500 550
DELETE DELETE /v3/projects/:id (teardown) 166 166 166 166 166 166 166 166
DELETE DELETE /v3/roles/:id (teardown) 126 126 126 126 126 126 126 126
DELETE DELETE /v3/users/:id (teardown) 87 87 87 220 220 220 220 220
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 285 285 285 285 285 285 285 285
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 93 93 93 93 93 93 93 93
GET 420 440 460 490 500 600 600 655
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 6 7 8 10 15 22 390 1,000
GET GET /v3/auth/tokens (validate new) 390 400 410 450 470 500 500 500
GET GET /v3/auth/tokens (validate revoked) 370 390 410 450 470 500 500 569
GET GET /v3/projects/:id 410 420 440 450 470 490 500 573
GET GET /v3/projects/:id (catalog) 370 400 420 430 470 500 600 600
GET GET /v3/role_assignments 420 460 470 490 500 500 600 600
GET GET /v3/role_assignments?role.id 410 420 430 460 490 500 500 500
GET GET /v3/role_assignments?scope.domain.id 350 360 370 370 410 430 440 445
GET GET /v3/role_assignments?user.id 390 400 430 460 480 500 500 500
GET GET /v3/roles 390 410 440 450 480 500 500 591
GET GET /v3/roles/:id 400 410 440 460 480 500 600 600
GET GET /v3/users/:id 410 430 450 470 500 500 500 600
GET GET /v3/users/:id (catalog) 410 440 460 470 500 500 600 600
GET GET /v4/api-keys 400 420 420 440 480 490 551 551
GET GET /v4/api-keys/:client_id 450 460 470 500 500 500 600 600
GET GET /v4/mappings/rulesets 390 410 420 430 480 500 500 500
GET GET /v4/mappings/rulesets/:mapping_id 410 430 460 480 500 500 500 500
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 39 46 57 67 85 110 150 190
GET GET /v4/oauth2/:domain_id/clients 400 420 450 470 500 500 550 550
GET GET /v4/oauth2/:domain_id/clients/:provider_id 380 400 420 460 500 500 600 600
GET GET /v4/oauth2/:domain_id/jwks 39 47 58 68 84 100 140 180
GET GET /v4/scim_realms 410 420 420 430 480 500 500 500
GET GET /v4/scim_realms/:domain_id/:provider_id 380 420 440 440 490 500 500 500
POST POST /v3/auth/tokens 350 360 400 410 440 450 470 500
POST POST /v3/auth/tokens (password, invalid) 900 900 1,000 1,000 1,000 1,000 1,646 1,646
POST POST /v3/auth/tokens (password, project-scoped) 1,000 1,000 1,000 1,000 1,000 1,000 1,651 1,651
POST POST /v3/auth/tokens (password, unscoped) 900 900 900 1,000 1,000 1,000 1,000 1,000
POST POST /v3/auth/tokens (rescope to system) 430 440 470 500 600 600 600 600
POST POST /v3/auth/tokens (rescope, invalid project) 360 380 400 420 460 480 500 579
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,624
POST POST /v4/api-keys/:client_id/revoke (teardown) 339 339 339 339 339 339 339 339
PUT PUT /v4/scim_realms/:domain_id/:provider_id 480 500 500 600 600 600 662 662
Aggregated 60 300 370 420 480 500 1,000 1,651

Status Code Metrics

Method Name Status Codes
DELETE DELETE /v3/auth/tokens 61 [204]
DELETE DELETE /v3/projects/:id (teardown) 1 [204]
DELETE DELETE /v3/roles/:id (teardown) 1 [204]
DELETE DELETE /v3/users/:id (teardown) 2 [204]
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 [204]
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 [204]
GET 842 [200]
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 31 [401], 1,922 [429]
GET GET /v3/auth/tokens (validate new) 61 [200]
GET GET /v3/auth/tokens (validate revoked) 61 [404]
GET GET /v3/projects/:id 77 [200]
GET GET /v3/projects/:id (catalog) 114 [200]
GET GET /v3/role_assignments 57 [200]
GET GET /v3/role_assignments?role.id 58 [200]
GET GET /v3/role_assignments?scope.domain.id 60 [200]
GET GET /v3/role_assignments?user.id 59 [200]
GET GET /v3/roles 154 [200]
GET GET /v3/roles/:id 76 [200]
GET GET /v3/users/:id 149 [200]
GET GET /v3/users/:id (catalog) 146 [200]
GET GET /v4/api-keys 36 [200]
GET GET /v4/api-keys/:client_id 36 [200]
GET GET /v4/mappings/rulesets 37 [200]
GET GET /v4/mappings/rulesets/:mapping_id 38 [200]
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 939 [200]
GET GET /v4/oauth2/:domain_id/clients 38 [200]
GET GET /v4/oauth2/:domain_id/clients/:provider_id 38 [200]
GET GET /v4/oauth2/:domain_id/jwks 940 [200]
GET GET /v4/scim_realms 24 [200]
GET GET /v4/scim_realms/:domain_id/:provider_id 24 [200]
POST POST /v3/auth/tokens 59 [201]
POST POST /v3/auth/tokens (password, invalid) 34 [401]
POST POST /v3/auth/tokens (password, project-scoped) 62 [201]
POST POST /v3/auth/tokens (password, unscoped) 61 [201]
POST POST /v3/auth/tokens (rescope to system) 139 [201]
POST POST /v3/auth/tokens (rescope, invalid project) 84 [401]
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 58 [201]
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 [200]
PUT PUT /v4/scim_realms/:domain_id/:provider_id 24 [200]
Aggregated 1,922 [429], 4,028 [200], 379 [201], 61 [404], 67 [204], 149 [401]

Transaction Metrics

Transaction # Times Run # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
ReadHeavy
0.0 1 0 36.00 36 36 0.03 0.00
0.1 151 0 417.77 248 639 5.03 0.00
0.2 151 0 400.95 240 594 5.03 0.00
0.3 150 0 394.85 215 593 5.00 0.00
TokenLifecycle
1.0 0 0 0.00 0 0 0.00 0.00
1.1 61 0 1513.33 577 1784 2.03 0.00
ValidateToken
2.0 0 0 0.00 0 0 0.00 0.00
2.1 129 0 472.88 275 633 4.30 0.00
UserCRUD
3.0 0 0 0.00 0 0 0.00 0.00
3.1 0 0 0.00 0 0 0.00 0.00
3.2 149 0 409.52 263 604 4.97 0.00
3.3 2 0 154.50 87 222 0.07 0.00
ProjectCRUD
4.0 0 0 0.00 0 0 0.00 0.00
4.1 0 0 0.00 0 0 0.00 0.00
4.2 77 0 394.30 262 573 2.57 0.00
4.3 1 0 166.00 166 166 0.03 0.00
RoleCRUD
5.0 0 0 0.00 0 0 0.00 0.00
5.1 0 0 0.00 0 0 0.00 0.00
5.2 76 0 399.03 260 609 2.53 0.00
5.3 1 0 126.00 126 126 0.03 0.00
RoleList
6.0 0 0 0.00 0 0 0.00 0.00
6.1 154 0 397.25 249 591 5.13 0.00
RoleAssignmentList
7.0 0 0 0.00 0 0 0.00 0.00
7.1 57 0 432.30 280 619 1.90 0.00
7.2 59 0 396.34 277 542 1.97 0.00
7.3 60 0 341.33 244 445 2.00 0.00
7.4 58 0 399.47 241 546 1.93 0.00
UserRead
8.0 0 0 0.00 0 0 0.00 0.00
8.1 145 0 424.45 246 655 4.83 0.00
8.2 146 0 413.05 258 609 4.87 0.00
ProjectRead
9.0 0 0 0.00 0 0 0.00 0.00
9.1 116 0 406.97 253 619 3.87 0.00
9.2 114 0 384.64 229 642 3.80 0.00
PasswordAuth
10.0 61 0 889.75 556 1458 2.03 0.00
10.1 62 0 1111.00 729 1651 2.07 0.00
PasswordAuthNegative
11.0 34 0 910.41 501 1646 1.13 0.00
Rescope
12.0 0 0 0.00 0 0 0.00 0.00
12.1 139 0 439.11 249 607 4.63 0.00
RescopeNegative
13.0 0 0 0.00 0 0 0.00 0.00
13.1 84 0 362.81 175 579 2.80 0.00
SystemScopeAuth
14.0 58 0 1061.50 554 1624 1.93 0.00
ApiKeyCRUD
15.0 0 0 0.00 0 0 0.00 0.00
15.1 0 0 0.00 0 0 0.00 0.00
15.2 36 0 447.17 327 627 1.20 0.00
15.3 36 0 396.58 248 551 1.20 0.00
15.4 1 0 339.00 339 339 0.03 0.00
MappingCRUD
16.0 0 0 0.00 0 0 0.00 0.00
16.1 0 0 0.00 0 0 0.00 0.00
16.2 38 0 415.50 292 537 1.27 0.00
16.3 37 0 391.81 241 540 1.23 0.00
16.4 1 0 285.00 285 285 0.03 0.00
OAuth2ClientCRUD
17.0 0 0 0.00 0 0 0.00 0.00
17.1 0 0 0.00 0 0 0.00 0.00
17.2 38 0 391.63 255 635 1.27 0.00
17.3 38 0 409.87 291 550 1.27 0.00
17.4 1 0 97.00 97 97 0.03 0.00
OAuth2Discovery
18.0 940 0 47.73 6 182 31.33 0.00
18.1 939 0 47.56 8 190 31.30 0.00
ScimRealmRead
19.0 0 0 0.00 0 0 0.00 0.00
19.1 24 0 391.88 268 507 0.80 0.00
19.2 24 0 394.29 266 541 0.80 0.00
19.3 24 0 489.79 318 662 0.80 0.00
ScimSync
20.0 0 0 0.00 0 0 0.00 0.00
20.1 0 0 0.00 0 0 0.00 0.00
20.2 0 0 0.00 0 0 0.00 0.00
20.3 1953 0 15.12 1 1078 65.10 0.00
20.4 1952 0 0.00 0 0 65.07 0.00
20.5 1952 0 0.00 0 0 65.07 0.00
20.6 1 0 0.00 0 0 0.03 0.00
Aggregated 10331 0 132.80 1 1784 344.37 0.00

Scenario Metrics

Transaction # Users # Times Run Average (ms) Min (ms) Max (ms) Scenarios/s Iterations
ReadHeavy 6 149 1221.36 865 1504 4.97 24.83
TokenLifecycle 3 58 1535.98 1109 1784 1.93 19.33
ValidateToken 2 127 474.19 275 633 4.23 63.50
UserCRUD 2 147 410.50 263 604 4.90 73.50
ProjectCRUD 1 76 394.71 262 573 2.53 76.00
RoleCRUD 1 75 399.01 260 609 2.50 75.00
RoleList 2 152 398.45 249 591 5.07 76.00
RoleAssignmentList 3 57 1568.21 1190 1936 1.90 19.00
UserRead 4 144 841.42 600 1082 4.80 36.00
ProjectRead 3 114 794.35 582 1097 3.80 38.00
PasswordAuth 4 59 2022.29 1427 2545 1.97 14.75
PasswordAuthNegative 1 33 911.36 501 1646 1.10 33.00
Rescope 2 137 440.85 249 607 4.57 68.50
RescopeNegative 1 83 363.53 175 579 2.77 83.00
SystemScopeAuth 2 56 1072.88 591 1624 1.87 28.00
ApiKeyCRUD 1 36 840.75 576 1061 1.20 36.00
MappingCRUD 1 37 811.14 576 986 1.23 37.00
OAuth2ClientCRUD 1 38 803.63 581 950 1.27 38.00
OAuth2Discovery 3 937 95.61 24 314 31.23 312.33
ScimRealmRead 1 24 1278.96 1007 1610 0.80 24.00
ScimSync 1 1952 15.13 1 1078 65.07 1952.00
Aggregated 45 4491 301.47 1 2545 149.70 3127.75

Error Metrics

Method Name # Error
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 48 401 Unauthorized: GET /SCIM/v2/:domain_id/Users (sync reconcile list)
POST POST /SCIM/v2/:domain_id/Users (sync provision) 1 401 Unauthorized: POST /SCIM/v2/:domain_id/Users (sync provision)
POST POST /v3/auth/tokens (password, invalid) 78 401 Unauthorized: POST /v3/auth/tokens (password, invalid)
POST POST /v3/auth/tokens (rescope, invalid project) 214 401 Unauthorized: POST /v3/auth/tokens (rescope, invalid project)
GET GET /v3/auth/tokens (validate revoked) 212 404 Not Found: GET /v3/auth/tokens (validate revoked)
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 2277 429 Too Many Requests: GET /SCIM/v2/:domain_id/Users (sync reconcile list)

View full report

@gtema
gtema added this pull request to the merge queue Sep 4, 2026
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

🐰 Bencher Report

Projectkeystone
Branchidmapping
Testbedubuntu-latest
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
nanoseconds (ns)
(Result Δ%)
Upper Boundary
nanoseconds (ns)
(Limit %)
Command_Serde/apply/remove📈 view plot
🚷 view threshold
151,270.00 ns
(-44.60%)Baseline: 273,061.92 ns
1,352,562.82 ns
(11.18%)
Command_Serde/apply/set📈 view plot
🚷 view threshold
191,910.00 ns
(-56.61%)Baseline: 442,271.72 ns
3,265,744.75 ns
(5.88%)
Command_Serde/pack/delete📈 view plot
🚷 view threshold
121.14 ns
(+2.77%)Baseline: 117.87 ns
155.45 ns
(77.93%)
Command_Serde/pack/delete_index📈 view plot
🚷 view threshold
109.05 ns
(+3.74%)Baseline: 105.12 ns
138.49 ns
(78.74%)
Command_Serde/pack/set📈 view plot
🚷 view threshold
209.48 ns
(+10.45%)Baseline: 189.66 ns
244.95 ns
(85.52%)
Command_Serde/pack/set_index📈 view plot
🚷 view threshold
108.89 ns
(+3.66%)Baseline: 105.05 ns
139.01 ns
(78.33%)
Command_Serde/unpack/delete📈 view plot
🚷 view threshold
195.49 ns
(+4.94%)Baseline: 186.28 ns
267.74 ns
(73.02%)
Command_Serde/unpack/delete_index📈 view plot
🚷 view threshold
156.97 ns
(+1.27%)Baseline: 155.00 ns
216.27 ns
(72.58%)
Command_Serde/unpack/set📈 view plot
🚷 view threshold
290.12 ns
(+11.47%)Baseline: 260.26 ns
354.73 ns
(81.79%)
Command_Serde/unpack/set_index📈 view plot
🚷 view threshold
156.35 ns
(+2.49%)Baseline: 152.56 ns
210.71 ns
(74.20%)
Payload_encryption/pack/remove_cmd📈 view plot
🚷 view threshold
115.55 ns
(+2.64%)Baseline: 112.58 ns
149.99 ns
(77.04%)
Payload_encryption/pack/set_cmd📈 view plot
🚷 view threshold
202.44 ns
(+2.66%)Baseline: 197.19 ns
263.19 ns
(76.92%)
Payload_encryption/unpack/remove_cmd📈 view plot
🚷 view threshold
210.33 ns
(+7.69%)Baseline: 195.32 ns
283.19 ns
(74.27%)
Payload_encryption/unpack/set_cmd📈 view plot
🚷 view threshold
307.58 ns
(+13.70%)Baseline: 270.52 ns
374.71 ns
(82.08%)
Raft_1Node_Latency/prefix/1node📈 view plot
🚷 view threshold
2,600,400.00 ns
(-12.35%)Baseline: 2,966,669.67 ns
7,776,746.17 ns
(33.44%)
Raft_1Node_Latency/read/1node📈 view plot
🚷 view threshold
43,665.00 ns
(+17.06%)Baseline: 37,301.86 ns
51,602.01 ns
(84.62%)
Raft_1Node_Latency/remove/1node📈 view plot
🚷 view threshold
425,100.00 ns
(-65.30%)Baseline: 1,225,061.09 ns
11,602,530.67 ns
(3.66%)
Raft_1Node_Latency/write/1node📈 view plot
🚷 view threshold
439,260.00 ns
(-56.07%)Baseline: 999,999.06 ns
7,589,375.96 ns
(5.79%)
build_snapshot/default📈 view plot
🚷 view threshold
109,780.00 ns
(-12.45%)Baseline: 125,395.36 ns
277,171.38 ns
(39.61%)
fernet token/project📈 view plot
🚷 view threshold
1,463.30 ns
(+2.86%)Baseline: 1,422.67 ns
1,793.58 ns
(81.59%)
get_data_keyspace📈 view plot
🚷 view threshold
0.33 ns
(+3.15%)Baseline: 0.32 ns
0.39 ns
(84.09%)
get_db📈 view plot
🚷 view threshold
0.32 ns
(+1.59%)Baseline: 0.32 ns
0.39 ns
(82.94%)
get_fernet_token_timestamp/project📈 view plot
🚷 view threshold
148.80 ns
(+6.62%)Baseline: 139.56 ns
179.20 ns
(83.04%)
get_keyspace📈 view plot
🚷 view threshold
4.64 ns
(-21.20%)Baseline: 5.89 ns
13.79 ns
(33.67%)
🐰 View full continuous benchmarking report in Bencher

Merged via the queue into main with commit 3dff269 Sep 4, 2026
36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant