/*
* Licensed to ElasticSearch and Shay Banon under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. ElasticSearch licenses this
* file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.test.integration.routing;
import org.elasticsearch.ElasticSearchIllegalArgumentException;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.ClusterService;
import org.elasticsearch.node.internal.InternalNode;
import org.elasticsearch.test.integration.AbstractNodesTests;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.Map;
import java.util.Set;
import static com.google.common.collect.Maps.newHashMap;
import static com.google.common.collect.Sets.newHashSet;
import static org.elasticsearch.cluster.metadata.AliasAction.newAddAliasAction;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
/**
*
*/
public class AliasResolveRoutingTests extends AbstractNodesTests {
private Client client;
private ClusterService clusterService;
@BeforeClass
public void createNodes() throws Exception {
startNode("node1");
startNode("node2");
client = getClient();
clusterService = ((InternalNode) node("node1")).injector().getInstance(ClusterService.class);
}
@AfterClass
public void closeNodes() {
client.close();
closeAllNodes();
}
protected Client getClient() {
return client("node1");
}
@Test
public void testResolveIndexRouting() throws Exception {
try {
client.admin().indices().prepareDelete("test1").execute().actionGet();
client.admin().indices().prepareDelete("test2").execute().actionGet();
} catch (Exception e) {
// ignore
}
client.admin().indices().prepareCreate("test1").execute().actionGet();
client.admin().indices().prepareCreate("test2").execute().actionGet();
client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias10").routing("0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias110").searchRouting("1,0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias12").routing("2")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test2", "alias20").routing("0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test2", "alias21").routing("1")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias0").routing("0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test2", "alias0").routing("0")).execute().actionGet();
assertThat(clusterService.state().metaData().resolveIndexRouting(null, "test1"), nullValue());
assertThat(clusterService.state().metaData().resolveIndexRouting(null, "alias"), nullValue());
assertThat(clusterService.state().metaData().resolveIndexRouting(null, "test1"), nullValue());
assertThat(clusterService.state().metaData().resolveIndexRouting(null, "alias10"), equalTo("0"));
assertThat(clusterService.state().metaData().resolveIndexRouting(null, "alias20"), equalTo("0"));
assertThat(clusterService.state().metaData().resolveIndexRouting(null, "alias21"), equalTo("1"));
assertThat(clusterService.state().metaData().resolveIndexRouting("3", "test1"), equalTo("3"));
assertThat(clusterService.state().metaData().resolveIndexRouting("0", "alias10"), equalTo("0"));
try {
clusterService.state().metaData().resolveIndexRouting("1", "alias10");
assert false : "should fail";
} catch (ElasticSearchIllegalArgumentException e) {
// all is well, we can't have two mappings, one provided, and one in the alias
}
try {
clusterService.state().metaData().resolveIndexRouting(null, "alias0");
assert false : "should fail";
} catch (ElasticSearchIllegalArgumentException ex) {
// Expected
}
}
@Test
public void testResolveSearchRouting() throws Exception {
try {
client.admin().indices().prepareDelete("test1").execute().actionGet();
client.admin().indices().prepareDelete("test2").execute().actionGet();
} catch (Exception e) {
// ignore
}
client.admin().indices().prepareCreate("test1").execute().actionGet();
client.admin().indices().prepareCreate("test2").execute().actionGet();
client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias10").routing("0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test2", "alias20").routing("0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test2", "alias21").routing("1")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test1", "alias0").routing("0")).execute().actionGet();
client.admin().indices().prepareAliases().addAliasAction(newAddAliasAction("test2", "alias0").routing("0")).execute().actionGet();
assertThat(clusterService.state().metaData().resolveSearchRouting(null, "alias"), nullValue());
assertThat(clusterService.state().metaData().resolveSearchRouting("0,1", "alias"), equalTo(newMap("test1", newSet("0", "1"))));
assertThat(clusterService.state().metaData().resolveSearchRouting(null, "alias10"), equalTo(newMap("test1", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting(null, "alias10"), equalTo(newMap("test1", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("0", "alias10"), equalTo(newMap("test1", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("1", "alias10"), nullValue());
assertThat(clusterService.state().metaData().resolveSearchRouting(null, "alias0"), equalTo(newMap("test1", newSet("0"), "test2", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting(null, new String[]{"alias10", "alias20"}),
equalTo(newMap("test1", newSet("0"), "test2", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting(null, new String[]{"alias10", "alias21"}),
equalTo(newMap("test1", newSet("0"), "test2", newSet("1"))));
assertThat(clusterService.state().metaData().resolveSearchRouting(null, new String[]{"alias20", "alias21"}),
equalTo(newMap("test2", newSet("0", "1"))));
assertThat(clusterService.state().metaData().resolveSearchRouting(null, new String[]{"test1", "alias10"}), nullValue());
assertThat(clusterService.state().metaData().resolveSearchRouting(null, new String[]{"alias10", "test1"}), nullValue());
assertThat(clusterService.state().metaData().resolveSearchRouting("0", new String[]{"alias10", "alias20"}),
equalTo(newMap("test1", newSet("0"), "test2", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("0,1", new String[]{"alias10", "alias20"}),
equalTo(newMap("test1", newSet("0"), "test2", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("1", new String[]{"alias10", "alias20"}), nullValue());
assertThat(clusterService.state().metaData().resolveSearchRouting("0", new String[]{"alias10", "alias21"}),
equalTo(newMap("test1", newSet("0"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("1", new String[]{"alias10", "alias21"}),
equalTo(newMap("test2", newSet("1"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("0,1,2", new String[]{"alias10", "alias21"}),
equalTo(newMap("test1", newSet("0"), "test2", newSet("1"))));
assertThat(clusterService.state().metaData().resolveSearchRouting("0,1,2", new String[]{"test1", "alias10", "alias21"}),
equalTo(newMap("test1", newSet("0", "1", "2"), "test2", newSet("1"))));
}
private <T> Set<T> newSet(T... elements) {
return newHashSet(elements);
}
private <K, V> Map<K, V> newMap(K key, V value) {
Map<K, V> r = newHashMap();
r.put(key, value);
return r;
}
private <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) {
Map<K, V> r = newHashMap();
r.put(key1, value1);
r.put(key2, value2);
return r;
}
}