diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-07-30 10:09:48 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-08-03 17:57:17 +0200 |
commit | 5291ade14f2a05d923dd0af2421247b804c2b418 (patch) | |
tree | 6cc29b5cbf568a3d45136bb44bb9beb38833833e /server/sonar-search | |
parent | 80ada8c264e73426330c79e40e44f36ded7dcc19 (diff) | |
download | sonarqube-5291ade14f2a05d923dd0af2421247b804c2b418.tar.gz sonarqube-5291ade14f2a05d923dd0af2421247b804c2b418.zip |
SONAR-7908 ability to disable Elasticsearch process
Diffstat (limited to 'server/sonar-search')
3 files changed, 52 insertions, 96 deletions
diff --git a/server/sonar-search/src/main/java/org/sonar/search/EsSettings.java b/server/sonar-search/src/main/java/org/sonar/search/EsSettings.java index 950afcfbc76..10a25971354 100644 --- a/server/sonar-search/src/main/java/org/sonar/search/EsSettings.java +++ b/server/sonar-search/src/main/java/org/sonar/search/EsSettings.java @@ -23,38 +23,41 @@ import java.io.File; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; -import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; +import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.settings.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonar.process.MessageException; import org.sonar.process.ProcessProperties; import org.sonar.process.Props; public class EsSettings implements EsSettingsMBean { private static final Logger LOGGER = LoggerFactory.getLogger(EsSettings.class); - public static final String PROP_MARVEL_HOSTS = "sonar.search.marvelHosts"; + public static final String CLUSTER_SEARCH_NODE_NAME = "sonar.cluster.search.nodeName"; + public static final String STANDALONE_NODE_NAME = "sonarqube"; private final Props props; - private final Set<String> masterHosts = new LinkedHashSet<>(); + + private final boolean clusterEnabled; + private final String clusterName; + private final String nodeName; EsSettings(Props props) { this.props = props; - masterHosts.addAll(Arrays.asList(StringUtils.split(props.value(ProcessProperties.CLUSTER_MASTER_HOST, ""), ","))); - } + // name of ES cluster must always be set, even if clustering of SQ is disabled + this.clusterName = props.nonNullValue(ProcessProperties.SEARCH_CLUSTER_NAME); - boolean inCluster() { - return props.valueAsBoolean(ProcessProperties.CLUSTER_ACTIVATE, false); - } - - boolean isMaster() { - return props.valueAsBoolean(ProcessProperties.CLUSTER_MASTER, false); + this.clusterEnabled = props.valueAsBoolean(ProcessProperties.CLUSTER_ENABLED); + if (this.clusterEnabled) { + this.nodeName = props.value(CLUSTER_SEARCH_NODE_NAME, "sonarqube-" + UUID.randomUUID().toString()); + } else { + this.nodeName = STANDALONE_NODE_NAME; + } } @Override @@ -64,12 +67,12 @@ public class EsSettings implements EsSettingsMBean { @Override public String getClusterName() { - return props.value(ProcessProperties.CLUSTER_NAME); + return clusterName; } @Override public String getNodeName() { - return props.value(ProcessProperties.CLUSTER_NODE_NAME); + return nodeName; } Settings build() { @@ -128,8 +131,7 @@ public class EsSettings implements EsSettingsMBean { // standard configuration builder.put("http.enabled", false); } else { - LOGGER.warn(String.format( - "Elasticsearch HTTP connector is enabled on port %d. MUST NOT BE USED FOR PRODUCTION", httpPort)); + LOGGER.warn("Elasticsearch HTTP connector is enabled on port {}. MUST NOT BE USED FOR PRODUCTION", httpPort); // see https://github.com/lmenezes/elasticsearch-kopf/issues/195 builder.put("http.cors.enabled", true); builder.put("http.enabled", true); @@ -157,27 +159,21 @@ public class EsSettings implements EsSettingsMBean { private void configureCluster(Settings.Builder builder) { int replicationFactor = 0; - if (inCluster()) { + if (clusterEnabled) { replicationFactor = 1; - if (isMaster()) { - LOGGER.info("Elasticsearch cluster enabled. Master node."); - builder.put("node.master", true); - } else if (!masterHosts.isEmpty()) { - LOGGER.info("Elasticsearch cluster enabled. Node connecting to master: {}", masterHosts); - builder.put("discovery.zen.ping.unicast.hosts", StringUtils.join(masterHosts, ",")); - builder.put("node.master", false); - builder.put("discovery.zen.minimum_master_nodes", 1); - } else { - throw new MessageException(String.format("Not an Elasticsearch master nor slave. Please check properties %s and %s", - ProcessProperties.CLUSTER_MASTER, ProcessProperties.CLUSTER_MASTER_HOST)); - } + String hosts = props.value(ProcessProperties.CLUSTER_SEARCH_HOSTS, ""); + LOGGER.info("Elasticsearch cluster enabled. Connect to hosts [{}]", hosts); + builder.put("discovery.zen.ping.unicast.hosts", hosts); } + builder.put("discovery.zen.minimum_master_nodes", 1); builder.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, replicationFactor); builder.put("cluster.name", getClusterName()); builder.put("cluster.routing.allocation.awareness.attributes", "rack_id"); String nodeName = getNodeName(); builder.put("node.rack_id", nodeName); builder.put("node.name", nodeName); + builder.put("node.data", true); + builder.put("node.master", true); } private void configureMarvel(Settings.Builder builder) { diff --git a/server/sonar-search/src/test/java/org/sonar/search/EsSettingsTest.java b/server/sonar-search/src/test/java/org/sonar/search/EsSettingsTest.java index 35fd0c236ef..fb679dea270 100644 --- a/server/sonar-search/src/test/java/org/sonar/search/EsSettingsTest.java +++ b/server/sonar-search/src/test/java/org/sonar/search/EsSettingsTest.java @@ -26,12 +26,10 @@ import org.elasticsearch.common.settings.Settings; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.process.MessageException; import org.sonar.process.ProcessProperties; import org.sonar.process.Props; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; public class EsSettingsTest { @@ -45,17 +43,17 @@ public class EsSettingsTest { props.set(ProcessProperties.SEARCH_PORT, "1234"); props.set(ProcessProperties.SEARCH_HOST, "127.0.0.1"); props.set(ProcessProperties.PATH_HOME, homeDir.getAbsolutePath()); - props.set(ProcessProperties.CLUSTER_NAME, "tests"); - props.set(ProcessProperties.CLUSTER_NODE_NAME, "test"); + props.set(ProcessProperties.SEARCH_CLUSTER_NAME, "sonarqube"); EsSettings esSettings = new EsSettings(props); - assertThat(esSettings.inCluster()).isFalse(); Settings generated = esSettings.build(); assertThat(generated.get("transport.tcp.port")).isEqualTo("1234"); assertThat(generated.get("transport.host")).isEqualTo("127.0.0.1"); - assertThat(generated.get("cluster.name")).isEqualTo("tests"); - assertThat(generated.get("node.name")).isEqualTo("test"); + + // no cluster, but cluster and node names are set though + assertThat(generated.get("cluster.name")).isEqualTo("sonarqube"); + assertThat(generated.get("node.name")).isEqualTo("sonarqube"); assertThat(generated.get("path.data")).isNotNull(); assertThat(generated.get("path.logs")).isNotNull(); @@ -64,24 +62,9 @@ public class EsSettingsTest { // http is disabled for security reasons assertThat(generated.get("http.enabled")).isEqualTo("false"); - // no cluster, but node name is set though assertThat(generated.get("index.number_of_replicas")).isEqualTo("0"); assertThat(generated.get("discovery.zen.ping.unicast.hosts")).isNull(); } - - @Test - public void test_default_hosts() throws Exception { - Props props = minProps(); - - EsSettings esSettings = new EsSettings(props); - assertThat(esSettings.inCluster()).isFalse(); - - Settings generated = esSettings.build(); - assertThat(generated.get("transport.tcp.port")).isEqualTo("9001"); - assertThat(generated.get("transport.host")).isEqualTo("127.0.0.1"); - assertThat(generated.get("cluster.name")).isEqualTo("sonarqube"); - assertThat(generated.get("node.name")).startsWith("sonar-"); - } @Test public void override_dirs() throws Exception { @@ -101,38 +84,14 @@ public class EsSettingsTest { } @Test - public void test_cluster_master() throws Exception { + public void cluster_is_enabled() throws Exception { Props props = minProps(); - props.set(ProcessProperties.CLUSTER_ACTIVATE, "true"); - props.set(ProcessProperties.CLUSTER_MASTER, "true"); + props.set(ProcessProperties.CLUSTER_ENABLED, "true"); + props.set(ProcessProperties.CLUSTER_SEARCH_HOSTS, "1.2.3.4:9000,1.2.3.5:8080"); Settings settings = new EsSettings(props).build(); assertThat(settings.get("index.number_of_replicas")).isEqualTo("1"); - assertThat(settings.get("discovery.zen.ping.unicast.hosts")).isNull(); - assertThat(settings.get("node.master")).isEqualTo("true"); - } - - @Test - public void test_cluster_slave() throws Exception { - Props props = minProps(); - props.set(ProcessProperties.CLUSTER_ACTIVATE, "true"); - props.set(ProcessProperties.CLUSTER_MASTER_HOST, "127.0.0.2,127.0.0.3"); - Settings settings = new EsSettings(props).build(); - - assertThat(settings.get("discovery.zen.ping.unicast.hosts")).isEqualTo("127.0.0.2,127.0.0.3"); - assertThat(settings.get("node.master")).isEqualTo("false"); - } - - @Test - public void bad_cluster_configuration() throws Exception { - Props props = minProps(); - props.set(ProcessProperties.CLUSTER_ACTIVATE, "true"); - try { - new EsSettings(props).build(); - fail(); - } catch (MessageException ignored) { - // expected - } + assertThat(settings.get("discovery.zen.ping.unicast.hosts")).isEqualTo("1.2.3.4:9000,1.2.3.5:8080"); } @Test diff --git a/server/sonar-search/src/test/java/org/sonar/search/SearchServerTest.java b/server/sonar-search/src/test/java/org/sonar/search/SearchServerTest.java index 8b63fb52eb4..60ec649ac60 100644 --- a/server/sonar-search/src/test/java/org/sonar/search/SearchServerTest.java +++ b/server/sonar-search/src/test/java/org/sonar/search/SearchServerTest.java @@ -44,11 +44,8 @@ import static org.junit.Assert.fail; public class SearchServerTest { - static final String CLUSTER_NAME = "unitTest"; - - int port = NetworkUtils.freePort(); - SearchServer searchServer; - Client client; + private static final String A_CLUSTER_NAME = "a_cluster"; + private static final String A_NODE_NAME = "a_node"; @Rule public TestRule timeout = new DisableOnDebug(Timeout.seconds(60)); @@ -56,11 +53,15 @@ public class SearchServerTest { @Rule public TemporaryFolder temp = new TemporaryFolder(); + private int port = NetworkUtils.freePort(); + private Client client; + private SearchServer underTest; + @After public void tearDown() { - if (searchServer != null) { - searchServer.stop(); - searchServer.awaitStop(); + if (underTest != null) { + underTest.stop(); + underTest.awaitStop(); } if (client != null) { client.close(); @@ -74,23 +75,23 @@ public class SearchServerTest { InetAddress host = InetAddress.getLocalHost(); props.set(ProcessProperties.SEARCH_HOST, host.getHostAddress()); props.set(ProcessProperties.SEARCH_PORT, String.valueOf(port)); - props.set(ProcessProperties.CLUSTER_NAME, CLUSTER_NAME); - props.set(ProcessProperties.CLUSTER_NODE_NAME, "test"); + props.set(ProcessProperties.SEARCH_CLUSTER_NAME, A_CLUSTER_NAME); + props.set(EsSettings.CLUSTER_SEARCH_NODE_NAME, A_NODE_NAME); props.set(ProcessProperties.PATH_HOME, temp.newFolder().getAbsolutePath()); props.set(ProcessEntryPoint.PROPERTY_SHARED_PATH, temp.newFolder().getAbsolutePath()); - searchServer = new SearchServer(props); - searchServer.start(); - assertThat(searchServer.isUp()).isTrue(); + underTest = new SearchServer(props); + underTest.start(); + assertThat(underTest.isUp()).isTrue(); - Settings settings = Settings.builder().put("cluster.name", CLUSTER_NAME).build(); + Settings settings = Settings.builder().put("cluster.name", A_CLUSTER_NAME).build(); client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(host, port)); assertThat(client.admin().cluster().prepareClusterStats().get().getStatus()).isEqualTo(ClusterHealthStatus.GREEN); - searchServer.stop(); - searchServer.awaitStop(); - searchServer = null; + underTest.stop(); + underTest.awaitStop(); + underTest = null; try { client.admin().cluster().prepareClusterStats().get(); fail(); |