Skip to content

feat(adr0034): Add per-domain driver config surface - #1216

Merged
gtema merged 1 commit into
mainfrom
claude/per-domain-assignments-provider-k0tp5e
Sep 7, 2026
Merged

feat(adr0034): Add per-domain driver config surface#1216
gtema merged 1 commit into
mainfrom
claude/per-domain-assignments-provider-k0tp5e

Conversation

@gtema

@gtema gtema commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

First of the stacked ADR 0034 PRs: parse-only, no dispatch wired yet.

  • [domain_config] section with Option<bool> from_files/from_database
    so an unset key inherits the deprecated [identity] switch
  • [assignment] gains domain_specific_drivers_enabled, plus
    [assignment.backends.<name>] driver blocks and an
    [assignment.domains] id->block map; INI merge of the leaf and
    nested sections is covered by test
  • assignment domain-config group (whitelist: driver only, no
    sensitive options) with resolve_assignment_driver_name and a
    validate_values arm rejecting a non-scalar driver
  • fs and sql domain-config driver tests move their "unknown group"
    fixture off assignment (now supported) onto quota

Signed-off-by: Artem Goncharov artem.goncharov@gmail.com

First of the stacked ADR 0034 PRs: parse-only, no dispatch wired yet.

- `[domain_config]` section with `Option<bool>` from_files/from_database
  so an unset key inherits the deprecated `[identity]` switch
- `[assignment]` gains domain_specific_drivers_enabled, plus
  `[assignment.backends.<name>]` driver blocks and an
  `[assignment.domains]` id->block map; INI merge of the leaf and
  nested sections is covered by test
- `assignment` domain-config group (whitelist: `driver` only, no
  sensitive options) with resolve_assignment_driver_name and a
  validate_values arm rejecting a non-scalar driver
- fs and sql domain-config driver tests move their "unknown group"
  fixture off `assignment` (now supported) onto `quota`

Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
@gtema
gtema enabled auto-merge September 7, 2026 13:10
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

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

rust

Totals
======
Ran: 133 tests in 26.7960 sec.
 - Passed: 66
 - Skipped: 4
 - Expected Fail: 0
 - Unexpected Success: 0
 - Failed: 63
Sum of execute time for each test: 19.8023 sec.
Failed test IDs
===== FAILED TESTS (target=rust) =====
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]
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_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_credentials.CredentialsTestJSON.test_credentials_create_get_update_delete[id-7cd59bf9-bda4-4c72-9467-d21cab278355,smoke]
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_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_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_groups.GroupsV3TestJSON.test_group_users_add_list_delete[id-1598521a-2f36-4606-8df9-30772bd51339,smoke]
setUpClass (tempest.api.identity.admin.v3.test_endpoint_groups.EndPointGroupsTest)
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_list_user_groups[id-64573281-d26a-4a52-b899-503cb0f4e4ec]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_create_domain_with_name_length_over_64[id-37b1bbf2-d664-4785-9a11-333438586eae,negative]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_delete_active_domain[gate,id-1f3fbff5-4e44-400d-9ca1-d953f05f609b,negative]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsStaticTestJSON.test_list_projects[id-1d830662-22ad-427c-8c3e-4ec854b0af44]
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_list_users.UsersV3TestJSON.test_list_users_with_not_enabled[id-bff8bf2f-9408-4ef5-b63a-753c8c2124eb]
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_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.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
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_projects.ProjectsTestJSON.test_create_is_domain_project[id-a7eb9416-6f9b-4dbb-b71b-7f73aaef59d5]
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]
tempest.api.identity.v3.test_projects.IdentityV3ProjectsTest.test_list_projects_returns_only_authorized_projects[id-86128d46-e170-4644-866a-cc487f699e1d]
tempest.api.identity.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
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_tokens.TokensV3TestJSON.test_get_available_domain_scopes[id-ec5ecb05-af64-4c04-ac86-4d9f6f12f185]
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_tokens.TokensV3TestJSON.test_rescope_token[id-565fa210-1da1-4563-999b-f7b5b67cf112]
tempest.api.identity.admin.v3.test_users.UsersV3TestJSON.test_list_user_projects[id-a831e70c-e35b-430b-92ed-81ebbc5437b8]
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_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_get_trusts_all[id-4773ebd5-ecbf-4255-b8d8-b63e6f72b65d,smoke]
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.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_trusts.TrustsV3TestJSON.test_trust_impersonate[id-5a0a91a4-baef-4a14-baba-59bf4d7fcace]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_noimpersonate[id-ed2a8779-a7ac-49dc-afd7-30f32f936ed2]
===== END FAILED TESTS (target=rust) =====

View full run

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

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

🦢 Load Test Results

Goose Attack Report

Plan Overview

Action Started Stopped Elapsed Users
Increasing 26-09-07 13:32:58 26-09-07 13:33:20 00:00:22 0 → 45
Maintaining 26-09-07 13:33:20 26-09-07 13:33:50 00:00:30 45
Decreasing 26-09-07 13:33:50 26-09-07 13:33:51 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 59 0 398.49 48 519 1.97 0.00
DELETE DELETE /v3/projects/:id (teardown) 1 0 39.00 39 39 0.03 0.00
DELETE DELETE /v3/roles/:id (teardown) 1 0 60.00 60 60 0.03 0.00
DELETE DELETE /v3/users/:id (teardown) 2 0 54.50 45 64 0.07 0.00
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 0 69.00 69 69 0.03 0.00
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 0 75.00 75 75 0.03 0.00
GET 823 0 426.83 173 691 27.43 0.00
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 2944 2944 9.69 1 857 98.13 98.13
GET GET /v3/auth/tokens (validate new) 58 0 397.14 83 593 1.93 0.00
GET GET /v3/auth/tokens (validate revoked) 61 0 374.64 16 548 2.03 0.00
GET GET /v3/projects/:id 76 0 398.74 209 561 2.53 0.00
GET GET /v3/projects/:id (catalog) 113 0 406.07 205 599 3.77 0.00
GET GET /v3/role_assignments 57 0 411.16 266 566 1.90 0.00
GET GET /v3/role_assignments?role.id 58 0 406.50 214 598 1.93 0.00
GET GET /v3/role_assignments?scope.domain.id 57 0 387.51 185 542 1.90 0.00
GET GET /v3/role_assignments?user.id 57 0 382.54 206 541 1.90 0.00
GET GET /v3/roles 150 0 403.66 218 609 5.00 0.00
GET GET /v3/roles/:id 77 0 395.96 206 551 2.57 0.00
GET GET /v3/users/:id 145 0 418.59 196 606 4.83 0.00
GET GET /v3/users/:id (catalog) 141 0 421.52 220 599 4.70 0.00
GET GET /v4/api-keys 35 0 387.89 272 509 1.17 0.00
GET GET /v4/api-keys/:client_id 36 0 469.14 214 892 1.20 0.00
GET GET /v4/mappings/rulesets 38 0 400.58 253 559 1.27 0.00
GET GET /v4/mappings/rulesets/:mapping_id 38 0 402.82 306 622 1.27 0.00
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 1116 0 40.25 5 346 37.20 0.00
GET GET /v4/oauth2/:domain_id/clients 38 0 409.74 267 622 1.27 0.00
GET GET /v4/oauth2/:domain_id/clients/:provider_id 38 0 395.58 281 503 1.27 0.00
GET GET /v4/oauth2/:domain_id/jwks 1115 0 39.68 6 350 37.17 0.00
GET GET /v4/scim_realms 23 0 400.52 261 575 0.77 0.00
GET GET /v4/scim_realms/:domain_id/:provider_id 24 0 390.42 249 533 0.80 0.00
POST POST /v3/auth/tokens 58 0 375.55 212 571 1.93 0.00
POST POST /v3/auth/tokens (password, invalid) 42 0 733.50 472 1159 1.40 0.00
POST POST /v3/auth/tokens (password, project-scoped) 69 0 973.77 533 1406 2.30 0.00
POST POST /v3/auth/tokens (password, unscoped) 68 0 818.56 392 1340 2.27 0.00
POST POST /v3/auth/tokens (rescope to system) 136 0 450.91 247 654 4.53 0.00
POST POST /v3/auth/tokens (rescope, invalid project) 81 0 376.36 197 569 2.70 0.00
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 64 0 964.48 526 1476 2.13 0.00
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 0 117.00 117 117 0.03 0.00
PUT PUT /v4/scim_realms/:domain_id/:provider_id 24 0 481.79 354 592 0.80 0.00
Aggregated 7926 2944 172.57 1 1476 264.20 98.13

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 420 430 440 450 470 480 500 500
DELETE DELETE /v3/projects/:id (teardown) 39 39 39 39 39 39 39 39
DELETE DELETE /v3/roles/:id (teardown) 60 60 60 60 60 60 60 60
DELETE DELETE /v3/users/:id (teardown) 45 45 45 64 64 64 64 64
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 69 69 69 69 69 69 69 69
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 75 75 75 75 75 75 75 75
GET 420 450 460 490 500 600 600 691
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 4 5 6 8 11 15 190 857
GET GET /v3/auth/tokens (validate new) 400 410 430 450 500 500 593 593
GET GET /v3/auth/tokens (validate revoked) 370 390 410 430 460 470 490 500
GET GET /v3/projects/:id 400 420 440 450 480 500 500 561
GET GET /v3/projects/:id (catalog) 410 430 450 470 490 500 599 599
GET GET /v3/role_assignments 420 420 440 460 490 500 500 566
GET GET /v3/role_assignments?role.id 420 430 440 460 480 500 598 598
GET GET /v3/role_assignments?scope.domain.id 390 400 410 430 470 500 500 500
GET GET /v3/role_assignments?user.id 380 400 410 450 470 500 500 500
GET GET /v3/roles 410 420 430 450 500 500 600 600
GET GET /v3/roles/:id 390 420 440 450 480 500 500 551
GET GET /v3/users/:id 420 440 460 480 500 500 600 600
GET GET /v3/users/:id (catalog) 420 440 470 480 500 500 599 599
GET GET /v4/api-keys 390 400 420 430 450 460 500 500
GET GET /v4/api-keys/:client_id 470 480 500 500 600 600 892 892
GET GET /v4/mappings/rulesets 390 410 440 460 490 500 559 559
GET GET /v4/mappings/rulesets/:mapping_id 400 400 420 440 470 500 600 600
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 33 38 46 58 74 83 120 346
GET GET /v4/oauth2/:domain_id/clients 400 430 430 460 500 500 600 600
GET GET /v4/oauth2/:domain_id/clients/:provider_id 380 410 450 460 470 480 500 500
GET GET /v4/oauth2/:domain_id/jwks 32 37 44 57 71 82 120 350
GET GET /v4/scim_realms 390 400 410 420 575 575 575 575
GET GET /v4/scim_realms/:domain_id/:provider_id 390 400 420 430 460 500 500 500
POST POST /v3/auth/tokens 360 380 410 420 480 500 571 571
POST POST /v3/auth/tokens (password, invalid) 700 800 800 900 900 1,000 1,000 1,000
POST POST /v3/auth/tokens (password, project-scoped) 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000
POST POST /v3/auth/tokens (password, unscoped) 800 900 900 1,000 1,000 1,000 1,000 1,000
POST POST /v3/auth/tokens (rescope to system) 450 470 480 500 500 600 600 654
POST POST /v3/auth/tokens (rescope, invalid project) 370 390 420 440 470 480 569 569
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 900 1,000 1,000 1,000 1,000 1,000 1,000 1,000
POST POST /v4/api-keys/:client_id/revoke (teardown) 117 117 117 117 117 117 117 117
PUT PUT /v4/scim_realms/:domain_id/:provider_id 480 490 500 500 592 592 592 592
Aggregated 31 61 340 410 470 500 1,000 1,000

Status Code Metrics

Method Name Status Codes
DELETE DELETE /v3/auth/tokens 59 [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 823 [200]
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 30 [401], 2,914 [429]
GET GET /v3/auth/tokens (validate new) 58 [200]
GET GET /v3/auth/tokens (validate revoked) 61 [404]
GET GET /v3/projects/:id 76 [200]
GET GET /v3/projects/:id (catalog) 113 [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 57 [200]
GET GET /v3/role_assignments?user.id 57 [200]
GET GET /v3/roles 150 [200]
GET GET /v3/roles/:id 77 [200]
GET GET /v3/users/:id 145 [200]
GET GET /v3/users/:id (catalog) 141 [200]
GET GET /v4/api-keys 35 [200]
GET GET /v4/api-keys/:client_id 36 [200]
GET GET /v4/mappings/rulesets 38 [200]
GET GET /v4/mappings/rulesets/:mapping_id 38 [200]
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 1,116 [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 1,115 [200]
GET GET /v4/scim_realms 23 [200]
GET GET /v4/scim_realms/:domain_id/:provider_id 24 [200]
POST POST /v3/auth/tokens 58 [201]
POST POST /v3/auth/tokens (password, invalid) 42 [401]
POST POST /v3/auth/tokens (password, project-scoped) 69 [201]
POST POST /v3/auth/tokens (password, unscoped) 68 [201]
POST POST /v3/auth/tokens (rescope to system) 136 [201]
POST POST /v3/auth/tokens (rescope, invalid project) 81 [401]
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 64 [201]
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 [200]
PUT PUT /v4/scim_realms/:domain_id/:provider_id 24 [200]
Aggregated 2,914 [429], 61 [404], 395 [201], 65 [204], 4,338 [200], 153 [401]

Transaction Metrics

Transaction # Times Run # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
ReadHeavy
0.0 0 0 0.00 0 0 0.00 0.00
0.1 146 0 451.73 229 644 4.87 0.00
0.2 150 0 402.63 240 571 5.00 0.00
0.3 146 0 385.99 173 622 4.87 0.00
TokenLifecycle
1.0 0 0 0.00 0 0 0.00 0.00
1.1 61 0 1553.39 443 1953 2.03 0.00
ValidateToken
2.0 0 0 0.00 0 0 0.00 0.00
2.1 128 0 477.88 264 691 4.27 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 145 0 418.62 196 606 4.83 0.00
3.3 2 0 54.50 45 64 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 76 0 398.75 209 561 2.53 0.00
4.3 1 0 39.00 39 39 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 77 0 396.01 206 552 2.57 0.00
5.3 1 0 60.00 60 60 0.03 0.00
RoleList
6.0 0 0 0.00 0 0 0.00 0.00
6.1 150 0 403.66 218 609 5.00 0.00
RoleAssignmentList
7.0 0 0 0.00 0 0 0.00 0.00
7.1 57 0 411.21 266 566 1.90 0.00
7.2 57 0 382.56 206 541 1.90 0.00
7.3 57 0 387.54 185 542 1.90 0.00
7.4 58 0 406.57 214 598 1.93 0.00
UserRead
8.0 0 0 0.00 0 0 0.00 0.00
8.1 140 0 441.64 208 658 4.67 0.00
8.2 141 0 421.52 220 599 4.70 0.00
ProjectRead
9.0 0 0 0.00 0 0 0.00 0.00
9.1 113 0 403.57 249 551 3.77 0.00
9.2 113 0 406.14 205 599 3.77 0.00
PasswordAuth
10.0 68 0 818.62 392 1340 2.27 0.00
10.1 69 0 973.80 533 1406 2.30 0.00
PasswordAuthNegative
11.0 42 0 733.55 472 1159 1.40 0.00
Rescope
12.0 0 0 0.00 0 0 0.00 0.00
12.1 136 0 450.96 247 654 4.53 0.00
RescopeNegative
13.0 0 0 0.00 0 0 0.00 0.00
13.1 81 0 376.40 197 569 2.70 0.00
SystemScopeAuth
14.0 64 0 964.53 526 1476 2.13 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 469.17 214 892 1.20 0.00
15.3 35 0 387.91 272 509 1.17 0.00
15.4 1 0 117.00 117 117 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 402.87 306 622 1.27 0.00
16.3 38 0 400.58 253 559 1.27 0.00
16.4 1 0 69.00 69 69 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 395.58 281 503 1.27 0.00
17.3 38 0 409.84 267 623 1.27 0.00
17.4 1 0 75.00 75 75 0.03 0.00
OAuth2Discovery
18.0 1115 0 39.69 6 350 37.17 0.00
18.1 1116 0 40.26 5 346 37.20 0.00
ScimRealmRead
19.0 0 0 0.00 0 0 0.00 0.00
19.1 24 0 390.42 249 533 0.80 0.00
19.2 23 0 400.57 262 575 0.77 0.00
19.3 24 0 481.83 354 592 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 2944 0 9.71 1 857 98.13 0.00
20.4 2943 0 0.00 0 0 98.10 0.00
20.5 2943 0 0.00 0 0 98.10 0.00
20.6 1 0 0.00 0 0 0.03 0.00
Aggregated 13638 0 100.29 1 1953 454.60 0.00

Scenario Metrics

Transaction # Users # Times Run Average (ms) Min (ms) Max (ms) Scenarios/s Iterations
ReadHeavy 6 144 1247.01 933 1510 4.80 24.00
TokenLifecycle 3 58 1574.60 1323 1953 1.93 19.33
ValidateToken 2 126 480.29 295 691 4.20 63.00
UserCRUD 2 143 421.62 204 606 4.77 71.50
ProjectCRUD 1 75 401.28 212 561 2.50 75.00
RoleCRUD 1 76 397.80 206 552 2.53 76.00
RoleList 2 148 404.25 218 609 4.93 74.00
RoleAssignmentList 3 57 1593.93 1234 1862 1.90 19.00
UserRead 4 139 865.65 531 1150 4.63 34.75
ProjectRead 3 111 811.44 498 1062 3.70 37.00
PasswordAuth 4 67 1806.01 1125 2387 2.23 16.75
PasswordAuthNegative 1 41 730.24 472 1159 1.37 41.00
Rescope 2 134 453.66 286 654 4.47 67.00
RescopeNegative 1 80 377.45 197 569 2.67 80.00
SystemScopeAuth 2 62 972.66 569 1476 2.07 31.00
ApiKeyCRUD 1 35 864.89 590 1165 1.17 35.00
MappingCRUD 1 38 806.92 602 1091 1.27 38.00
OAuth2ClientCRUD 1 37 806.41 591 1068 1.23 37.00
OAuth2Discovery 3 1114 80.43 20 446 37.13 371.33
ScimRealmRead 1 24 1279.08 993 1577 0.80 24.00
ScimSync 1 2943 9.71 1 857 98.10 2943.00
Aggregated 45 5652 239.74 1 2387 188.40 4177.67

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) 98 401 Unauthorized: POST /v3/auth/tokens (password, invalid)
POST POST /v3/auth/tokens (rescope, invalid project) 208 401 Unauthorized: POST /v3/auth/tokens (rescope, invalid project)
GET GET /v3/auth/tokens (validate revoked) 214 404 Not Found: GET /v3/auth/tokens (validate revoked)
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 3324 429 Too Many Requests: GET /SCIM/v2/:domain_id/Users (sync reconcile list)

View full report

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

🐰 Bencher Report

Projectkeystone
Branchclaude/per-domain-assignments-provider-k0tp5e
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
134,840.00 ns
(-48.98%)Baseline: 264,301.97 ns
1,326,263.65 ns
(10.17%)
Command_Serde/apply/set📈 view plot
🚷 view threshold
143,670.00 ns
(-66.06%)Baseline: 423,276.80 ns
3,222,667.47 ns
(4.46%)
Command_Serde/pack/delete📈 view plot
🚷 view threshold
120.72 ns
(+2.03%)Baseline: 118.32 ns
155.47 ns
(77.65%)
Command_Serde/pack/delete_index📈 view plot
🚷 view threshold
109.36 ns
(+3.62%)Baseline: 105.54 ns
138.42 ns
(79.00%)
Command_Serde/pack/set📈 view plot
🚷 view threshold
203.30 ns
(+6.43%)Baseline: 191.01 ns
245.37 ns
(82.85%)
Command_Serde/pack/set_index📈 view plot
🚷 view threshold
108.37 ns
(+2.71%)Baseline: 105.51 ns
139.04 ns
(77.94%)
Command_Serde/unpack/delete📈 view plot
🚷 view threshold
199.39 ns
(+6.60%)Baseline: 187.05 ns
268.87 ns
(74.16%)
Command_Serde/unpack/delete_index📈 view plot
🚷 view threshold
160.43 ns
(+2.89%)Baseline: 155.92 ns
217.52 ns
(73.76%)
Command_Serde/unpack/set📈 view plot
🚷 view threshold
303.09 ns
(+15.50%)Baseline: 262.42 ns
356.17 ns
(85.10%)
Command_Serde/unpack/set_index📈 view plot
🚷 view threshold
162.56 ns
(+6.01%)Baseline: 153.34 ns
211.68 ns
(76.80%)
Payload_encryption/pack/remove_cmd📈 view plot
🚷 view threshold
123.82 ns
(+9.75%)Baseline: 112.82 ns
149.67 ns
(82.73%)
Payload_encryption/pack/set_cmd📈 view plot
🚷 view threshold
202.80 ns
(+2.36%)Baseline: 198.12 ns
260.30 ns
(77.91%)
Payload_encryption/unpack/remove_cmd📈 view plot
🚷 view threshold
203.43 ns
(+3.83%)Baseline: 195.93 ns
283.69 ns
(71.71%)
Payload_encryption/unpack/set_cmd📈 view plot
🚷 view threshold
300.77 ns
(+10.44%)Baseline: 272.34 ns
375.28 ns
(80.15%)
Raft_1Node_Latency/prefix/1node📈 view plot
🚷 view threshold
2,700,100.00 ns
(-10.57%)Baseline: 3,019,131.70 ns
7,853,027.86 ns
(34.38%)
Raft_1Node_Latency/read/1node📈 view plot
🚷 view threshold
44,087.00 ns
(+17.93%)Baseline: 37,383.44 ns
51,473.46 ns
(85.65%)
Raft_1Node_Latency/remove/1node📈 view plot
🚷 view threshold
390,900.00 ns
(-68.43%)Baseline: 1,238,104.69 ns
11,618,758.85 ns
(3.36%)
Raft_1Node_Latency/write/1node📈 view plot
🚷 view threshold
406,740.00 ns
(-59.70%)Baseline: 1,009,288.91 ns
7,604,647.77 ns
(5.35%)
build_snapshot/default📈 view plot
🚷 view threshold
111,940.00 ns
(-10.70%)Baseline: 125,357.83 ns
277,027.19 ns
(40.41%)
fernet token/project📈 view plot
🚷 view threshold
1,465.30 ns
(+2.77%)Baseline: 1,425.77 ns
1,795.20 ns
(81.62%)
get_data_keyspace📈 view plot
🚷 view threshold
0.31 ns
(-1.25%)Baseline: 0.32 ns
0.39 ns
(80.70%)
get_db📈 view plot
🚷 view threshold
0.31 ns
(-1.72%)Baseline: 0.32 ns
0.39 ns
(80.45%)
get_fernet_token_timestamp/project📈 view plot
🚷 view threshold
153.03 ns
(+9.15%)Baseline: 140.20 ns
179.47 ns
(85.27%)
get_keyspace📈 view plot
🚷 view threshold
4.41 ns
(-25.53%)Baseline: 5.92 ns
13.81 ns
(31.90%)
🐰 View full continuous benchmarking report in Bencher

Merged via the queue into main with commit 02a19b9 Sep 7, 2026
35 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