*/
package org.sonar.server.es;
+import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequestBuilder;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthStatus;
import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchScrollRequestBuilder;
import org.elasticsearch.client.Client;
+import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.Priority;
+import org.elasticsearch.common.logging.ESLoggerFactory;
+import org.elasticsearch.common.logging.slf4j.Slf4jESLoggerFactory;
+import org.elasticsearch.common.settings.ImmutableSettings;
+import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.picocontainer.Startable;
+import org.sonar.api.config.Settings;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
+import org.sonar.process.LoopbackAddress;
+import org.sonar.process.ProcessProperties;
import org.sonar.server.es.request.ProxyBulkRequestBuilder;
import org.sonar.server.es.request.ProxyClearCacheRequestBuilder;
import org.sonar.server.es.request.ProxyClusterHealthRequestBuilder;
import org.sonar.server.es.request.ProxyRefreshRequestBuilder;
import org.sonar.server.es.request.ProxySearchRequestBuilder;
import org.sonar.server.es.request.ProxySearchScrollRequestBuilder;
-import org.sonar.server.search.SearchClient;
/**
* Facade to connect to Elasticsearch node. Handles correctly errors (logging + exceptions
public class EsClient implements Startable {
public static final Logger LOGGER = Loggers.get("es");
- private final SearchClient deprecatedClient;
+ private final Settings settings;
+ private Client nativeClient = null;
- public EsClient(SearchClient deprecatedClient) {
- this.deprecatedClient = deprecatedClient;
+ public EsClient(Settings settings) {
+ this.settings = settings;
+ }
+
+ EsClient(Settings settings, Client nativeClient) {
+ this.settings = settings;
+ this.nativeClient = nativeClient;
}
public RefreshRequestBuilder prepareRefresh(String... indices) {
- return new ProxyRefreshRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyRefreshRequestBuilder(nativeClient()).setIndices(indices);
}
public FlushRequestBuilder prepareFlush(String... indices) {
- return new ProxyFlushRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyFlushRequestBuilder(nativeClient()).setIndices(indices);
}
public IndicesStatsRequestBuilder prepareStats(String... indices) {
- return new ProxyIndicesStatsRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyIndicesStatsRequestBuilder(nativeClient()).setIndices(indices);
}
public NodesStatsRequestBuilder prepareNodesStats(String... nodesIds) {
- return new ProxyNodesStatsRequestBuilder(deprecatedClient.nativeClient()).setNodesIds(nodesIds);
+ return new ProxyNodesStatsRequestBuilder(nativeClient()).setNodesIds(nodesIds);
}
public ClusterStatsRequestBuilder prepareClusterStats() {
- return new ProxyClusterStatsRequestBuilder(deprecatedClient.nativeClient());
+ return new ProxyClusterStatsRequestBuilder(nativeClient());
}
public ClusterStateRequestBuilder prepareState() {
- return new ProxyClusterStateRequestBuilder(deprecatedClient.nativeClient());
+ return new ProxyClusterStateRequestBuilder(nativeClient());
}
public ClusterHealthRequestBuilder prepareHealth(String... indices) {
- return new ProxyClusterHealthRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyClusterHealthRequestBuilder(nativeClient()).setIndices(indices);
}
public void waitForStatus(ClusterHealthStatus status) {
}
public IndicesExistsRequestBuilder prepareIndicesExist(String... indices) {
- return new ProxyIndicesExistsRequestBuilder(deprecatedClient.nativeClient(), indices);
+ return new ProxyIndicesExistsRequestBuilder(nativeClient(), indices);
}
public CreateIndexRequestBuilder prepareCreate(String index) {
- return new ProxyCreateIndexRequestBuilder(deprecatedClient.nativeClient(), index);
+ return new ProxyCreateIndexRequestBuilder(nativeClient(), index);
}
public PutMappingRequestBuilder preparePutMapping(String... indices) {
- return new ProxyPutMappingRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyPutMappingRequestBuilder(nativeClient()).setIndices(indices);
}
public SearchRequestBuilder prepareSearch(String... indices) {
- return new ProxySearchRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxySearchRequestBuilder(nativeClient()).setIndices(indices);
}
public SearchScrollRequestBuilder prepareSearchScroll(String scrollId) {
- return new ProxySearchScrollRequestBuilder(scrollId, deprecatedClient.nativeClient());
+ return new ProxySearchScrollRequestBuilder(scrollId, nativeClient());
}
public GetRequestBuilder prepareGet() {
- return new ProxyGetRequestBuilder(deprecatedClient.nativeClient());
+ return new ProxyGetRequestBuilder(nativeClient());
}
public GetRequestBuilder prepareGet(String index, String type, String id) {
- return new ProxyGetRequestBuilder(deprecatedClient.nativeClient()).setIndex(index).setType(type).setId(id);
+ return new ProxyGetRequestBuilder(nativeClient()).setIndex(index).setType(type).setId(id);
}
public MultiGetRequestBuilder prepareMultiGet() {
- return new ProxyMultiGetRequestBuilder(deprecatedClient.nativeClient());
+ return new ProxyMultiGetRequestBuilder(nativeClient());
}
public CountRequestBuilder prepareCount(String... indices) {
- return new ProxyCountRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyCountRequestBuilder(nativeClient()).setIndices(indices);
}
public BulkRequestBuilder prepareBulk() {
- return new ProxyBulkRequestBuilder(deprecatedClient.nativeClient());
+ return new ProxyBulkRequestBuilder(nativeClient());
}
public DeleteRequestBuilder prepareDelete(String index, String type, String id) {
- return new ProxyDeleteRequestBuilder(deprecatedClient.nativeClient(), index).setType(type).setId(id);
+ return new ProxyDeleteRequestBuilder(nativeClient(), index).setType(type).setId(id);
}
+ /**
+ * @deprecated delete-by-query is dropped from ES 2.0 and should not be used. See
+ * https://www.elastic.co/guide/en/elasticsearch/reference/1.7/docs-delete-by-query.html
+ */
+ @Deprecated
public DeleteByQueryRequestBuilder prepareDeleteByQuery(String... indices) {
- return new ProxyDeleteByQueryRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyDeleteByQueryRequestBuilder(nativeClient()).setIndices(indices);
}
public IndexRequestBuilder prepareIndex(String index, String type) {
- return new ProxyIndexRequestBuilder(deprecatedClient.nativeClient()).setIndex(index).setType(type);
+ return new ProxyIndexRequestBuilder(nativeClient()).setIndex(index).setType(type);
}
public OptimizeRequestBuilder prepareOptimize(String indexName) {
}
public ClearIndicesCacheRequestBuilder prepareClearCache(String... indices) {
- return new ProxyClearCacheRequestBuilder(deprecatedClient.nativeClient()).setIndices(indices);
+ return new ProxyClearCacheRequestBuilder(nativeClient()).setIndices(indices);
}
public long getMaxFieldValue(String indexName, String typeName, String fieldName) {
@Override
public void start() {
- // nothing to do
+ if (nativeClient == null) {
+ ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory());
+ org.elasticsearch.common.settings.Settings esSettings = ImmutableSettings.settingsBuilder()
+ .put("node.name", StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.CLUSTER_NODE_NAME), "sq_local_client"))
+ .put("network.bind_host", StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.SEARCH_HOST), "localhost"))
+ .put("node.rack_id", StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.CLUSTER_NODE_NAME), "unknown"))
+ .put("cluster.name", StringUtils.defaultIfBlank(settings.getString(ProcessProperties.CLUSTER_NAME), "sonarqube"))
+ .build();
+ nativeClient = new TransportClient(esSettings);
+ ((TransportClient) nativeClient).addTransportAddress(new InetSocketTransportAddress(StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.SEARCH_HOST),
+ LoopbackAddress.get()
+ .getHostAddress()),
+ settings.getInt(ProcessProperties.SEARCH_PORT)));
+ }
}
@Override
public void stop() {
- // TODO re-enable when SearchClient is dropped
- // client.close();
+ if (nativeClient != null) {
+ nativeClient.close();
+ }
}
protected Client nativeClient() {
- return deprecatedClient.nativeClient();
+ return nativeClient;
}
}
public class EsSearchModule extends Module {
@Override
protected void configureModule() {
- add(
- SearchClient.class,
- EsClient.class);
+ add(EsClient.class);
}
}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact 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.search;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.apache.commons.lang.StringUtils;
-import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
-import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
-import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
-import org.elasticsearch.action.admin.indices.refresh.RefreshRequestBuilder;
-import org.elasticsearch.action.bulk.BulkRequestBuilder;
-import org.elasticsearch.action.count.CountRequestBuilder;
-import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestBuilder;
-import org.elasticsearch.action.get.GetRequestBuilder;
-import org.elasticsearch.action.get.MultiGetRequestBuilder;
-import org.elasticsearch.action.search.SearchRequestBuilder;
-import org.elasticsearch.action.search.SearchScrollRequestBuilder;
-import org.elasticsearch.client.Client;
-import org.elasticsearch.client.transport.TransportClient;
-import org.elasticsearch.common.logging.ESLoggerFactory;
-import org.elasticsearch.common.logging.slf4j.Slf4jESLoggerFactory;
-import org.elasticsearch.common.settings.ImmutableSettings;
-import org.elasticsearch.common.transport.InetSocketTransportAddress;
-import org.picocontainer.Startable;
-import org.sonar.api.config.Settings;
-import org.sonar.process.LoopbackAddress;
-import org.sonar.process.ProcessProperties;
-import org.sonar.server.es.request.ProxyBulkRequestBuilder;
-import org.sonar.server.es.request.ProxyCountRequestBuilder;
-import org.sonar.server.es.request.ProxyCreateIndexRequestBuilder;
-import org.sonar.server.es.request.ProxyGetRequestBuilder;
-import org.sonar.server.es.request.ProxyIndicesExistsRequestBuilder;
-import org.sonar.server.es.request.ProxyMultiGetRequestBuilder;
-import org.sonar.server.es.request.ProxyPutMappingRequestBuilder;
-import org.sonar.server.es.request.ProxyRefreshRequestBuilder;
-import org.sonar.server.es.request.ProxySearchRequestBuilder;
-import org.sonar.server.es.request.ProxySearchScrollRequestBuilder;
-
-/**
- * ElasticSearch Node used to connect to index.
- */
-public class SearchClient implements Startable {
-
- private final Settings settings;
- private Client nativeClient;
-
- public SearchClient(Settings settings) {
- this.settings = settings;
- }
-
- @VisibleForTesting
- public SearchClient(Settings settings, Client nativeClient) {
- this.settings = settings;
- this.nativeClient = nativeClient;
- }
-
- public Client nativeClient() {
- if (nativeClient == null) {
- throw new IllegalStateException();
- }
- return nativeClient;
- }
-
- public RefreshRequestBuilder prepareRefresh(String... indices) {
- return new ProxyRefreshRequestBuilder(nativeClient).setIndices(indices);
- }
-
- public IndicesExistsRequestBuilder prepareIndicesExist(String... indices) {
- return new ProxyIndicesExistsRequestBuilder(nativeClient, indices);
- }
-
- public CreateIndexRequestBuilder prepareCreate(String index) {
- return new ProxyCreateIndexRequestBuilder(nativeClient, index);
- }
-
- public PutMappingRequestBuilder preparePutMapping(String... indices) {
- return new ProxyPutMappingRequestBuilder(nativeClient).setIndices(indices);
- }
-
- public SearchRequestBuilder prepareSearch(String... indices) {
- return new ProxySearchRequestBuilder(nativeClient).setIndices(indices);
- }
-
- public SearchScrollRequestBuilder prepareSearchScroll(String scrollId) {
- return new ProxySearchScrollRequestBuilder(scrollId, nativeClient);
- }
-
- public GetRequestBuilder prepareGet() {
- return new ProxyGetRequestBuilder(nativeClient);
- }
-
- public MultiGetRequestBuilder prepareMultiGet() {
- return new ProxyMultiGetRequestBuilder(nativeClient);
- }
-
- public CountRequestBuilder prepareCount(String... indices) {
- return new ProxyCountRequestBuilder(nativeClient).setIndices(indices);
- }
-
- public BulkRequestBuilder prepareBulk() {
- return new ProxyBulkRequestBuilder(nativeClient);
- }
-
- public DeleteByQueryRequestBuilder prepareDeleteByQuery(String... indices) {
- throw new UnsupportedOperationException("Delete by query must not be used. See https://github.com/elastic/elasticsearch/issues/10067. See alternatives in BulkIndexer.");
- }
-
- @Override
- public synchronized void start() {
- if (nativeClient == null) {
- ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory());
- org.elasticsearch.common.settings.Settings esSettings = ImmutableSettings.settingsBuilder()
- .put("node.name", StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.CLUSTER_NODE_NAME), "sq_local_client"))
- .put("network.bind_host", StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.SEARCH_HOST), "localhost"))
- .put("node.rack_id", StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.CLUSTER_NODE_NAME), "unknown"))
- .put("cluster.name", StringUtils.defaultIfBlank(settings.getString(ProcessProperties.CLUSTER_NAME), "sonarqube"))
- .build();
- nativeClient = new TransportClient(esSettings);
- ((TransportClient) nativeClient).addTransportAddress(new InetSocketTransportAddress(StringUtils.defaultIfEmpty(settings.getString(ProcessProperties.SEARCH_HOST),
- LoopbackAddress.get()
- .getHostAddress()),
- settings.getInt(ProcessProperties.SEARCH_PORT)));
- }
- }
-
- @Override
- public void stop() {
- if (nativeClient != null) {
- nativeClient.close();
- }
- }
-}
import org.sonar.server.es.request.ProxyClusterStatsRequestBuilder;
import org.sonar.server.es.request.ProxyCountRequestBuilder;
import org.sonar.server.es.request.ProxyCreateIndexRequestBuilder;
-import org.sonar.server.es.request.ProxyDeleteByQueryRequestBuilder;
import org.sonar.server.es.request.ProxyDeleteRequestBuilder;
import org.sonar.server.es.request.ProxyFlushRequestBuilder;
import org.sonar.server.es.request.ProxyGetRequestBuilder;
@Test
public void proxify_requests() {
- EsClient client = es.client();
- client.start();
- assertThat(client.nativeClient()).isNotNull();
- assertThat(client.prepareBulk()).isInstanceOf(ProxyBulkRequestBuilder.class);
- assertThat(client.prepareClusterStats()).isInstanceOf(ProxyClusterStatsRequestBuilder.class);
- assertThat(client.prepareCount()).isInstanceOf(ProxyCountRequestBuilder.class);
- assertThat(client.prepareCreate("fakes")).isInstanceOf(ProxyCreateIndexRequestBuilder.class);
- assertThat(client.prepareDeleteByQuery()).isInstanceOf(ProxyDeleteByQueryRequestBuilder.class);
- assertThat(client.prepareDelete("fakes", "fake", "my_id")).isInstanceOf(ProxyDeleteRequestBuilder.class);
- assertThat(client.prepareIndicesExist()).isInstanceOf(ProxyIndicesExistsRequestBuilder.class);
- assertThat(client.prepareFlush()).isInstanceOf(ProxyFlushRequestBuilder.class);
- assertThat(client.prepareGet()).isInstanceOf(ProxyGetRequestBuilder.class);
- assertThat(client.prepareGet("fakes", "fake", "1")).isInstanceOf(ProxyGetRequestBuilder.class);
- assertThat(client.prepareHealth()).isInstanceOf(ProxyClusterHealthRequestBuilder.class);
- assertThat(client.prepareMultiGet()).isInstanceOf(ProxyMultiGetRequestBuilder.class);
- assertThat(client.prepareNodesStats()).isInstanceOf(ProxyNodesStatsRequestBuilder.class);
- assertThat(client.preparePutMapping()).isInstanceOf(ProxyPutMappingRequestBuilder.class);
- assertThat(client.prepareRefresh()).isInstanceOf(ProxyRefreshRequestBuilder.class);
- assertThat(client.prepareSearch()).isInstanceOf(ProxySearchRequestBuilder.class);
- assertThat(client.prepareSearchScroll("1234")).isInstanceOf(ProxySearchScrollRequestBuilder.class);
- assertThat(client.prepareState()).isInstanceOf(ProxyClusterStateRequestBuilder.class);
- assertThat(client.prepareStats()).isInstanceOf(ProxyIndicesStatsRequestBuilder.class);
+ EsClient underTest = es.client();
+ underTest.start();
+ assertThat(underTest.nativeClient()).isNotNull();
+ assertThat(underTest.prepareBulk()).isInstanceOf(ProxyBulkRequestBuilder.class);
+ assertThat(underTest.prepareClusterStats()).isInstanceOf(ProxyClusterStatsRequestBuilder.class);
+ assertThat(underTest.prepareCount()).isInstanceOf(ProxyCountRequestBuilder.class);
+ assertThat(underTest.prepareCreate("fakes")).isInstanceOf(ProxyCreateIndexRequestBuilder.class);
+ assertThat(underTest.prepareDelete("fakes", "fake", "my_id")).isInstanceOf(ProxyDeleteRequestBuilder.class);
+ assertThat(underTest.prepareIndicesExist()).isInstanceOf(ProxyIndicesExistsRequestBuilder.class);
+ assertThat(underTest.prepareFlush()).isInstanceOf(ProxyFlushRequestBuilder.class);
+ assertThat(underTest.prepareGet()).isInstanceOf(ProxyGetRequestBuilder.class);
+ assertThat(underTest.prepareGet("fakes", "fake", "1")).isInstanceOf(ProxyGetRequestBuilder.class);
+ assertThat(underTest.prepareHealth()).isInstanceOf(ProxyClusterHealthRequestBuilder.class);
+ assertThat(underTest.prepareMultiGet()).isInstanceOf(ProxyMultiGetRequestBuilder.class);
+ assertThat(underTest.prepareNodesStats()).isInstanceOf(ProxyNodesStatsRequestBuilder.class);
+ assertThat(underTest.preparePutMapping()).isInstanceOf(ProxyPutMappingRequestBuilder.class);
+ assertThat(underTest.prepareRefresh()).isInstanceOf(ProxyRefreshRequestBuilder.class);
+ assertThat(underTest.prepareSearch()).isInstanceOf(ProxySearchRequestBuilder.class);
+ assertThat(underTest.prepareSearchScroll("1234")).isInstanceOf(ProxySearchScrollRequestBuilder.class);
+ assertThat(underTest.prepareState()).isInstanceOf(ProxyClusterStateRequestBuilder.class);
+ assertThat(underTest.prepareStats()).isInstanceOf(ProxyIndicesStatsRequestBuilder.class);
- client.stop();
+ underTest.stop();
}
}
import org.sonar.api.config.Settings;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.server.search.BaseDoc;
-import org.sonar.server.search.SearchClient;
import org.sonar.test.TestUtils;
import static com.google.common.collect.Lists.newArrayList;
DeleteIndexResponse response = node.client().admin().indices().prepareDelete("_all").get();
assertThat(response.isAcknowledged()).isTrue();
- client = new EsClient(new SearchClient(new Settings(), node.client()));
+ client = new EsClient(new Settings(), node.client());
client.start();
if (!definitions.isEmpty()) {
public void verify_count_of_added_components() {
ComponentContainer container = new ComponentContainer();
new EsSearchModule().configure(container);
- assertThat(container.size()).isEqualTo(4);
+ assertThat(container.size()).isEqualTo(3);
}
}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact 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.search;
-
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.sonar.server.tester.ServerTester;
-import org.sonar.server.tester.UserSessionRule;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.fail;
-
-public class SearchClientMediumTest {
-
- @ClassRule
- public static ServerTester tester = new ServerTester().withEsIndexes();
-
- @Rule
- public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
-
- SearchClient searchClient;
-
- @Before
- public void setUp() {
- tester.clearDbAndIndexes();
- searchClient = tester.get(SearchClient.class);
- }
-
- @Test
- public void delete_by_query_is_not_supported() {
- try {
- searchClient.prepareDeleteByQuery();
- fail();
- } catch (UnsupportedOperationException e) {
- assertThat(e).hasMessage("Delete by query must not be used. See https://github.com/elastic/elasticsearch/issues/10067. See alternatives in BulkIndexer.");
- }
- }
-
-}