From cf756db5c8007d85800a0df807886bd0fa157d7b Mon Sep 17 00:00:00 2001 From: Pedro Igor Date: Mon, 7 Apr 2025 19:50:58 -0300 Subject: [PATCH] Add scenarios to list users and clients Closes #1131 Signed-off-by: Pedro Igor --- .../java/org/keycloak/benchmark/Config.java | 8 +++---- .../scenario/KeycloakScenarioBuilder.scala | 21 +++++++++++++++++++ .../keycloak/scenario/admin/ListClients.scala | 11 ++++++++++ .../keycloak/scenario/admin/ListUsers.scala | 11 ++++++++++ .../keycloak/scenario/admin/UserCrawl.scala | 2 +- 5 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 benchmark/src/main/scala/keycloak/scenario/admin/ListClients.scala create mode 100644 benchmark/src/main/scala/keycloak/scenario/admin/ListUsers.scala diff --git a/benchmark/src/main/java/org/keycloak/benchmark/Config.java b/benchmark/src/main/java/org/keycloak/benchmark/Config.java index 92c9b83b2..fe99a2eb4 100644 --- a/benchmark/src/main/java/org/keycloak/benchmark/Config.java +++ b/benchmark/src/main/java/org/keycloak/benchmark/Config.java @@ -171,14 +171,14 @@ public class Config { // user-crawl-scenario properties /** - * The amount of users to be requested for each page. This number is only used in the user crawl scenario. + * The amount of entries to be requested for each page. This number is only used in scenarios that support pagination. */ - public static final int userPageSize = Integer.getInteger("user-page-size", 20); + public static final int pagesSize = Integer.getInteger("pages-size", 20); /** - * The number of pages to iterate over. This number is only used in the user crawl scenario. + * The number of pages to iterate over. This number is only used in scenarios that support pagination. */ - public static final int userNumberOfPages = Integer.getInteger("user-number-of-pages", 10); + public static final int pagesTotal = Integer.getInteger("pages-total", 10); // join-group-scenario properties /** diff --git a/benchmark/src/main/scala/keycloak/scenario/KeycloakScenarioBuilder.scala b/benchmark/src/main/scala/keycloak/scenario/KeycloakScenarioBuilder.scala index 98e379c89..0f0998838 100644 --- a/benchmark/src/main/scala/keycloak/scenario/KeycloakScenarioBuilder.scala +++ b/benchmark/src/main/scala/keycloak/scenario/KeycloakScenarioBuilder.scala @@ -599,6 +599,27 @@ class KeycloakScenarioBuilder { this } + def viewPagesOfClients(pageSize: Int, numberOfPages: Int): KeycloakScenarioBuilder = { + chainBuilder = chainBuilder + .repeat(numberOfPages, "page") { + exec(session => { + session.set("max", pageSize) + .set("first", session("page").as[Int] * pageSize) + }) + .doIf(s => needTokenRefresh(s)) { + getServiceAccountTokenExec() + } + .exec(http("#{realm}/clients?first=#{first}&max=#{max}") + .get(ADMIN_ENDPOINT + "/clients") + .header("Authorization", "Bearer #{token}") + .queryParam("first", "#{first}") + .queryParam("max", "#{max}") + .check(status.is(200))) + .exitHereIfFailed + } + this + } + def createUser(): KeycloakScenarioBuilder = { chainBuilder = chainBuilder .feed(Iterator.continually(Map("username" -> randomUUID()))) diff --git a/benchmark/src/main/scala/keycloak/scenario/admin/ListClients.scala b/benchmark/src/main/scala/keycloak/scenario/admin/ListClients.scala new file mode 100644 index 000000000..4b01b453b --- /dev/null +++ b/benchmark/src/main/scala/keycloak/scenario/admin/ListClients.scala @@ -0,0 +1,11 @@ +package keycloak.scenario.admin + +import keycloak.scenario.{CommonSimulation, KeycloakScenarioBuilder} +import org.keycloak.benchmark.Config + +class ListClients extends CommonSimulation { + + setUp("List Clients", new KeycloakScenarioBuilder() + .serviceAccountToken() + .viewPagesOfClients(Config.pagesSize, Config.pagesTotal)) +} diff --git a/benchmark/src/main/scala/keycloak/scenario/admin/ListUsers.scala b/benchmark/src/main/scala/keycloak/scenario/admin/ListUsers.scala new file mode 100644 index 000000000..14f22b470 --- /dev/null +++ b/benchmark/src/main/scala/keycloak/scenario/admin/ListUsers.scala @@ -0,0 +1,11 @@ +package keycloak.scenario.admin + +import keycloak.scenario.{CommonSimulation, KeycloakScenarioBuilder} +import org.keycloak.benchmark.Config + +class ListUsers extends CommonSimulation { + + setUp("List Users", new KeycloakScenarioBuilder() + .serviceAccountToken() + .viewPagesOfUsers(Config.pagesSize, Config.pagesTotal)) +} diff --git a/benchmark/src/main/scala/keycloak/scenario/admin/UserCrawl.scala b/benchmark/src/main/scala/keycloak/scenario/admin/UserCrawl.scala index 2f6491857..4d82f5286 100644 --- a/benchmark/src/main/scala/keycloak/scenario/admin/UserCrawl.scala +++ b/benchmark/src/main/scala/keycloak/scenario/admin/UserCrawl.scala @@ -8,7 +8,7 @@ class UserCrawl extends CommonSimulation { val userCrawlScenarioBuilder = new KeycloakScenarioBuilder() .serviceAccountToken() - .viewPagesOfUsers(Config.userPageSize, Config.userNumberOfPages) + .viewPagesOfUsers(Config.pagesSize, Config.pagesTotal) val userCrawlScenario = scenario("User Crawl").exec(userCrawlScenarioBuilder.chainBuilder)