diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index 4c6ae1b0b..16db5c964 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -199,7 +199,7 @@ dependencyManagement { exclude 'jakarta.activation:jakarta.activation-api' } - dependency ('org.liquibase:liquibase-core:4.19.0') { + dependency ('org.liquibase:liquibase-core:4.21.1') { exclude 'javax.xml.bind:jaxb-api' } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java index ae5828e79..2a19c12aa 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java @@ -89,7 +89,7 @@ public class TenantDatabaseUpgradeService implements InitializingBean { } private void upgradeTenantStore() throws LiquibaseException { - log.warn("Upgrading tenant store DB at {}:{}", fineractProperties.getTenant().getHost(), fineractProperties.getTenant().getPort()); + log.info("Upgrading tenant store DB at {}:{}", fineractProperties.getTenant().getHost(), fineractProperties.getTenant().getPort()); logTenantStoreDetails(); if (databaseStateVerifier.isFirstLiquibaseMigration(tenantDataSource)) { ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_STORE_DB_CONTEXT, INITIAL_SWITCH_CONTEXT); @@ -98,7 +98,7 @@ public class TenantDatabaseUpgradeService implements InitializingBean { } SpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_STORE_DB_CONTEXT); liquibase.afterPropertiesSet(); - log.warn("Tenant store upgrade finished"); + log.info("Tenant store upgrade finished"); } private void logTenantStoreDetails() { @@ -110,36 +110,47 @@ public class TenantDatabaseUpgradeService implements InitializingBean { log.info("- fineract.tenant.identifier: {}", fineractProperties.getTenant().getIdentifier()); log.info("- fineract.tenant.name: {}", fineractProperties.getTenant().getName()); - log.info("- fineract.tenant.username: {}", fineractProperties.getTenant().getReadOnlyUsername()); - log.info("- fineract.tenant.password: {}", + log.info("- fineract.tenant.readonly.username: {}", fineractProperties.getTenant().getReadOnlyUsername()); + log.info("- fineract.tenant.readonly.password: {}", StringUtils.isNotBlank(fineractProperties.getTenant().getReadOnlyPassword()) ? "****" : ""); - log.info("- fineract.tenant.parameters: {}", fineractProperties.getTenant().getReadOnlyParameters()); - log.info("- fineract.tenant.name: {}", fineractProperties.getTenant().getReadOnlyName()); + log.info("- fineract.tenant.readonly.parameters: {}", fineractProperties.getTenant().getReadOnlyParameters()); + log.info("- fineract.tenant.readonly.name: {}", fineractProperties.getTenant().getReadOnlyName()); } private void upgradeIndividualTenants() throws LiquibaseException { - log.warn("Upgrading all tenants"); + log.info("Upgrading all tenants"); List tenants = tenantDetailsService.findAllTenants(); if (isNotEmpty(tenants)) { for (FineractPlatformTenant tenant : tenants) { upgradeIndividualTenant(tenant); } } - log.warn("Tenant upgrades have finished"); + log.info("Tenant upgrades have finished"); } + /** + * Upgrade each tenant's database + * + * Good to know: Each tenant's identifier is provided as a context variable to avoid caching of the liquibase + * migration (it was introduced as part of v4.21.0) + * + * @param tenant + * @throws LiquibaseException + */ private void upgradeIndividualTenant(FineractPlatformTenant tenant) throws LiquibaseException { log.info("Upgrade for tenant {} has started", tenant.getTenantIdentifier()); DataSource tenantDataSource = tenantDataSourceFactory.create(tenant); if (databaseStateVerifier.isFirstLiquibaseMigration(tenantDataSource)) { - ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, INITIAL_SWITCH_CONTEXT); + ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, INITIAL_SWITCH_CONTEXT, + tenant.getTenantIdentifier()); applyInitialLiquibase(tenantDataSource, liquibase, tenant.getTenantIdentifier(), (ds) -> !databaseStateVerifier.isTenantOnLatestUpgradableVersion(ds)); } - SpringLiquibase tenantLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT); + SpringLiquibase tenantLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, tenant.getTenantIdentifier()); tenantLiquibase.afterPropertiesSet(); - SpringLiquibase customChangelogLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, CUSTOM_CHANGELOG_CONTEXT); + SpringLiquibase customChangelogLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, CUSTOM_CHANGELOG_CONTEXT, + tenant.getTenantIdentifier()); customChangelogLiquibase.afterPropertiesSet(); log.info("Upgrade for tenant {} has finished", tenant.getTenantIdentifier()); } @@ -148,13 +159,13 @@ public class TenantDatabaseUpgradeService implements InitializingBean { Function isUpgradableFn) throws LiquibaseException { if (databaseStateVerifier.isFlywayPresent(dataSource)) { if (isUpgradableFn.apply(dataSource)) { - log.warn("Cannot proceed with upgrading database {}", id); - log.warn("It seems the database doesn't have the latest schema changes applied until the 1.6 release"); + log.error("Cannot proceed with upgrading database {}", id); + log.error("It seems the database doesn't have the latest schema changes applied until the 1.6 release"); throw new SchemaUpgradeNeededException("Make sure to upgrade to Fineract 1.6 first and then to a newer version"); } - log.warn("This is the first Liquibase migration for {}. We'll sync the changelog for you and then apply everything else", id); + log.info("This is the first Liquibase migration for {}. We'll sync the changelog for you and then apply everything else", id); liquibase.changeLogSync(); - log.warn("Liquibase changelog sync is complete"); + log.info("Liquibase changelog sync is complete"); } else { liquibase.afterPropertiesSet(); } diff --git a/fineract-provider/src/main/resources/logback-spring.xml b/fineract-provider/src/main/resources/logback-spring.xml index 9bfc590c0..2b2c2a301 100644 --- a/fineract-provider/src/main/resources/logback-spring.xml +++ b/fineract-provider/src/main/resources/logback-spring.xml @@ -36,7 +36,7 @@ - + diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java index 8608a964c..4e6a01333 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java @@ -34,7 +34,6 @@ import java.util.List; import javax.sql.DataSource; import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; -import org.apache.fineract.infrastructure.core.service.database.DatabasePasswordEncryptor; import org.apache.fineract.infrastructure.core.service.migration.ExtendedSpringLiquibase; import org.apache.fineract.infrastructure.core.service.migration.ExtendedSpringLiquibaseFactory; import org.apache.fineract.infrastructure.core.service.migration.SchemaUpgradeNeededException; @@ -68,8 +67,6 @@ public class LiquibaseStepDefinitions implements En { private DataSource defaultTenantDataSource; private Environment environment; - private DatabasePasswordEncryptor databasePasswordEncryptor; - public LiquibaseStepDefinitions() { Given("Liquibase is disabled with a default tenant", () -> { initializeLiquibase(false); @@ -161,6 +158,7 @@ public class LiquibaseStepDefinitions implements En { liquibaseFactory = mock(ExtendedSpringLiquibaseFactory.class); defaultTenant = mock(FineractPlatformTenant.class); + given(defaultTenant.getTenantIdentifier()).willReturn("defaultTenant"); allTenants = List.of(defaultTenant); @@ -182,9 +180,11 @@ public class LiquibaseStepDefinitions implements En { given(tenantDetailsService.findAllTenants()).willReturn(allTenants); given(tenantDataSourceFactory.create(defaultTenant)).willReturn(defaultTenantDataSource); - given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "initial_switch")).willReturn(initialTenantLiquibase); - given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db")).willReturn(tenantLiquibase); - given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "custom_changelog")).willReturn(customChangeLogLiquibase); + given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "initial_switch", "defaultTenant")) + .willReturn(initialTenantLiquibase); + given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "defaultTenant")).willReturn(tenantLiquibase); + given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "custom_changelog", "defaultTenant")) + .willReturn(customChangeLogLiquibase); tenantDatabaseUpgradeService = new TenantDatabaseUpgradeService(tenantDetailsService, tenantStoreDataSource, fineractProperties, databaseStateVerifier, liquibaseFactory, tenantDataSourceFactory, environment, Arrays.asList(tenantPasswordEncryptor)); diff --git a/renovate.json b/renovate.json index 600af3b1d..27ac89ebf 100644 --- a/renovate.json +++ b/renovate.json @@ -102,10 +102,6 @@ "matchPackageNames": ["com.diffplug.spotless"], "allowedVersions": "<=6.15.0" }, - { - "matchPackageNames": ["org.liquibase:liquibase-core"], - "allowedVersions": "<=4.19.0" - }, { "depTypeList": ["dependencies"], "updateTypes": ["patch", "minor"],