package org.xbib.elasticsearch.gatherer; import org.elasticsearch.action.admin.cluster.node.info.NodesInfoRequest; import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.client.Client; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.ESLoggerFactory; import org.elasticsearch.common.network.NetworkUtils; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.indices.IndexMissingException; import org.elasticsearch.node.Node; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import java.util.Map; import static org.elasticsearch.common.collect.Maps.newHashMap; import static org.elasticsearch.common.settings.ImmutableSettings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder; import static org.elasticsearch.node.NodeBuilder.nodeBuilder; public abstract class AbstractNodeTest extends Assert { private final static ESLogger logger = ESLoggerFactory.getLogger("test"); protected final String CLUSTER = "test-cluster-" + NetworkUtils.getLocalAddress().getHostName(); protected final String INDEX = "test-" + NetworkUtils.getLocalAddress().getHostName().toLowerCase(); protected int PORT; protected Settings defaultSettings = ImmutableSettings .settingsBuilder() .put("cluster.name", CLUSTER) .build(); private Map<String, Node> nodes = newHashMap(); private Map<String, Client> clients = newHashMap(); private Map<String, InetSocketTransportAddress> addresses = newHashMap(); @BeforeMethod public void createIndex() throws Exception { startNode("1"); // find node address NodesInfoRequest nodesInfoRequest = new NodesInfoRequest().transport(true); NodesInfoResponse response = client("1").admin().cluster().nodesInfo(nodesInfoRequest).actionGet(); InetSocketTransportAddress address = (InetSocketTransportAddress)response.iterator().next() .getTransport().getAddress().publishAddress(); PORT = address.address().getPort(); addresses.put("1", address); logger.info("creating index {}", INDEX); client("1").admin().indices().create(new CreateIndexRequest(INDEX)).actionGet(); logger.info("index {} created", INDEX); } @AfterMethod public void deleteIndices() { logger.info("deleting index {}", INDEX); try { client("1").admin().indices().delete(new DeleteIndexRequest().indices(INDEX)).actionGet(); } catch (IndexMissingException e) { // ignore } logger.info("index {} deleted", INDEX); closeAllNodes(); } public Node startNode(String id) { return buildNode(id).start(); } public Node buildNode(String id) { return buildNode(id, EMPTY_SETTINGS); } public Node buildNode(String id, Settings settings) { String settingsSource = getClass().getName().replace('.', '/') + ".yml"; Settings finalSettings = settingsBuilder() .loadFromClasspath(settingsSource) .put(defaultSettings) .put(settings) .put("name", id) .build(); if (finalSettings.get("gateway.type") == null) { finalSettings = settingsBuilder().put(finalSettings).put("gateway.type", "none").build(); } if (finalSettings.get("cluster.routing.schedule") != null) { finalSettings = settingsBuilder().put(finalSettings).put("cluster.routing.schedule", "50ms").build(); } Node node = nodeBuilder().settings(finalSettings).build(); Client client = node.client(); nodes.put(id, node); clients.put(id, client); return node; } public void stopNode(String id) { Client client = clients.remove(id); if (client != null) { client.close(); } Node node = nodes.remove(id); if (node != null) { node.close(); } } public Client client(String id) { return clients.get(id); } public void closeAllNodes() { for (Client client : clients.values()) { client.close(); } clients.clear(); for (Node node : nodes.values()) { node.close(); } nodes.clear(); } }