in server/src/internalClusterTest/java/org/elasticsearch/indices/cluster/ResolveClusterIT.java [71:407]
public void testClusterResolveWithIndices() throws IOException {
Map<String, Object> testClusterInfo = setupThreeClusters(false);
String localIndex = (String) testClusterInfo.get("local.index");
String remoteIndex1 = (String) testClusterInfo.get("remote1.index");
String remoteIndex2 = (String) testClusterInfo.get("remote2.index");
boolean skipUnavailable1 = (Boolean) testClusterInfo.get("remote1.skip_unavailable");
boolean skipUnavailable2 = true;
// all clusters and both have matching indices
{
String[] indexExpressions = new String[] {
localIndex,
REMOTE_CLUSTER_1 + ":" + remoteIndex1,
REMOTE_CLUSTER_2 + ":" + remoteIndex2 };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(3, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_1, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote1 = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote1.isConnected(), equalTo(true));
assertThat(remote1.getSkipUnavailable(), equalTo(skipUnavailable1));
assertThat(remote1.getMatchingIndices(), equalTo(true));
assertNotNull(remote1.getBuild().version());
assertNull(remote1.getError());
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(skipUnavailable2));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(true));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
// include two indices (no wildcards), one exists and one does not -> should still show `matching_indices: true`
{
String[] indexExpressions = new String[] {
localIndex,
"doesnotexist",
REMOTE_CLUSTER_1 + ":" + remoteIndex1,
REMOTE_CLUSTER_2 + ":" + remoteIndex2 };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(3, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_1, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote1 = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote1.isConnected(), equalTo(true));
assertThat(remote1.getSkipUnavailable(), equalTo(skipUnavailable1));
assertThat(remote1.getMatchingIndices(), equalTo(true));
assertNotNull(remote1.getBuild().version());
assertNull(remote1.getError());
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(skipUnavailable2));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertNull(local.getMatchingIndices());
assertNull(local.getBuild());
assertThat(local.getError(), containsString("no such index [doesnotexist]"));
}
// only remote clusters have matching indices
{
String[] indexExpressions = new String[] { "f*", REMOTE_CLUSTER_1 + ":" + remoteIndex1, REMOTE_CLUSTER_2 + ":" + remoteIndex2 };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(3, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_1, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote1 = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote1.isConnected(), equalTo(true));
assertThat(remote1.getSkipUnavailable(), equalTo(skipUnavailable1));
assertThat(remote1.getMatchingIndices(), equalTo(true));
assertNotNull(remote1.getBuild().version());
assertNull(remote1.getError());
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(skipUnavailable2));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(false));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
// only local cluster has matching indices
{
String[] indexExpressions = new String[] {
localIndex,
REMOTE_CLUSTER_1 + ":" + localIndex,
REMOTE_CLUSTER_2 + ":" + localIndex };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(3, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_1, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote1 = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote1.isConnected(), equalTo(true));
assertThat(remote1.getSkipUnavailable(), equalTo(skipUnavailable1));
assertNull(remote1.getMatchingIndices());
assertNull(remote1.getBuild());
assertNotNull(remote1.getError());
assertThat(remote1.getError(), containsString("no such index [demo]"));
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(skipUnavailable2));
assertNull(remote2.getMatchingIndices());
assertNull(remote2.getBuild());
assertNotNull(remote2.getError());
assertThat(remote2.getError(), containsString("no such index [demo]"));
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(true));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
// test with wildcard expressions in the index - all clusters should match
{
String[] indexExpressions = new String[] {
localIndex.substring(0, 2) + "*",
REMOTE_CLUSTER_1 + ":" + remoteIndex1.substring(0, 4) + "*",
REMOTE_CLUSTER_2 + ":*" };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(3, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_1, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote1 = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote1.isConnected(), equalTo(true));
assertThat(remote1.getSkipUnavailable(), equalTo(skipUnavailable1));
assertThat(remote1.getMatchingIndices(), equalTo(true));
assertNotNull(remote1.getBuild().version());
assertNull(remote1.getError());
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(skipUnavailable2));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(true));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
// test with wildcard expressions in the cluster and index - all clusters should match
{
String[] indexExpressions = new String[] {
localIndex.substring(0, 2) + "*",
REMOTE_CLUSTER_1.substring(0, 4) + "*:" + remoteIndex1.substring(0, 3) + "*" };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(3, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_1, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote1 = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote1.isConnected(), equalTo(true));
assertThat(remote1.getSkipUnavailable(), equalTo(skipUnavailable1));
assertThat(remote1.getMatchingIndices(), equalTo(true));
assertNotNull(remote1.getBuild().version());
assertNull(remote1.getError());
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(true));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(true));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
// only remote1 included
{
String[] indexExpressions = new String[] { REMOTE_CLUSTER_1 + ":*" };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(1, clusterInfo.size());
assertThat(clusterInfo.keySet(), equalTo(Set.of(REMOTE_CLUSTER_1)));
ResolveClusterInfo remote = clusterInfo.get(REMOTE_CLUSTER_1);
assertThat(remote.isConnected(), equalTo(true));
assertThat(remote.getSkipUnavailable(), equalTo(skipUnavailable1));
assertThat(remote.getMatchingIndices(), equalTo(true));
assertNotNull(remote.getBuild().version());
}
// cluster exclusions
{
String[] indexExpressions = new String[] { "*", "rem*:*", "-remote1:*" };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(2, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(true));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(true));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
// index exclusions
{
String[] indexExpressions = new String[] { "*", "rem*:*", "-remote1:*", "-" + localIndex };
ResolveClusterActionRequest request = new ResolveClusterActionRequest(indexExpressions);
ActionFuture<ResolveClusterActionResponse> future = client(LOCAL_CLUSTER).admin()
.indices()
.execute(TransportResolveClusterAction.TYPE, request);
ResolveClusterActionResponse response = future.actionGet(10, TimeUnit.SECONDS);
assertNotNull(response);
Map<String, ResolveClusterInfo> clusterInfo = response.getResolveClusterInfo();
assertEquals(2, clusterInfo.size());
Set<String> expectedClusterNames = Set.of(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY, REMOTE_CLUSTER_2);
assertThat(clusterInfo.keySet(), equalTo(expectedClusterNames));
ResolveClusterInfo remote2 = clusterInfo.get(REMOTE_CLUSTER_2);
assertThat(remote2.isConnected(), equalTo(true));
assertThat(remote2.getSkipUnavailable(), equalTo(true));
assertThat(remote2.getMatchingIndices(), equalTo(true));
assertNotNull(remote2.getBuild().version());
assertNull(remote2.getError());
ResolveClusterInfo local = clusterInfo.get(RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY);
assertThat(local.isConnected(), equalTo(true));
assertThat(local.getSkipUnavailable(), equalTo(false));
assertThat(local.getMatchingIndices(), equalTo(false));
assertNotNull(local.getBuild().version());
assertNull(local.getError());
}
}