throw MessageException.of("Database was upgraded to a more recent of SonarQube. Backup must probably be restored or db settings are incorrect.");
}
if (status == DatabaseVersion.Status.REQUIRES_UPGRADE) {
- if (configuration.getBoolean(ProcessProperties.Property.BLUE_GREEN_ENABLED.getKey()).orElse(false)) {
- throw new IllegalStateException("Blue/green deployment is not supported. Database must be upgraded.");
- }
-
Optional<Long> currentVersion = this.version.getVersion();
if (currentVersion.isPresent() && currentVersion.get() < DatabaseVersion.MIN_UPGRADE_VERSION) {
throw MessageException.of("Current version is too old. Please upgrade to Long Term Support version firstly.");
}
- String msg = "Database must be upgraded. Please backup database and browse /setup";
- Loggers.get(DatabaseServerCompatibility.class).warn(msg);
- Loggers.get(STARTUP_LOGGER_NAME).warn('\n'
- + HIGHLIGHTER + '\n'
- + " " + msg
- + '\n' + HIGHLIGHTER);
+ boolean blueGreen = configuration.getBoolean(ProcessProperties.Property.BLUE_GREEN_ENABLED.getKey()).orElse(false);
+ if (!blueGreen) {
+ String msg = "Database must be upgraded. Please backup database and browse /setup";
+ Loggers.get(DatabaseServerCompatibility.class).warn(msg);
+ Loggers.get(STARTUP_LOGGER_NAME).warn('\n'
+ + HIGHLIGHTER + '\n'
+ + " " + msg
+ + '\n' + HIGHLIGHTER);
+ }
}
}
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.picocontainer.Startable;
+import org.sonar.api.config.Configuration;
import org.sonar.api.platform.ServerUpgradeStatus;
+import org.sonar.process.ProcessProperties;
import org.sonar.server.platform.db.migration.step.MigrationSteps;
import org.sonar.server.platform.db.migration.version.DatabaseVersion;
-/**
- * @since 2.5
- */
-public final class DefaultServerUpgradeStatus implements ServerUpgradeStatus, Startable {
+public class DefaultServerUpgradeStatus implements ServerUpgradeStatus, Startable {
private final DatabaseVersion dbVersion;
private final MigrationSteps migrationSteps;
+ private final Configuration configuration;
// available when connected to db
private long initialDbVersion;
- public DefaultServerUpgradeStatus(DatabaseVersion dbVersion, MigrationSteps migrationSteps) {
+ public DefaultServerUpgradeStatus(DatabaseVersion dbVersion, MigrationSteps migrationSteps, Configuration configuration) {
this.dbVersion = dbVersion;
this.migrationSteps = migrationSteps;
+ this.configuration = configuration;
}
@Override
return (int) initialDbVersion;
}
+ public boolean isBlueGreen() {
+ return configuration.getBoolean(ProcessProperties.Property.BLUE_GREEN_ENABLED.getKey()).orElse(false);
+ }
+
@Override
public String toString() {
return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
import java.sql.SQLException;
import org.apache.commons.dbutils.DbUtils;
import org.picocontainer.Startable;
-import org.sonar.api.platform.ServerUpgradeStatus;
import org.sonar.api.utils.log.Loggers;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DdlUtils;
import org.sonar.db.dialect.Dialect;
import org.sonar.db.dialect.H2;
+import org.sonar.server.platform.DefaultServerUpgradeStatus;
import org.sonar.server.platform.db.migration.engine.MigrationEngine;
import org.sonar.server.platform.db.migration.step.MigrationSteps;
* FIXME fix this class to remove use of DdlUtils.createSchema
*/
public class AutoDbMigration implements Startable {
- private final ServerUpgradeStatus serverUpgradeStatus;
+ private final DefaultServerUpgradeStatus serverUpgradeStatus;
private final DbClient dbClient;
private final MigrationEngine migrationEngine;
private final MigrationSteps migrationSteps;
- public AutoDbMigration(ServerUpgradeStatus serverUpgradeStatus, DbClient dbClient, MigrationEngine migrationEngine, MigrationSteps migrationSteps) {
+ public AutoDbMigration(DefaultServerUpgradeStatus serverUpgradeStatus, DbClient dbClient, MigrationEngine migrationEngine, MigrationSteps migrationSteps) {
this.serverUpgradeStatus = serverUpgradeStatus;
this.dbClient = dbClient;
this.migrationEngine = migrationEngine;
@Override
public void start() {
- if (!serverUpgradeStatus.isFreshInstall()) {
- return;
- }
-
- Loggers.get(getClass()).info("Automatically perform DB migration on fresh install");
- Dialect dialect = dbClient.getDatabase().getDialect();
- if (H2.ID.equals(dialect.getId())) {
- installH2();
- } else {
+ if (serverUpgradeStatus.isFreshInstall()) {
+ Loggers.get(getClass()).info("Automatically perform DB migration on fresh install");
+ Dialect dialect = dbClient.getDatabase().getDialect();
+ if (H2.ID.equals(dialect.getId())) {
+ installH2();
+ } else {
+ migrationEngine.execute();
+ }
+ } else if (serverUpgradeStatus.isUpgraded() && serverUpgradeStatus.isBlueGreen()) {
+ Loggers.get(getClass()).info("Automatically perform DB migration on blue/green deployment");
migrationEngine.execute();
}
}
}
@Test
- public void fail_if_upgrade_required_on_blue_green_deployment() {
+ public void upgrade_automatically_if_blue_green_deployment() {
settings.setProperty("sonar.blueGreenEnabled", "true");
DatabaseVersion version = mock(DatabaseVersion.class);
when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_UPGRADE);
when(version.getVersion()).thenReturn(Optional.of(DatabaseVersion.MIN_UPGRADE_VERSION));
- expectedException.expect(IllegalStateException.class);
- expectedException.expectMessage("Blue/green deployment is not supported. Database must be upgraded.");
-
new DatabaseServerCompatibility(version, settings.asConfig()).start();
+
+ assertThat(logTester.logs(LoggerLevel.WARN)).isEmpty();
}
}
import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
+import org.sonar.api.config.internal.ConfigurationBridge;
+import org.sonar.api.config.internal.MapSettings;
import org.sonar.server.platform.db.migration.step.MigrationSteps;
import org.sonar.server.platform.db.migration.version.DatabaseVersion;
private static final long LAST_VERSION = 150;
private MigrationSteps migrationSteps = mock(MigrationSteps.class);
private DatabaseVersion dbVersion = mock(DatabaseVersion.class);
- private DefaultServerUpgradeStatus underTest = new DefaultServerUpgradeStatus(dbVersion, migrationSteps);
+ private MapSettings settings = new MapSettings();
+ private DefaultServerUpgradeStatus underTest = new DefaultServerUpgradeStatus(dbVersion, migrationSteps, new ConfigurationBridge(settings));
@Before
public void setUp() throws Exception {
assertThat(underTest.isUpgraded()).isFalse();
assertThat(underTest.getInitialDbVersion()).isEqualTo((int) LAST_VERSION);
}
+
+ @Test
+ public void isBlueGreen() {
+ settings.clear();
+ assertThat(underTest.isBlueGreen()).isFalse();
+
+ settings.setProperty("sonar.blueGreenEnabled", true);
+ assertThat(underTest.isBlueGreen()).isTrue();
+
+ settings.setProperty("sonar.blueGreenEnabled", false);
+ assertThat(underTest.isBlueGreen()).isFalse();
+ }
}
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
-import org.sonar.api.platform.ServerUpgradeStatus;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.db.DbClient;
import org.sonar.db.dialect.MySql;
import org.sonar.db.dialect.Oracle;
import org.sonar.db.dialect.PostgreSql;
+import org.sonar.server.platform.DefaultServerUpgradeStatus;
import org.sonar.server.platform.db.migration.engine.MigrationEngine;
import org.sonar.server.platform.db.migration.step.MigrationSteps;
public LogTester logTester = new LogTester();
private DbClient dbClient = mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS);
- private ServerUpgradeStatus serverUpgradeStatus = mock(ServerUpgradeStatus.class);
+ private DefaultServerUpgradeStatus serverUpgradeStatus = mock(DefaultServerUpgradeStatus.class);
private MigrationEngine migrationEngine = mock(MigrationEngine.class);
private MigrationSteps migrationSteps = mock(MigrationSteps.class);
private AutoDbMigration underTest = new AutoDbMigration(serverUpgradeStatus, dbClient, migrationEngine, migrationSteps);
verify(noRealH2Creation).start();
verifyNoMoreInteractions(noRealH2Creation);
verifyZeroInteractions(migrationEngine);
- assertThat(logTester.logs()).isEmpty();
+ assertThat(logTester.logs(LoggerLevel.INFO)).isEmpty();
+ }
+
+ @Test
+ public void start_runs_MigrationEngine_if_blue_green_upgrade() {
+ mockFreshInstall(false);
+ when(serverUpgradeStatus.isUpgraded()).thenReturn(true);
+ when(serverUpgradeStatus.isBlueGreen()).thenReturn(true);
+
+ underTest.start();
+
+ verify(migrationEngine).execute();
+ assertThat(logTester.logs(LoggerLevel.INFO)).contains("Automatically perform DB migration on blue/green deployment");
+ }
+
+ @Test
+ public void start_does_nothing_if_blue_green_but_no_upgrade() {
+ mockFreshInstall(false);
+ when(serverUpgradeStatus.isUpgraded()).thenReturn(false);
+ when(serverUpgradeStatus.isBlueGreen()).thenReturn(true);
+
+ underTest.start();
+
+ verifyZeroInteractions(migrationEngine);
+ assertThat(logTester.logs(LoggerLevel.INFO)).isEmpty();
}
@Test