Skip to content

Commit

Permalink
Enhance benchmark dataset to include IDP mappers for the IDPs
Browse files Browse the repository at this point in the history
Closes keycloak/keycloak#31736

Signed-off-by: VR <vramik@redhat.com>
  • Loading branch information
vramik authored and pedroigor committed Aug 22, 2024
1 parent 4f76f6f commit 26d5e6e
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,10 @@ public class DatasetConfig {
@QueryParamIntFill(paramName = "identity-providers-count", operations = CREATE_ORGS)
private int identityProvidersCount;

// Count of identity provider mappers per identity provider
@QueryParamIntFill(paramName = "identity-provider-mappers-count", operations = CREATE_ORGS)
private int identityProviderMappersCount;

// String representation of this configuration (cached here to not be computed in runtime)
private String toString = "DatasetConfig []";

Expand Down Expand Up @@ -424,4 +428,8 @@ public int getUnManagedMembersCount() {
public int getIdentityProvidersCount() {
return identityProvidersCount;
}

public int getIdentityProviderMappersCount() {
return identityProviderMappersCount;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package org.keycloak.benchmark.dataset.organization;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

Expand All @@ -28,20 +29,23 @@
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.jboss.resteasy.reactive.NoCache;
import org.keycloak.OAuth2Constants;
import org.keycloak.benchmark.dataset.ExecutorHelper;
import org.keycloak.benchmark.dataset.TaskManager;
import org.keycloak.benchmark.dataset.config.ConfigUtil;
import org.keycloak.benchmark.dataset.config.DatasetConfig;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory;
import org.keycloak.models.ClientModel;
import org.keycloak.broker.provider.ConfigConstants;
import org.keycloak.broker.provider.HardcodedRoleMapper;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.IdentityProviderMapperSyncMode;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.OrganizationModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.organization.OrganizationProvider;
import org.keycloak.protocol.oidc.OIDCLoginProtocol;

public class OrganizationIdentityProviderProvisioner extends AbstractOrganizationProvisioner {

Expand Down Expand Up @@ -121,6 +125,19 @@ protected void addIdentityProviders(KeycloakSession session, String orgId, Count
idpConfig.put("clientSecret", "secret");
idpConfig.put("clientAuthMethod", "client_secret_post");
realm.addIdentityProvider(identityProvider);

for (int j = 0; j < config.getIdentityProviderMappersCount(); j++) {
IdentityProviderMapperModel mapper = new IdentityProviderMapperModel();
mapper.setIdentityProviderAlias(idpAlias);
mapper.setName(idpAlias + "-idp-mapper-" + j);
mapper.setIdentityProviderMapper(HardcodedRoleMapper.PROVIDER_ID);
mapper.setConfig(Map.of(
ConfigConstants.ROLE, OAuth2Constants.OFFLINE_ACCESS,
IdentityProviderMapperModel.SYNC_MODE, IdentityProviderMapperSyncMode.INHERIT.toString()
));
realm.addIdentityProviderMapper(mapper);
}

AtomicInteger lastIndex = (AtomicInteger) session.getAttribute("idpLastIndex");
lastIndex.incrementAndGet();
}
Expand Down
14 changes: 14 additions & 0 deletions doc/dataset/modules/ROOT/pages/using-provider.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,27 @@ As a result, 1k organizations with the following configuration:
* 500 unmanaged members
* 10 identity providers

It is also possible te specify a number of identity provider mappers per each identity provider:

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

In this case 1k organizations with each having 500 unmanaged members, 10 identity providers and each identity provider having 3 identity provider mnappers

You can also provision data to a specific organization. For instance, to provision
more identity providers to a specific organization:

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

Optionally it's possible to specify a number of identity provider mappers per each identity provider

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

Or to provision more unmanaged members to a specific organization:

----
Expand Down

0 comments on commit 26d5e6e

Please sign in to comment.