生成数据集

本文档描述如何使用数据集提供程序及其 API 生成用于负载测试的数据集。

切勿在生产环境中安装此提供程序,因为其端点未进行安全保护。

先决条件

使用 Quarkus 或 minikube 安装时,所有 URL 均以 /realms/master 开头。对于 Wildfly 发行版,URL 以 /auth/realms/master 开头。

使用数据集提供程序

脚本使用

此脚本包含下一节中关于领域、用户和客户端的描述中的一部分操作。

此脚本假设数据集提供程序已按照 在 Minikube 上安装 设置进行安装,并且它在以下位置可用:
https://keycloak-keycloak.$(minikube ip).nip.io/realms/master/dataset/.

运行以下命令以接收帮助描述

./dataset-import.sh -a help

您将看到以下选项

Dataset import to the local minikube Keycloak application - usage:
1) create realm/s with clients, users and password hash algorithm & iterations - run -a (action) with or without other arguments: -a create-realms -r 10 -g argon2 -i 5 -c 100 -u 100 -l 'https://keycloak.url.com'
2) create clients in specific realm: -a create-clients -c 100 -n realm-0 -l 'https://keycloak.url.com'
3) create users in specific realm: -a create-users -u 100 -n realm-0 -l 'https://keycloak.url.com'
4) create events in specific realm: -a create-events -e 100 -n realm-0 -l 'https://keycloak.url.com'
5) create offline sessions in specific realm: -a create-offline-sessions -o 100 -n realm-0 -l 'https://keycloak.url.com'
6) delete specific realm/s with prefix -a delete-realms -p realm -l 'https://keycloak.url.com'
7) dataset provider status -a status 'https://keycloak.url.com'
8) dataset provider status check of last completed job -a status-completed -t 10 -l 'https://keycloak.url.com'
9) dataset provider clear status of last completed job -a clear-status-completed -l 'https://keycloak.url.com'
10) dataset import script usage -a help

创建 10 个新领域的示例

./dataset-import.sh -a create-realms -r 10

或者,用户也可以从 provision/minikube 模块中运行 Taskfile 来执行 dataset-import 任务,以便无缝执行 Kubernetes 样式部署的自动化。

dataset-import 任务重复使用上面定义的命令行参数,以便用户方便使用。请注意,两个连字符 (--) 将任务名称与传递给脚本的命令行选项分开。

task dataset-import -- -a create-realms -r 10

要详细了解该工具,请参阅 使用工具task进行自动化 以获取详细信息。

数据集提供程序 API

创建多个领域

您需要调用此 HTTP REST 请求。此请求对于创建 10 个领域很有用。每个领域将包含指定数量的角色、客户端、组和用户。

.../realms/master/dataset/create-realms?count=10

创建多个客户端

这是在领域 realm-5 中创建 100 个新客户端的请求。每个客户端都将启用服务帐户,并且具有类似“客户端 ID”-secret 的密钥(例如,对于客户端 client-156,密钥为 client-156-secret)。

.../realms/master/dataset/create-clients?count=200&realm-name=realm-5

您还可以使用这两个参数配置访问类型 (bearer-onlyconfidentialpublic),以及客户端是否应为服务帐户客户端。

...&client-access-type=bearer-only&service-account-client=false

创建多个用户

这是在 realm-5 中创建 500 个新用户的请求。每个用户将具有指定数量的角色、客户端角色和组,这些角色和组已由 create-realms 端点创建。每个用户将拥有类似“用户名”-password 的密码。例如,user-156 将拥有类似 user-156-password 的密码。

.../realms/master/dataset/create-users?count=1000&realm-name=realm-5

创建多个组

组是在领域创建过程中创建的。可以使用以下参数管理创建的组的数量和结构

groups-per-realm

每个领域的组总数。默认值为 20

groups-with-hierarchy

truefalse,默认值为 false。使用默认值,仅创建顶级组。当 groups-with-hierarchy 设置为 true 时,将创建组的树结构;树的深度由参数 groups-hierarchy-depth 定义,而 groups-count-each-level 定义每个创建的组将有多少个子组。

groups-hierarchy-depth

组树结构的深度。默认值为 3。使用默认值,顶级组将有 groups-count-each-level 个子组,每个子组本身将有 groups-count-each-level 个子组。此参数仅在 groups-with-hierarchytrue 时有效。

groups-count-each-level

每个创建的组将有多少个子组。此参数仅在 groups-with-hierarchytrue 时有效。

使用默认值,仅创建顶级组。当 groups-with-hierarchy 设置为 true 时,将忽略 groups-per-realm 参数,并根据其他参数创建组树结构。groups-count-each-levelgroups-hierarchy-depth 将是创建的组总数。分层组实现会遵守 groups-per-transaction。采用的子组命名约定在组名称中使用点 (.),这允许即使在先前的交易中创建父组也可以找到它。

示例参数
.../realms/master/dataset/create-realms?count=1&groups-with-hierarchy=true&groups-hierarchy-depth=3&groups-count-each-level=50

您还可以通过调用 create-groups 端点并设置 realm-name 参数,在现有领域中创建组。

示例参数
.../realms/master/dataset/create-groups?realm-name=realm-0&count=10&groups-with-hierarchy=true&groups-hierarchy-depth=3&groups-count-each-level=5

创建多个事件

这是在具有前缀 realm- 的可用领域中创建 1000 万个新事件的请求。例如,如果我们有 100 个领域,如 realm-0realm-1、… realm-99,它将在其中随机创建 1000 万个事件。

.../realms/master/dataset/create-events?count=10000000

创建多个脱机会话

这是在具有前缀 realm- 的可用领域中创建 1000 万个新脱机会话的请求。例如,如果我们有 100 个领域,如 realm-0realm-1、… realm-99,它将在其中随机创建 1000 万个事件。

.../realms/master/dataset/create-offline-sessions?count=10000000

删除多个领域

要删除所有具有默认领域前缀 realm 的领域

.../realms/master/dataset/remove-realms?remove-all=true

您可以使用 realm-prefix 更改默认领域前缀。您可以使用参数删除所有领域,例如,仅从 foorealm5foorealm15

.../realms/master/dataset/remove-realms?realm-prefix=foorealm&first-to-remove=5&last-to-remove=15

更改默认参数

要更改参数,请查看 DataSetConfig 类 以查看可用参数和默认值,以及特定参数适用的端点。例如,要创建具有前缀 foo 并且仅使用 1000 次哈希迭代(使用默认哈希算法)用于密码策略的领域,您可以使用这些参数

.../realms/master/dataset/create-realms?count=10&realm-prefix=foo&password-hash-iterations=1000

另一个示例是,使用以下参数指定特定哈希算法与哈希迭代的组合

.../realms/master/dataset/create-realms?count=10&realm-prefix=foo&password-hash-algorithm=argon2&password-hash-iterations=1000

当 HTTP 端点被触发时,配置将写入服务器日志,因此您可以监视进度以及实际应用了哪些参数。

请注意,新对象的创建将自动从下一个可用索引开始。例如,当您触发上面的端点以创建多个客户端时,如果您的数据库中已经存在 230 个客户端 (client-0client-1、.. client-229),那么您的 HTTP 请求将从 client-230 开始创建客户端。

检查任务是否仍在运行

使用 GET 方法调用以下 URL

.../realms/master/dataset/status

如果仍然有任务在运行,它将返回以下信息

{"status":"Task in progress","task-id":{"startTimeMs":"1662115169043","message":"Creation of 1 realms from realm-6 to realm-6"}}

如果没有任何任务在运行,它将返回以下信息

{"status":"No task in progress. New task can be started"}

检查上次完成的任务的结果

使用 GET 方法调用以下 URL

.../realms/master/dataset/status-completed

如果仍然有任务在运行,它将返回以下信息

{"status":"previous task completed","task":{"success":"true","startTimeMs":"1662115169043","message":"Creation of 1 realms from realm-1 to realm-1","endTimeMs":"1662115173323"}}

如果没有任何已完成的任务,它将返回此信息,并带有状态代码 404

{"status":"No completed task"}

清除上次完成的任务的结果

使用 DELETE 方法调用以下 URL

.../realms/master/dataset/status-completed

检查特定对象的最后几个项目

要查看最后创建的领域索引

.../realms/master/dataset/last-realm

要查看在给定领域中最后创建的客户端

.../realms/master/dataset/last-client?realm-name=realm5

要查看在给定领域中最后创建的用户

.../realms/master/dataset/last-user?realm-name=realm5

预配组织

在预配组织之前,请确保手动创建或预配一个领域。例如,按如下所示预配 realm-0 领域

.../realms/master/dataset/create-realms?count=1&users-per-realm=5000

结果,您将拥有一个 realm-0 领域,其中包含 5000 个用户。

这是在具有前缀 org- 的领域中创建 1000 个组织的请求

.../realms/realm-0/dataset/orgs/create?count=1000

或者,您可以创建一个具有给定名称的单个组织

realms/realm-0/dataset/orgs/create?name=myorg.com&domains=myorg.com,myorg.org,myorg.net&count=1

您还可以指定每个创建的组织应该链接多少个成员(托管和非托管),以及应该链接多少个身份提供程序

.../realms/realm-0/dataset/orgs/create?count=1000&unmanaged-members-count=500&identity-providers-count=10

结果,1000 个组织具有以下配置

  • 500 个非托管成员

  • 10 个身份提供程序

还可以指定每个身份提供程序的身份提供程序映射器数量

.../realms/realm-0/dataset/orgs/create?count=1000&unmanaged-members-count=500&identity-providers-count=10&identity-provider-mappers-count=3

在这种情况下,1000 个组织,每个组织都拥有 500 个非托管成员、10 个身份提供程序,每个身份提供程序都拥有 3 个身份提供程序映射器

您还可以将数据预配到特定组织。例如,要向特定组织预配更多身份提供程序

.../realms/realm-0/dataset/orgs/org-0/identity-providers/create?count=1000

可以选择指定每个身份提供程序的身份提供程序映射器数量

.../realms/realm-0/dataset/orgs/org-0/identity-providers/create?count=1000&identity-provider-mappers-count=5

或者,要向特定组织预配更多非托管成员

.../realms/realm-0/dataset/orgs/org-0/members/create-unmanaged?count=100

或者,要向特定组织预配更多托管成员

.../realms/realm-0/dataset/orgs/org-0/members/create-managed?count=100

预配成员时,请确保您在领域中创建了足够的用户。对于托管成员,您还需要至少将一个身份提供程序链接到组织。

如果您要删除组织

.../realms/realm-0/dataset/orgs/org-0/remove

进一步阅读