|
13 | 13 | import org.apache.http.entity.StringEntity; |
14 | 14 | import org.apache.logging.log4j.Level; |
15 | 15 | import org.elasticsearch.ElasticsearchException; |
| 16 | +import org.elasticsearch.action.ResolvedIndexExpression; |
| 17 | +import org.elasticsearch.action.ResolvedIndexExpressions; |
16 | 18 | import org.elasticsearch.action.admin.cluster.reroute.ClusterRerouteUtils; |
17 | 19 | import org.elasticsearch.action.admin.indices.close.CloseIndexRequest; |
18 | 20 | import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; |
|
102 | 104 | import static org.hamcrest.Matchers.greaterThanOrEqualTo; |
103 | 105 | import static org.hamcrest.Matchers.hasKey; |
104 | 106 | import static org.hamcrest.Matchers.hasSize; |
| 107 | +import static org.hamcrest.Matchers.is; |
105 | 108 | import static org.hamcrest.Matchers.not; |
106 | 109 | import static org.hamcrest.Matchers.nullValue; |
107 | 110 |
|
@@ -913,6 +916,170 @@ public void testIndexMode() throws Exception { |
913 | 916 | assertThat(actualIndexModes, equalTo(indexModes)); |
914 | 917 | } |
915 | 918 |
|
| 919 | + public void testResolvedExpressionWithIndexAlias() { |
| 920 | + FieldCapabilitiesResponse response = client().prepareFieldCaps("current").setFields("*").setIncludeResolvedTo(true).get(); |
| 921 | + assertIndices(response, "new_index"); |
| 922 | + |
| 923 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 924 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 925 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 926 | + assertEquals(1, resolvedLocally.expressions().size()); |
| 927 | + ResolvedIndexExpression expression = expressions.get(0); |
| 928 | + assertEquals("current", expression.original()); |
| 929 | + assertThat(expression.localExpressions().indices(), containsInAnyOrder("new_index")); |
| 930 | + } |
| 931 | + |
| 932 | + public void testResolvedExpressionWithWildcard() { |
| 933 | + FieldCapabilitiesResponse response = client().prepareFieldCaps("*index").setFields("*").setIncludeResolvedTo(true).get(); |
| 934 | + assertIndices(response, "new_index", "old_index"); |
| 935 | + |
| 936 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 937 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 938 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 939 | + assertEquals(1, resolvedLocally.expressions().size()); |
| 940 | + ResolvedIndexExpression expression = expressions.get(0); |
| 941 | + assertEquals("*index", expression.original()); |
| 942 | + assertThat(expression.localExpressions().indices(), containsInAnyOrder("new_index", "old_index")); |
| 943 | + } |
| 944 | + |
| 945 | + public void testResolvedExpressionWithClosedIndices() throws IOException { |
| 946 | + // in addition to the existing "old_index" and "new_index", create two where the test query throws an error on rewrite |
| 947 | + assertAcked(prepareCreate("index1-error"), prepareCreate("index2-error")); |
| 948 | + ensureGreen("index1-error", "index2-error"); |
| 949 | + |
| 950 | + // Closed shards will result to index error because shards must be in readable state |
| 951 | + closeShards(internalCluster(), "index1-error", "index2-error"); |
| 952 | + |
| 953 | + FieldCapabilitiesResponse response = client().prepareFieldCaps("old_index", "new_index", "index1-error", "index2-error") |
| 954 | + .setFields("*") |
| 955 | + .setIncludeResolvedTo(true) |
| 956 | + .get(); |
| 957 | + Set<String> openIndices = Set.of("old_index", "new_index"); |
| 958 | + Set<String> closedIndices = Set.of("index1-error", "index2-error"); |
| 959 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 960 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 961 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 962 | + assertEquals(4, resolvedLocally.expressions().size()); |
| 963 | + for (ResolvedIndexExpression expression : expressions) { |
| 964 | + ResolvedIndexExpression.LocalExpressions localExpressions = expression.localExpressions(); |
| 965 | + if (openIndices.contains(expression.original())) { |
| 966 | + assertThat(expression.localExpressions().indices(), containsInAnyOrder(expression.original())); |
| 967 | + assertEquals(ResolvedIndexExpression.LocalIndexResolutionResult.SUCCESS, localExpressions.localIndexResolutionResult()); |
| 968 | + } else if (closedIndices.contains(expression.original())) { |
| 969 | + Set<String> concreteIndices = localExpressions.indices(); |
| 970 | + assertEquals(0, concreteIndices.size()); |
| 971 | + assertEquals( |
| 972 | + ResolvedIndexExpression.LocalIndexResolutionResult.CONCRETE_RESOURCE_NOT_VISIBLE, |
| 973 | + localExpressions.localIndexResolutionResult() |
| 974 | + ); |
| 975 | + } |
| 976 | + } |
| 977 | + } |
| 978 | + |
| 979 | + public void testResolvedExpressionWithAllIndices() { |
| 980 | + FieldCapabilitiesResponse response = client().prepareFieldCaps().setFields("*").setIncludeResolvedTo(true).get(); |
| 981 | + assertIndices(response, "new_index", "old_index"); |
| 982 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 983 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 984 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 985 | + assertEquals(1, resolvedLocally.expressions().size()); |
| 986 | + ResolvedIndexExpression expression = expressions.get(0); |
| 987 | + assertEquals("_all", expression.original()); // not setting indices means _all |
| 988 | + ResolvedIndexExpression.LocalExpressions localExpressions = expression.localExpressions(); |
| 989 | + assertThat(expression.localExpressions().indices(), containsInAnyOrder("new_index", "old_index")); |
| 990 | + assertEquals(ResolvedIndexExpression.LocalIndexResolutionResult.SUCCESS, localExpressions.localIndexResolutionResult()); |
| 991 | + } |
| 992 | + |
| 993 | + public void testResolvedExpressionWithOnlyOneClosedIndexAndIgnoreUnavailable() { |
| 994 | + boolean ignoreUnavailable = true; |
| 995 | + IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false); |
| 996 | + client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet(); |
| 997 | + FieldCapabilitiesResponse response = client().prepareFieldCaps("old_index") |
| 998 | + .setFields("*") |
| 999 | + .setIndicesOptions(options) |
| 1000 | + .setIncludeResolvedTo(true) |
| 1001 | + .get(); |
| 1002 | + |
| 1003 | + assertIndices(response); |
| 1004 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 1005 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 1006 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 1007 | + assertEquals(1, expressions.size()); |
| 1008 | + ResolvedIndexExpression expression = expressions.get(0); |
| 1009 | + assertEquals("old_index", expression.original()); |
| 1010 | + assertEquals(1, resolvedLocally.expressions().size()); |
| 1011 | + ResolvedIndexExpression.LocalExpressions localExpressions = expression.localExpressions(); |
| 1012 | + Set<String> concreteIndices = localExpressions.indices(); |
| 1013 | + assertEquals(0, concreteIndices.size()); |
| 1014 | + assertEquals( |
| 1015 | + ResolvedIndexExpression.LocalIndexResolutionResult.CONCRETE_RESOURCE_NOT_VISIBLE, |
| 1016 | + localExpressions.localIndexResolutionResult() |
| 1017 | + ); |
| 1018 | + } |
| 1019 | + |
| 1020 | + public void testResolvedExpressionWithIndexFilter() throws InterruptedException { |
| 1021 | + assertAcked( |
| 1022 | + prepareCreate("index-1").setMapping("timestamp", "type=date", "field1", "type=keyword"), |
| 1023 | + prepareCreate("index-2").setMapping("timestamp", "type=date", "field1", "type=long") |
| 1024 | + ); |
| 1025 | + |
| 1026 | + List<IndexRequestBuilder> reqs = new ArrayList<>(); |
| 1027 | + reqs.add(prepareIndex("index-1").setSource("timestamp", "2015-07-08")); |
| 1028 | + reqs.add(prepareIndex("index-1").setSource("timestamp", "2018-07-08")); |
| 1029 | + reqs.add(prepareIndex("index-2").setSource("timestamp", "2019-10-12")); |
| 1030 | + reqs.add(prepareIndex("index-2").setSource("timestamp", "2020-07-08")); |
| 1031 | + indexRandom(true, reqs); |
| 1032 | + |
| 1033 | + FieldCapabilitiesResponse response = client().prepareFieldCaps("index-*") |
| 1034 | + .setFields("*") |
| 1035 | + .setIndexFilter(QueryBuilders.rangeQuery("timestamp").gte("2019-11-01")) |
| 1036 | + .setIncludeResolvedTo(true) |
| 1037 | + .get(); |
| 1038 | + |
| 1039 | + assertIndices(response, "index-2"); |
| 1040 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 1041 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 1042 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 1043 | + assertEquals(1, resolvedLocally.expressions().size()); |
| 1044 | + ResolvedIndexExpression expression = expressions.get(0); |
| 1045 | + assertEquals("index-*", expression.original()); |
| 1046 | + assertThat(expression.localExpressions().indices(), containsInAnyOrder("index-1", "index-2")); |
| 1047 | + } |
| 1048 | + |
| 1049 | + public void testNoneExpressionIndices() { |
| 1050 | + // The auth code injects the pattern ["*", "-*"] which effectively means a request that requests no indices |
| 1051 | + FieldCapabilitiesResponse response = client().prepareFieldCaps("*", "-*").setFields("*").get(); |
| 1052 | + |
| 1053 | + assertThat(response.getIndices().length, is(0)); |
| 1054 | + } |
| 1055 | + |
| 1056 | + public void testExclusion() { |
| 1057 | + assertAcked(prepareCreate("index-2024"), prepareCreate("index-2025")); |
| 1058 | + |
| 1059 | + prepareIndex("index-2024").setSource("timestamp", "2024", "f1", "1").get(); |
| 1060 | + prepareIndex("index-2025").setSource("timestamp", "2025", "f2", "2").get(); |
| 1061 | + |
| 1062 | + var response = client().prepareFieldCaps("index-*", "-*2025").setFields("*").get(); |
| 1063 | + assertIndices(response, "index-2024"); |
| 1064 | + } |
| 1065 | + |
| 1066 | + public void testExclusionWithResolvedTo() { |
| 1067 | + assertAcked(prepareCreate("index-2024"), prepareCreate("index-2025")); |
| 1068 | + |
| 1069 | + prepareIndex("index-2024").setSource("timestamp", "2024", "f1", "1").get(); |
| 1070 | + prepareIndex("index-2025").setSource("timestamp", "2025", "f2", "2").get(); |
| 1071 | + |
| 1072 | + var response = client().prepareFieldCaps("index-*", "-*2025").setFields("*").setIncludeResolvedTo(true).get(); |
| 1073 | + assertIndices(response, "index-2024"); |
| 1074 | + assertEquals(0, response.getResolvedRemotely().size()); |
| 1075 | + ResolvedIndexExpressions resolvedLocally = response.getResolvedLocally(); |
| 1076 | + List<ResolvedIndexExpression> expressions = resolvedLocally.expressions(); |
| 1077 | + assertEquals(1, resolvedLocally.expressions().size()); |
| 1078 | + ResolvedIndexExpression expression = expressions.get(0); |
| 1079 | + assertEquals("index-*", expression.original()); |
| 1080 | + assertThat(expression.localExpressions().indices(), containsInAnyOrder("index-2024", "index-2025")); |
| 1081 | + } |
| 1082 | + |
916 | 1083 | private void assertIndices(FieldCapabilitiesResponse response, String... indices) { |
917 | 1084 | assertNotNull(response.getIndices()); |
918 | 1085 | Arrays.sort(indices); |
|
0 commit comments