生成数据集
本文档描述了如何使用数据集提供程序及其 API 来生成用于负载测试的数据集。
永远不要在生产环境中安装此提供程序,因为其端点未受到保护。 |
先决条件
当使用 Quarkus 或 minikube 安装时,所有 URL 都以 /realms/master
开头。对于 Wildfly 发行版,URL 以 /auth/realms/master
开头。
使用数据集提供程序
脚本化用法
此脚本包含下一节中描述的关于 realm、用户和客户端操作的子集。
该脚本假定数据集提供程序已按照 在 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 个新 realm 的示例
./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
创建多个 realm
您需要调用此 HTTP REST 请求。此请求对于创建 10 个 realm 非常有用。每个 realm 将包含指定数量的角色、客户端、组和用户
.../realms/master/dataset/create-realms?count=10
创建多个客户端
这是在 realm realm-5
中创建 100 个新客户端的请求。每个客户端都将启用服务帐户,并且密钥类似于 «client_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
端点创建。每个用户的密码都类似于 «Username»-password。例如,user-156
的密码将类似于 user-156-password
.../realms/master/dataset/create-users?count=1000&realm-name=realm-5
创建多个组
组作为 realm 创建的一部分被创建。可以通过使用以下参数来管理创建的组的数量和结构
groups-per-realm
-
每个 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
参数在现有 realm 中创建组
.../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-
的可用 realm 中创建 1000 万个新事件的请求。例如,如果我们有 100 个 realm,如 realm-0
、realm-1
、… realm-99
,它将在其中随机创建 1000 万个事件
.../realms/master/dataset/create-events?count=10000000
创建多个离线会话
这是在具有前缀 realm-
的可用 realm 中创建 1000 万个新离线会话的请求。例如,如果我们有 100 个 realm,如 realm-0
、realm-1
、… realm-99
,它将在其中随机创建 1000 万个事件
.../realms/master/dataset/create-offline-sessions?count=10000000
移除多个 realm
移除具有默认 realm 前缀 realm
的所有 realm
.../realms/master/dataset/remove-realms?remove-all=true
您可以使用 realm-prefix
来更改默认 realm 前缀。您可以使用参数来移除所有 realm,例如仅从 foorealm5
到 foorealm15
.../realms/master/dataset/remove-realms?realm-prefix=foorealm&first-to-remove=5&last-to-remove=15
更改默认参数
要更改参数,请查看 DataSetConfig class 以查看可用参数和默认值,以及特定参数适用的端点。例如,要创建前缀为 foo
的 realm,并且仅使用 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"}
检查特定对象的最后条目
查看最后创建的 realm 索引
.../realms/master/dataset/last-realm
查看给定 realm 中最后创建的客户端
.../realms/master/dataset/last-client?realm-name=realm5
查看给定 realm 中最后创建的用户
.../realms/master/dataset/last-user?realm-name=realm5
配置组织
在配置组织之前,请确保手动创建或配置 realm。例如,按如下所示配置 realm-0
realm
.../realms/master/dataset/create-realms?count=1&users-per-realm=5000
结果,您将拥有一个 realm realm-0
,其中包含 5k 用户。
这是在具有前缀 org-
的 realm 中创建 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
结果,1k 个组织具有以下配置
-
500 个非托管成员
-
10 个身份提供程序
也可以指定每个身份提供程序的身份提供程序映射器的数量
.../realms/realm-0/dataset/orgs/create?count=1000&unmanaged-members-count=500&identity-providers-count=10&identity-provider-mappers-count=3
在这种情况下,1k 个组织,每个组织有 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
在配置成员时,请确保您已在 realm 中创建了足够的用户。对于托管成员,您还需要至少一个链接到组织的身份提供程序。
如果要移除组织
.../realms/realm-0/dataset/orgs/org-0/remove