]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10594 fail to upgrade database on blue/green deployments
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 3 May 2018 11:49:05 +0000 (13:49 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 10 May 2018 18:20:55 +0000 (20:20 +0200)
server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java
server/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java

index 1d2dd6d7a7774741136c424c46e1f74d2d7b336e..dbb705fb6bba40ce328b661067c10692dfe31758 100644 (file)
@@ -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<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.");
index a28a51ac3fefff95a844226f0a46861eef255f78..95a21163d633bf1c9508c28e64ab787610d8301a 100644 (file)
@@ -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();
+  }
 }