]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10420 Fail at startup when cluster enabled on MySQL
authorEric Hartmann <hartmann.eric@gmail.com>
Thu, 15 Feb 2018 10:32:15 +0000 (11:32 +0100)
committerEric Hartmann <hartmann.eric@gmail.Com>
Thu, 15 Feb 2018 16:30:30 +0000 (17:30 +0100)
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java
server/sonar-server/src/main/java/org/sonar/server/startup/ClusterConfigurationCheck.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/platform/platformlevel/PlatformLevel2Test.java
server/sonar-server/src/test/java/org/sonar/server/startup/ClusterConfigurationCheckTest.java [new file with mode: 0644]

index 9dd8490ee1434140f3e8e1788f27b517c7972df7..f54d401197a4e09cb37c1703ed53290cd80c08ec 100644 (file)
@@ -40,6 +40,7 @@ import org.sonar.server.plugins.PluginCompression;
 import org.sonar.server.plugins.ServerPluginJarExploder;
 import org.sonar.server.plugins.ServerPluginRepository;
 import org.sonar.server.plugins.WebServerExtensionInstaller;
+import org.sonar.server.startup.ClusterConfigurationCheck;
 
 public class PlatformLevel2 extends PlatformLevel {
   public PlatformLevel2(PlatformLevel parent) {
@@ -77,6 +78,10 @@ public class PlatformLevel2 extends PlatformLevel {
       DatabaseMigrationStateImpl.class,
       DatabaseMigrationExecutorServiceImpl.class);
 
+    addIfCluster(
+      ClusterConfigurationCheck.class
+    );
+
     addIfStartupLeader(
       DatabaseCharsetChecker.class,
       CheckDatabaseCharsetAtStartup.class);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/ClusterConfigurationCheck.java b/server/sonar-server/src/main/java/org/sonar/server/startup/ClusterConfigurationCheck.java
new file mode 100644 (file)
index 0000000..94ba60f
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package org.sonar.server.startup;
+
+import org.picocontainer.Startable;
+import org.sonar.db.Database;
+import org.sonar.db.dialect.MySql;
+
+/**
+ * This class will be check the configuration for a SonarQube cluster
+ *
+ * See SONAR-10420
+ */
+public class ClusterConfigurationCheck implements Startable {
+
+  private final Database database;
+
+  public ClusterConfigurationCheck(Database database) {
+    this.database = database;
+  }
+
+  @Override
+  public void start() {
+    if (MySql.ID.equals(database.getDialect().getId())) {
+      throw new IllegalStateException("MySQL is not supported for Data Center Edition. Please connect to a supported database: Oracle, PostgreSQL, Microsoft SQL Server.");
+    }
+  }
+
+  public void stop() {
+    // Nothing to do
+  }
+}
index c5f370439118915f07edde6a388a894d268c7d48..8cdfabab944704173343d5713a18ed7e20028cd7 100644 (file)
@@ -29,6 +29,7 @@ import org.sonar.core.platform.PluginRepository;
 import org.sonar.server.platform.Platform;
 import org.sonar.server.platform.WebServer;
 import org.sonar.server.platform.db.migration.charset.DatabaseCharsetChecker;
+import org.sonar.server.startup.ClusterConfigurationCheck;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -87,4 +88,29 @@ public class PlatformLevel2Test {
     // level2 component that is injected only on "startup leaders"
     assertThat(underTest.getOptional(DatabaseCharsetChecker.class)).isNotPresent();
   }
+
+  @Test
+  public void add_ClusterConfigurationCheck_when_cluster_mode_activated() {
+    props.setProperty("sonar.cluster.enabled", "true");
+    PlatformLevel1 level1 = new PlatformLevel1(mock(Platform.class), props);
+    level1.configure();
+
+    PlatformLevel2 underTest = new PlatformLevel2(level1);
+    underTest.configure();
+
+    assertThat(underTest.getOptional(ClusterConfigurationCheck.class)).isPresent();
+  }
+
+  @Test
+  public void do_NOT_add_ClusterConfigurationCheck_when_cluster_mode_NOT_activated() {
+    props.setProperty("sonar.cluster.enabled", "false");
+    PlatformLevel1 level1 = new PlatformLevel1(mock(Platform.class), props);
+    level1.configure();
+
+    PlatformLevel2 underTest = new PlatformLevel2(level1);
+    underTest.configure();
+
+    assertThat(underTest.getOptional(ClusterConfigurationCheck.class)).isNotPresent();
+
+  }
 }
diff --git a/server/sonar-server/src/test/java/org/sonar/server/startup/ClusterConfigurationCheckTest.java b/server/sonar-server/src/test/java/org/sonar/server/startup/ClusterConfigurationCheckTest.java
new file mode 100644 (file)
index 0000000..b8e77c2
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.startup;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.db.Database;
+import org.sonar.db.dialect.MsSql;
+import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.Oracle;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class ClusterConfigurationCheckTest {
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  private Database database = mock(Database.class);
+  private ClusterConfigurationCheck underTest = new ClusterConfigurationCheck(database);
+
+  @Test
+  public void when_SQ_is_connected_to_MySql_an_ISE_should_be_thrown() {
+    when(database.getDialect()).thenReturn(new MySql());
+
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage("MySQL is not supported for Data Center Edition. Please connect to a supported database: Oracle, PostgreSQL, Microsoft SQL Server.");
+
+    underTest.start();
+  }
+
+  @Test
+  public void when_SQ_is_connected_to_MsSql_an_ISE_should_NOT_be_thrown() {
+    when(database.getDialect()).thenReturn(new MsSql());
+
+    underTest.start();
+  }
+
+  @Test
+  public void when_SQ_is_connected_to_Oracle_an_ISE_should_NOT_be_thrown() {
+    when(database.getDialect()).thenReturn(new Oracle());
+
+    underTest.start();
+  }
+
+  @Test
+  public void when_SQ_is_connected_to_Postgres_an_ISE_should_NOT_be_thrown() {
+    when(database.getDialect()).thenReturn(new Oracle());
+
+    underTest.start();
+  }
+}