aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-search
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2016-07-30 10:09:48 +0200
committerSimon Brandhof <simon.brandhof@sonarsource.com>2016-08-03 17:57:17 +0200
commit5291ade14f2a05d923dd0af2421247b804c2b418 (patch)
tree6cc29b5cbf568a3d45136bb44bb9beb38833833e /server/sonar-search
parent80ada8c264e73426330c79e40e44f36ded7dcc19 (diff)
downloadsonarqube-5291ade14f2a05d923dd0af2421247b804c2b418.tar.gz
sonarqube-5291ade14f2a05d923dd0af2421247b804c2b418.zip
SONAR-7908 ability to disable Elasticsearch process
Diffstat (limited to 'server/sonar-search')
-rw-r--r--server/sonar-search/src/main/java/org/sonar/search/EsSettings.java54
-rw-r--r--server/sonar-search/src/test/java/org/sonar/search/EsSettingsTest.java59
-rw-r--r--server/sonar-search/src/test/java/org/sonar/search/SearchServerTest.java35
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();