生成数据集
本文档描述如何使用数据集提供程序及其 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-only
、confidential
或 public
),以及客户端是否应为服务帐户客户端。
...&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
-
true
或false
,默认值为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-hierarchy
为true
时有效。 groups-count-each-level
-
每个创建的组将有多少个子组。此参数仅在
groups-with-hierarchy
为true
时有效。
使用默认值,仅创建顶级组。当 groups-with-hierarchy
设置为 true
时,将忽略 groups-per-realm
参数,并根据其他参数创建组树结构。groups-count-each-level
groups-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-0
、realm-1
、… realm-99
,它将在其中随机创建 1000 万个事件。
.../realms/master/dataset/create-events?count=10000000
创建多个脱机会话
这是在具有前缀 realm-
的可用领域中创建 1000 万个新脱机会话的请求。例如,如果我们有 100 个领域,如 realm-0
、realm-1
、… realm-99
,它将在其中随机创建 1000 万个事件。
.../realms/master/dataset/create-offline-sessions?count=10000000
删除多个领域
要删除所有具有默认领域前缀 realm
的领域
.../realms/master/dataset/remove-realms?remove-all=true
您可以使用 realm-prefix
更改默认领域前缀。您可以使用参数删除所有领域,例如,仅从 foorealm5
到 foorealm15
.../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-0
、client-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"}
检查特定对象的最后几个项目
要查看最后创建的领域索引
.../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