diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java index 7ab180b..46b885b 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java @@ -25,6 +25,7 @@ import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.RolesRepresentation; import org.keycloak.representations.idm.UserRepresentation; + import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; @@ -114,10 +115,10 @@ public class TenantManagementService implements TenantProvider { updateMasterDisplayName(tenantUserManagementProperties.getApplicationName()); log.info("Tenants are: {}", - tenantRepository.findAll() - .stream() - .map(TenantEntity::getTenantId) - .toList()); + tenantRepository.findAll() + .stream() + .map(TenantEntity::getTenantId) + .toList()); log.info("Requested to create tenant for: {}", tenantRequest.getTenantId()); try { @@ -132,62 +133,65 @@ public class TenantManagementService implements TenantProvider { .displayName(tenantRequest.getDisplayName()) .guid(UUID.randomUUID().toString()) .databaseConnection(DatabaseConnectionEntity.builder() - .driver(tenantRequest.getDatabaseConnection().getDriver()) - .host(tenantRequest.getDatabaseConnection().getHost()) - .port(tenantRequest.getDatabaseConnection().getPort()) - .database(tenantRequest.getDatabaseConnection().getDatabase()) - .schema(tenantRequest.getDatabaseConnection().getSchema()) - .username(tenantRequest.getDatabaseConnection().getUsername()) - .password(encryptionService.encrypt(tenantRequest.getDatabaseConnection().getPassword())) - .build()) + .driver(tenantRequest.getDatabaseConnection().getDriver()) + .host(tenantRequest.getDatabaseConnection().getHost()) + .port(tenantRequest.getDatabaseConnection().getPort()) + .database(tenantRequest.getDatabaseConnection().getDatabase()) + .schema(tenantRequest.getDatabaseConnection().getSchema()) + .username(tenantRequest.getDatabaseConnection().getUsername()) + .password(encryptionService.encrypt(tenantRequest.getDatabaseConnection().getPassword())) + .build()) .searchConnection(SearchConnectionEntity.builder() - .hosts(tenantRequest.getSearchConnection().getHosts()) - .port(tenantRequest.getSearchConnection().getPort()) - .scheme(tenantRequest.getSearchConnection().getScheme()) - .username(tenantRequest.getSearchConnection().getUsername()) - .password(encryptionService.encrypt(tenantRequest.getSearchConnection().getPassword())) - .numberOfShards(tenantRequest.getSearchConnection().getNumberOfShards()) - .numberOfReplicas(tenantRequest.getSearchConnection().getNumberOfReplicas()) - .indexPrefix(buildIndexPrefix(tenantRequest.getTenantId())) - .build()) + .hosts(tenantRequest.getSearchConnection().getHosts()) + .port(tenantRequest.getSearchConnection().getPort()) + .scheme(tenantRequest.getSearchConnection().getScheme()) + .username(tenantRequest.getSearchConnection().getUsername()) + .password(encryptionService.encrypt(tenantRequest.getSearchConnection().getPassword())) + .numberOfShards(tenantRequest.getSearchConnection().getNumberOfShards()) + .numberOfReplicas(tenantRequest.getSearchConnection().getNumberOfReplicas()) + .indexPrefix(buildIndexPrefix(tenantRequest.getTenantId())) + .build()) .mongoDBConnection(MongoDBConnectionEntity.builder() - .host(tenantRequest.getMongoDBConnection().getHost()) - .port(tenantRequest.getMongoDBConnection().getPort()) - .username(tenantRequest.getMongoDBConnection().getUsername()) - .password(encryptionService.encrypt(tenantRequest.getMongoDBConnection().getPassword())) - .database(tenantRequest.getMongoDBConnection().getDatabase()) - .build()) + .host(tenantRequest.getMongoDBConnection().getHost()) + .port(tenantRequest.getMongoDBConnection().getPort()) + .username(tenantRequest.getMongoDBConnection().getUsername()) + .password(encryptionService.encrypt(tenantRequest.getMongoDBConnection().getPassword())) + .database(tenantRequest.getMongoDBConnection().getDatabase()) + .build()) .build(); if (tenantRequest.getAzureStorageConnection() != null) { testAzureConnection(tenantRequest.getAzureStorageConnection().getConnectionString(), tenantRequest.getAzureStorageConnection().getContainerName()); tenantEntity.setAzureStorageConnection(AzureStorageConnectionEntity.builder() - .connectionString(encryptionService.encrypt(tenantRequest.getAzureStorageConnection().getConnectionString())) - .containerName(tenantRequest.getAzureStorageConnection().getContainerName()) - .build()); + .connectionString(encryptionService.encrypt(tenantRequest.getAzureStorageConnection().getConnectionString())) + .containerName(tenantRequest.getAzureStorageConnection().getContainerName()) + .build()); } if (tenantRequest.getS3StorageConnection() != null) { testS3Connection(tenantRequest.getS3StorageConnection()); tenantEntity.setS3StorageConnection(S3StorageConnectionEntity.builder() - .key(tenantRequest.getS3StorageConnection().getKey()) - .secret(encryptionService.encrypt(tenantRequest.getS3StorageConnection().getSecret())) - .signerType(tenantRequest.getS3StorageConnection().getSignerType()) - .bucketName(tenantRequest.getS3StorageConnection().getBucketName()) - .region(tenantRequest.getS3StorageConnection().getRegion()) - .endpoint(tenantRequest.getS3StorageConnection().getEndpoint()) - .build()); + .key(tenantRequest.getS3StorageConnection().getKey()) + .secret(encryptionService.encrypt(tenantRequest.getS3StorageConnection().getSecret())) + .signerType(tenantRequest.getS3StorageConnection().getSignerType()) + .bucketName(tenantRequest.getS3StorageConnection().getBucketName()) + .region(tenantRequest.getS3StorageConnection().getRegion()) + .endpoint(tenantRequest.getS3StorageConnection().getEndpoint()) + .build()); } createSchema(tenantRequest); log.info("Created schema for tenant: {}", tenantRequest.getTenantId()); - createMongoDBDatabase(tenantRequest); - - log.info("Created mongodb database for tenant: {}", tenantRequest.getTenantId()); + if (tenantRequest.getMongoDBConnection() != null) { + createMongoDBDatabase(tenantRequest); + log.info("Created mongodb database for tenant: {}", tenantRequest.getTenantId()); + } else { + log.info("Skipping creation of mongo database for this tenant"); + } propagateTenantToKeyCloak(tenantRequest.getTenantId(), tenantRequest.getDefaultUsers()); @@ -251,11 +255,11 @@ public class TenantManagementService implements TenantProvider { var s3StorageConnectionTemplate = tenant.getS3StorageConnection(); com.iqser.red.storage.commons.model.S3StorageConnection s3StorageConnection; s3StorageConnection = new com.iqser.red.storage.commons.model.S3StorageConnection(s3StorageConnectionTemplate.getKey(), - encryptionService.decrypt(s3StorageConnectionTemplate.getSecret()), - s3StorageConnectionTemplate.getSignerType(), - s3StorageConnectionTemplate.getBucketName(), - s3StorageConnectionTemplate.getRegion(), - s3StorageConnectionTemplate.getEndpoint()); + encryptionService.decrypt(s3StorageConnectionTemplate.getSecret()), + s3StorageConnectionTemplate.getSignerType(), + s3StorageConnectionTemplate.getBucketName(), + s3StorageConnectionTemplate.getRegion(), + s3StorageConnectionTemplate.getEndpoint()); log.info("Deleting s3 bucket for tenant: {}", tenantId); try (var client = storageConfiguration.getS3StorageService().initAmazonS3(s3StorageConnection)) { String bucketName = s3StorageConnection.getBucketName(); @@ -335,8 +339,8 @@ public class TenantManagementService implements TenantProvider { var jdbcUrl = JDBCUtils.buildJdbcUrl(tenantRequest.getDatabaseConnection()); try (Connection connection = DriverManager.getConnection(jdbcUrl, - tenantRequest.getDatabaseConnection().getUsername(), - tenantRequest.getDatabaseConnection().getPassword())) { + tenantRequest.getDatabaseConnection().getUsername(), + tenantRequest.getDatabaseConnection().getPassword())) { DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); JdbcTemplate jdbcTemplate = new JdbcTemplate(tenantDataSource); String createStatement = "CREATE SCHEMA IF NOT EXISTS \"" + tenantRequest.getDatabaseConnection().getSchema() + "\""; @@ -356,8 +360,8 @@ public class TenantManagementService implements TenantProvider { log.info("Deleting schema for tenant: {}", tenant.getTenantId()); var jdbcUrl = JDBCUtils.buildJdbcUrl(tenant.getDatabaseConnection()); try (Connection connection = DriverManager.getConnection(jdbcUrl, - tenant.getDatabaseConnection().getUsername(), - this.encryptionService.decrypt(tenant.getDatabaseConnection().getPassword()))) { + tenant.getDatabaseConnection().getUsername(), + this.encryptionService.decrypt(tenant.getDatabaseConnection().getPassword()))) { DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); JdbcTemplate jdbcTemplate = new JdbcTemplate(tenantDataSource); String deleteStatement = "DROP SCHEMA IF EXISTS \"" + tenant.getDatabaseConnection().getSchema() + "\" CASCADE;"; @@ -373,10 +377,10 @@ public class TenantManagementService implements TenantProvider { MongoDBConnection mongoDBConnection = tenant.getMongoDBConnection(); try (MongoClient mongoClient = MongoClients.create(String.format("mongodb://%s:%s@%s:%s/", - mongoDBConnection.getUsername(), - mongoDBConnection.getPassword(), - mongoDBConnection.getHost(), - mongoDBConnection.getPort()))) { + mongoDBConnection.getUsername(), + mongoDBConnection.getPassword(), + mongoDBConnection.getHost(), + mongoDBConnection.getPort()))) { MongoDatabase database = mongoClient.getDatabase(mongoDBConnection.getDatabase()); BsonDocument createUserCommand = new BsonDocument(); createUserCommand.append("createUser", new BsonString(mongoDBConnection.getUsername())); @@ -403,10 +407,10 @@ public class TenantManagementService implements TenantProvider { MongoDBConnection mongoDBConnection = tenant.getMongoDBConnection(); try (MongoClient mongoClient = MongoClients.create(String.format("mongodb://%s:%s@%s:%s/", - mongoDBConnection.getUsername(), - mongoDBConnection.getPassword(), - mongoDBConnection.getHost(), - mongoDBConnection.getPort()))) { + mongoDBConnection.getUsername(), + mongoDBConnection.getPassword(), + mongoDBConnection.getHost(), + mongoDBConnection.getPort()))) { mongoClient.getDatabase(mongoDBConnection.getDatabase()).drop(); } } @@ -431,8 +435,8 @@ public class TenantManagementService implements TenantProvider { if (users != null) { realm.setUsers(users.stream() - .map(this::toUserRepresentation) - .toList()); + .map(this::toUserRepresentation) + .toList()); } keycloak.getAdminClient().realms().create(realm); @@ -661,29 +665,29 @@ public class TenantManagementService implements TenantProvider { var databaseConnection = tenantRequest.getDatabaseConnection(); if (databaseConnection != null) { tenantEntity.setDatabaseConnection(DatabaseConnectionEntity.builder() - .driver(databaseConnection.getDriver()) - .host(databaseConnection.getHost()) - .port(databaseConnection.getPort()) - .database(databaseConnection.getDatabase()) - .schema(databaseConnection.getSchema()) - .username(databaseConnection.getUsername()) - .password(encryptionService.encrypt(databaseConnection.getPassword())) - .params(databaseConnection.getParams()) - .build()); + .driver(databaseConnection.getDriver()) + .host(databaseConnection.getHost()) + .port(databaseConnection.getPort()) + .database(databaseConnection.getDatabase()) + .schema(databaseConnection.getSchema()) + .username(databaseConnection.getUsername()) + .password(encryptionService.encrypt(databaseConnection.getPassword())) + .params(databaseConnection.getParams()) + .build()); } var searchConnection = tenantRequest.getSearchConnection(); if (searchConnection != null) { tenantEntity.setSearchConnection(SearchConnectionEntity.builder() - .hosts(searchConnection.getHosts()) - .port(searchConnection.getPort()) - .scheme(searchConnection.getScheme()) - .username(searchConnection.getUsername()) - .password(encryptionService.encrypt(searchConnection.getPassword())) - .numberOfShards(searchConnection.getNumberOfShards()) - .numberOfReplicas(searchConnection.getNumberOfReplicas()) - .indexPrefix(tenantEntity.getSearchConnection().getIndexPrefix()) - .build()); + .hosts(searchConnection.getHosts()) + .port(searchConnection.getPort()) + .scheme(searchConnection.getScheme()) + .username(searchConnection.getUsername()) + .password(encryptionService.encrypt(searchConnection.getPassword())) + .numberOfShards(searchConnection.getNumberOfShards()) + .numberOfReplicas(searchConnection.getNumberOfReplicas()) + .indexPrefix(tenantEntity.getSearchConnection().getIndexPrefix()) + .build()); } var azureStorageConnection = tenantRequest.getAzureStorageConnection(); @@ -693,9 +697,9 @@ public class TenantManagementService implements TenantProvider { } testAzureConnection(azureStorageConnection.getConnectionString(), azureStorageConnection.getContainerName()); tenantEntity.setAzureStorageConnection(AzureStorageConnectionEntity.builder() - .connectionString(encryptionService.encrypt(azureStorageConnection.getConnectionString())) - .containerName(azureStorageConnection.getContainerName()) - .build()); + .connectionString(encryptionService.encrypt(azureStorageConnection.getConnectionString())) + .containerName(azureStorageConnection.getContainerName()) + .build()); } else { tenantEntity.setAzureStorageConnection(null); } @@ -707,13 +711,13 @@ public class TenantManagementService implements TenantProvider { } testS3Connection(s3StorageConnection); tenantEntity.setS3StorageConnection(S3StorageConnectionEntity.builder() - .key(s3StorageConnection.getKey()) - .secret(encryptionService.encrypt(s3StorageConnection.getSecret())) - .signerType(s3StorageConnection.getSignerType()) - .bucketName(s3StorageConnection.getBucketName()) - .region(s3StorageConnection.getRegion()) - .endpoint(s3StorageConnection.getEndpoint()) - .build()); + .key(s3StorageConnection.getKey()) + .secret(encryptionService.encrypt(s3StorageConnection.getSecret())) + .signerType(s3StorageConnection.getSignerType()) + .bucketName(s3StorageConnection.getBucketName()) + .region(s3StorageConnection.getRegion()) + .endpoint(s3StorageConnection.getEndpoint()) + .build()); } else { tenantEntity.setS3StorageConnection(null); } @@ -721,12 +725,12 @@ public class TenantManagementService implements TenantProvider { var mongoDBConnection = tenantRequest.getMongoDBConnection(); if (mongoDBConnection != null) { tenantEntity.setMongoDBConnection(MongoDBConnectionEntity.builder() - .host(mongoDBConnection.getHost()) - .port(mongoDBConnection.getPort()) - .username(mongoDBConnection.getUsername()) - .password(encryptionService.encrypt(mongoDBConnection.getPassword())) - .database(mongoDBConnection.getDatabase()) - .build()); + .host(mongoDBConnection.getHost()) + .port(mongoDBConnection.getPort()) + .username(mongoDBConnection.getUsername()) + .password(encryptionService.encrypt(mongoDBConnection.getPassword())) + .database(mongoDBConnection.getDatabase()) + .build()); } return convert(tenantRepository.save(tenantEntity)); @@ -785,50 +789,50 @@ public class TenantManagementService implements TenantProvider { .authDetails(authDetails) .details(entity.getDetails()) .databaseConnection(DatabaseConnection.builder() - .driver(entity.getDatabaseConnection().getDriver()) - .host(entity.getDatabaseConnection().getHost()) - .port(entity.getDatabaseConnection().getPort()) - .database(entity.getDatabaseConnection().getDatabase()) - .schema(entity.getDatabaseConnection().getSchema()) - .username(entity.getDatabaseConnection().getUsername()) - .params(entity.getDatabaseConnection().getParams()) - .password(entity.getDatabaseConnection().getPassword()) - .build()) + .driver(entity.getDatabaseConnection().getDriver()) + .host(entity.getDatabaseConnection().getHost()) + .port(entity.getDatabaseConnection().getPort()) + .database(entity.getDatabaseConnection().getDatabase()) + .schema(entity.getDatabaseConnection().getSchema()) + .username(entity.getDatabaseConnection().getUsername()) + .params(entity.getDatabaseConnection().getParams()) + .password(entity.getDatabaseConnection().getPassword()) + .build()) .searchConnection(SearchConnection.builder() - .hosts(entity.getSearchConnection().getHosts()) - .port(entity.getSearchConnection().getPort()) - .scheme(entity.getSearchConnection().getScheme()) - .username(entity.getSearchConnection().getUsername()) - .numberOfShards(entity.getSearchConnection().getNumberOfShards()) - .numberOfReplicas(entity.getSearchConnection().getNumberOfReplicas()) - .password(entity.getSearchConnection().getPassword()) - .indexPrefix(entity.getSearchConnection().getIndexPrefix()) - .build()) + .hosts(entity.getSearchConnection().getHosts()) + .port(entity.getSearchConnection().getPort()) + .scheme(entity.getSearchConnection().getScheme()) + .username(entity.getSearchConnection().getUsername()) + .numberOfShards(entity.getSearchConnection().getNumberOfShards()) + .numberOfReplicas(entity.getSearchConnection().getNumberOfReplicas()) + .password(entity.getSearchConnection().getPassword()) + .indexPrefix(entity.getSearchConnection().getIndexPrefix()) + .build()) .mongoDBConnection(MongoDBConnection.builder() - .host(entity.getMongoDBConnection().getHost()) - .port(entity.getMongoDBConnection().getPort()) - .username(entity.getMongoDBConnection().getUsername()) - .password(entity.getMongoDBConnection().getPassword()) - .database(entity.getMongoDBConnection().getDatabase()) - .build()) + .host(entity.getMongoDBConnection().getHost()) + .port(entity.getMongoDBConnection().getPort()) + .username(entity.getMongoDBConnection().getUsername()) + .password(entity.getMongoDBConnection().getPassword()) + .database(entity.getMongoDBConnection().getDatabase()) + .build()) .build(); if (entity.getAzureStorageConnection() != null) { tenantResponse.setAzureStorageConnection(AzureStorageConnection.builder() - .connectionString(entity.getAzureStorageConnection().getConnectionString()) - .containerName(entity.getAzureStorageConnection().getContainerName()) - .build()); + .connectionString(entity.getAzureStorageConnection().getConnectionString()) + .containerName(entity.getAzureStorageConnection().getContainerName()) + .build()); } if (entity.getS3StorageConnection() != null) { tenantResponse.setS3StorageConnection(S3StorageConnection.builder() - .key(entity.getS3StorageConnection().getKey()) - .secret(entity.getS3StorageConnection().getSecret()) - .signerType(entity.getS3StorageConnection().getSignerType()) - .bucketName(entity.getS3StorageConnection().getBucketName()) - .region(entity.getS3StorageConnection().getRegion()) - .endpoint(entity.getS3StorageConnection().getEndpoint()) - .build()); + .key(entity.getS3StorageConnection().getKey()) + .secret(entity.getS3StorageConnection().getSecret()) + .signerType(entity.getS3StorageConnection().getSignerType()) + .bucketName(entity.getS3StorageConnection().getBucketName()) + .region(entity.getS3StorageConnection().getRegion()) + .endpoint(entity.getS3StorageConnection().getEndpoint()) + .build()); } return tenantResponse; @@ -849,11 +853,11 @@ public class TenantManagementService implements TenantProvider { var connection = storageConfiguration.getS3StorageService() .testConnection(s3StorageConnection.getKey(), - s3StorageConnection.getSecret(), - s3StorageConnection.getSignerType(), - s3StorageConnection.getBucketName(), - s3StorageConnection.getRegion(), - s3StorageConnection.getEndpoint()); + s3StorageConnection.getSecret(), + s3StorageConnection.getSignerType(), + s3StorageConnection.getBucketName(), + s3StorageConnection.getRegion(), + s3StorageConnection.getEndpoint()); if (!connection) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not connect to S3 storage");