import java.util.Optional;
import org.picocontainer.Startable;
+import org.sonar.api.config.Configuration;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.log.Loggers;
+import org.sonar.process.ProcessProperties;
import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static org.sonar.server.app.ServerProcessLogging.STARTUP_LOGGER_NAME;
public class DatabaseServerCompatibility implements Startable {
private static final String HIGHLIGHTER = "################################################################################";
- private DatabaseVersion version;
- public DatabaseServerCompatibility(DatabaseVersion version) {
+ private final DatabaseVersion version;
+ private final Configuration configuration;
+
+ public DatabaseServerCompatibility(DatabaseVersion version, Configuration configuration) {
this.version = version;
+ this.configuration = configuration;
}
@Override
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.");
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
public ExpectedException thrown = ExpectedException.none();
@Rule
public LogTester logTester = new LogTester();
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+ private MapSettings settings = new MapSettings();
@Test
public void fail_if_requires_downgrade() {
DatabaseVersion version = mock(DatabaseVersion.class);
when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_DOWNGRADE);
- new DatabaseServerCompatibility(version).start();
+ new DatabaseServerCompatibility(version, settings.asConfig()).start();
}
@Test
DatabaseVersion version = mock(DatabaseVersion.class);
when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_UPGRADE);
when(version.getVersion()).thenReturn(Optional.of(12L));
- new DatabaseServerCompatibility(version).start();
+ new DatabaseServerCompatibility(version, settings.asConfig()).start();
}
@Test
DatabaseVersion version = mock(DatabaseVersion.class);
when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_UPGRADE);
when(version.getVersion()).thenReturn(Optional.of(DatabaseVersion.MIN_UPGRADE_VERSION));
- new DatabaseServerCompatibility(version).start();
+ new DatabaseServerCompatibility(version, settings.asConfig()).start();
assertThat(logTester.logs()).hasSize(2);
assertThat(logTester.logs(LoggerLevel.WARN)).contains(
public void do_nothing_if_up_to_date() {
DatabaseVersion version = mock(DatabaseVersion.class);
when(version.getStatus()).thenReturn(DatabaseVersion.Status.UP_TO_DATE);
- new DatabaseServerCompatibility(version).start();
+ new DatabaseServerCompatibility(version, settings.asConfig()).start();
// no error
}
+
+ @Test
+ public void fail_if_upgrade_required_on_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();
+ }
}