From: Simon Brandhof Date: Thu, 3 May 2018 11:49:05 +0000 (+0200) Subject: SONAR-10594 fail to upgrade database on blue/green deployments X-Git-Tag: 7.5~1217 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=483082c47541719756c038894629ce750ddc2f93;p=sonarqube.git SONAR-10594 fail to upgrade database on blue/green deployments --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java b/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java index 1d2dd6d7a77..dbb705fb6bb 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java @@ -21,8 +21,10 @@ package org.sonar.server.platform; 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; @@ -30,10 +32,13 @@ 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 @@ -43,6 +48,10 @@ public class DatabaseServerCompatibility implements Startable { 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 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."); diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java index a28a51ac3fe..95a21163d63 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java @@ -23,6 +23,7 @@ import java.util.Optional; 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; @@ -38,6 +39,9 @@ public class DatabaseServerCompatibilityTest { 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() { @@ -46,7 +50,7 @@ public class DatabaseServerCompatibilityTest { DatabaseVersion version = mock(DatabaseVersion.class); when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_DOWNGRADE); - new DatabaseServerCompatibility(version).start(); + new DatabaseServerCompatibility(version, settings.asConfig()).start(); } @Test @@ -57,7 +61,7 @@ public class DatabaseServerCompatibilityTest { 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 @@ -65,7 +69,7 @@ public class DatabaseServerCompatibilityTest { 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( @@ -79,7 +83,20 @@ public class DatabaseServerCompatibilityTest { 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(); + } }