in src/main/java/org/apache/fineract/cn/dev/ServiceRunner.java [418:505]
private String provisionAppsViaSeshatForTenant(final Tenant tenant) throws InterruptedException, IOException {
try (final AutoTenantContext ignored = new AutoTenantContext(tenant.getIdentifier())) {
final AssignedApplication isisAssigned = new AssignedApplication();
isisAssigned.setName(identityManager.name());
final IdentityManagerInitialization tenantAdminPassword = provisionerService.api().assignIdentityManager(tenant.getIdentifier(), isisAssigned);
provisionApp(tenant, rhythmManager, org.apache.fineract.cn.rhythm.api.v1.events.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.organizationManager, org.apache.fineract.cn.office.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.customerManager, CustomerEventConstants.INITIALIZE);
final UserWithPassword orgAdminUserPassword = createOrgAdminRoleAndUser(tenantAdminPassword.getAdminPassword());
//Creation of the schedulerUserRole, and permitting it to create application permission requests are needed in the
//provisioning of portfolio. Portfolio asks rhythm for a callback. Rhythm asks identity for permission to send
//that call back. Rhythm needs permission to ask identity directly rather than through the provisioner because
//the request is made outside of rhythm's initialization.
if (!liteModeEnabled) {
final UserWithPassword schedulerUser = createSchedulerUserRoleAndPassword(tenantAdminPassword.getAdminPassword());
Assert.assertTrue(this.eventRecorder.wait(EventConstants.OPERATION_POST_APPLICATION_PERMISSION, new ApplicationPermissionEvent(rhythmManager.name(), org.apache.fineract.cn.identity.api.v1.PermittableGroupIds.APPLICATION_SELF_MANAGEMENT)));
final Authentication schedulerUserAuthentication;
try (final AutoGuest ignored2 = new AutoGuest()) {
enableUser(schedulerUser);
schedulerUserAuthentication = identityManager.api().login(schedulerUser.getIdentifier(), schedulerUser.getPassword());
}
try (final AutoUserContext ignored2 = new AutoUserContext(schedulerUser.getIdentifier(), schedulerUserAuthentication.getAccessToken())) {
identityManager.api().setApplicationPermissionEnabledForUser(
rhythmManager.name(),
org.apache.fineract.cn.identity.api.v1.PermittableGroupIds.APPLICATION_SELF_MANAGEMENT,
schedulerUser.getIdentifier(),
true);
Assert.assertTrue(this.eventRecorder.wait(EventConstants.OPERATION_PUT_APPLICATION_PERMISSION_USER_ENABLED, new ApplicationPermissionUserEvent(rhythmManager.name(), org.apache.fineract.cn.identity.api.v1.PermittableGroupIds.APPLICATION_SELF_MANAGEMENT, schedulerUser.getIdentifier())));
}
provisionApp(tenant, ledgerManager, org.apache.fineract.cn.accounting.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, portfolioManager, org.apache.fineract.cn.portfolio.api.v1.events.EventConstants.INITIALIZE);
Assert.assertTrue(this.eventRecorder.wait(EventConstants.OPERATION_POST_PERMITTABLE_GROUP,
org.apache.fineract.cn.rhythm.spi.v1.PermittableGroupIds.forApplication(portfolioManager.name())));
for (int i = 0; i < 24; i++) {
Assert.assertTrue("Beat #" + i,
eventRecorder.wait(org.apache.fineract.cn.rhythm.api.v1.events.EventConstants.POST_BEAT,
new BeatEvent(portfolioManager.name(), "alignment" + i)));
}
final Authentication schedulerAuthentication;
try (final AutoGuest ignored2 = new AutoGuest()) {
schedulerAuthentication = identityManager.api().login(schedulerUser.getIdentifier(), schedulerUser.getPassword());
}
try (final AutoUserContext ignored2 = new AutoUserContext(schedulerUser.getIdentifier(), schedulerAuthentication.getAccessToken())) {
//Allow rhythm to send a beat to portfolio as the scheduler user.
identityManager.api().setApplicationPermissionEnabledForUser(
rhythmManager.name(),
org.apache.fineract.cn.rhythm.spi.v1.PermittableGroupIds.forApplication(portfolioManager.name()),
schedulerUser.getIdentifier(),
true);
Assert.assertTrue(this.eventRecorder.wait(EventConstants.OPERATION_PUT_APPLICATION_PERMISSION_USER_ENABLED,
new ApplicationPermissionUserEvent(rhythmManager.name(),
org.apache.fineract.cn.rhythm.spi.v1.PermittableGroupIds.forApplication(portfolioManager.name()), schedulerUser.getIdentifier())));
}
provisionApp(tenant, depositAccountManager, org.apache.fineract.cn.deposit.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.tellerManager, org.apache.fineract.cn.teller.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.reportManager, org.apache.fineract.cn.reporting.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.chequeManager, org.apache.fineract.cn.cheque.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.payrollManager, org.apache.fineract.cn.payroll.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.groupManager, org.apache.fineract.cn.group.api.v1.EventConstants.INITIALIZE);
provisionApp(tenant, ServiceRunner.notificationManager, org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants.INITIALIZE);
createChartOfAccounts(orgAdminUserPassword);
}
return tenantAdminPassword.getAdminPassword();
}
}