|
16 | 16 | * specific language governing permissions and limitations
|
17 | 17 | * under the License.
|
18 | 18 | */
|
19 |
| - |
20 | 19 | package org.elasticsearch.indices;
|
21 | 20 |
|
| 21 | +import org.elasticsearch.action.ActionRequestBuilder; |
22 | 22 | import org.elasticsearch.action.DocWriteRequest;
|
23 | 23 | import org.elasticsearch.action.admin.indices.datastream.CreateDataStreamAction;
|
24 | 24 | import org.elasticsearch.action.admin.indices.datastream.DeleteDataStreamAction;
|
|
28 | 28 | import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
|
29 | 29 | import org.elasticsearch.action.admin.indices.rollover.RolloverRequest;
|
30 | 30 | import org.elasticsearch.action.admin.indices.rollover.RolloverResponse;
|
| 31 | +import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequestBuilder; |
| 32 | +import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryResponse; |
31 | 33 | import org.elasticsearch.action.bulk.BulkRequest;
|
32 | 34 | import org.elasticsearch.action.bulk.BulkResponse;
|
33 | 35 | import org.elasticsearch.action.delete.DeleteRequest;
|
34 | 36 | import org.elasticsearch.action.index.IndexRequest;
|
35 | 37 | import org.elasticsearch.action.index.IndexResponse;
|
| 38 | +import org.elasticsearch.action.search.MultiSearchRequestBuilder; |
| 39 | +import org.elasticsearch.action.search.MultiSearchResponse; |
36 | 40 | import org.elasticsearch.action.search.SearchRequest;
|
| 41 | +import org.elasticsearch.action.search.SearchRequestBuilder; |
37 | 42 | import org.elasticsearch.action.search.SearchResponse;
|
38 | 43 | import org.elasticsearch.action.update.UpdateRequest;
|
39 | 44 | import org.elasticsearch.cluster.metadata.DataStream;
|
|
46 | 51 | import java.util.Comparator;
|
47 | 52 | import java.util.List;
|
48 | 53 |
|
| 54 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT._flush; |
| 55 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.clearCache; |
| 56 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.getAliases; |
| 57 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.getFieldMapping; |
| 58 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.getMapping; |
| 59 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.getSettings; |
| 60 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.health; |
| 61 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.indicesStats; |
| 62 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.msearch; |
| 63 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.refreshBuilder; |
| 64 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.search; |
| 65 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.segments; |
| 66 | +import static org.elasticsearch.indices.IndicesOptionsIntegrationIT.validateQuery; |
| 67 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; |
49 | 68 | import static org.hamcrest.Matchers.equalTo;
|
| 69 | +import static org.hamcrest.Matchers.instanceOf; |
50 | 70 | import static org.hamcrest.Matchers.is;
|
51 | 71 | import static org.hamcrest.Matchers.notNullValue;
|
52 | 72 |
|
@@ -179,6 +199,96 @@ public void testOtherWriteOps() throws Exception {
|
179 | 199 | }
|
180 | 200 | }
|
181 | 201 |
|
| 202 | + public void testDataStreamsResolvability() { |
| 203 | + String dataStreamName = "logs-foobar"; |
| 204 | + CreateDataStreamAction.Request request = new CreateDataStreamAction.Request(dataStreamName); |
| 205 | + request.setTimestampFieldName("ts"); |
| 206 | + client().admin().indices().createDataStream(request).actionGet(); |
| 207 | + |
| 208 | + verifyResolvability(dataStreamName, client().prepareIndex(dataStreamName, "_doc") |
| 209 | + .setSource("{}", XContentType.JSON) |
| 210 | + .setOpType(DocWriteRequest.OpType.CREATE), |
| 211 | + false); |
| 212 | + verifyResolvability(dataStreamName, refreshBuilder(dataStreamName), false); |
| 213 | + verifyResolvability(dataStreamName, search(dataStreamName), false, 1); |
| 214 | + verifyResolvability(dataStreamName, msearch(null, dataStreamName), false); |
| 215 | + verifyResolvability(dataStreamName, clearCache(dataStreamName), false); |
| 216 | + verifyResolvability(dataStreamName, _flush(dataStreamName),false); |
| 217 | + verifyResolvability(dataStreamName, segments(dataStreamName), false); |
| 218 | + verifyResolvability(dataStreamName, indicesStats(dataStreamName), false); |
| 219 | + verifyResolvability(dataStreamName, IndicesOptionsIntegrationIT.forceMerge(dataStreamName), false); |
| 220 | + verifyResolvability(dataStreamName, validateQuery(dataStreamName), false); |
| 221 | + verifyResolvability(dataStreamName, client().admin().indices().prepareUpgrade(dataStreamName), false); |
| 222 | + verifyResolvability(dataStreamName, client().admin().indices().prepareRecoveries(dataStreamName), false); |
| 223 | + verifyResolvability(dataStreamName, client().admin().indices().prepareUpgradeStatus(dataStreamName), false); |
| 224 | + verifyResolvability(dataStreamName, getAliases(dataStreamName), true); |
| 225 | + verifyResolvability(dataStreamName, getFieldMapping(dataStreamName), true); |
| 226 | + verifyResolvability(dataStreamName, getMapping(dataStreamName), true); |
| 227 | + verifyResolvability(dataStreamName, getSettings(dataStreamName), true); |
| 228 | + verifyResolvability(dataStreamName, health(dataStreamName), false); |
| 229 | + |
| 230 | + request = new CreateDataStreamAction.Request("logs-barbaz"); |
| 231 | + request.setTimestampFieldName("ts"); |
| 232 | + client().admin().indices().createDataStream(request).actionGet(); |
| 233 | + verifyResolvability("logs-barbaz", client().prepareIndex("logs-barbaz", "_doc") |
| 234 | + .setSource("{}", XContentType.JSON) |
| 235 | + .setOpType(DocWriteRequest.OpType.CREATE), |
| 236 | + false); |
| 237 | + |
| 238 | + String wildcardExpression = "logs*"; |
| 239 | + verifyResolvability(wildcardExpression, refreshBuilder(wildcardExpression), false); |
| 240 | + verifyResolvability(wildcardExpression, search(wildcardExpression), false, 2); |
| 241 | + verifyResolvability(wildcardExpression, msearch(null, wildcardExpression), false); |
| 242 | + verifyResolvability(wildcardExpression, clearCache(wildcardExpression), false); |
| 243 | + verifyResolvability(wildcardExpression, _flush(wildcardExpression),false); |
| 244 | + verifyResolvability(wildcardExpression, segments(wildcardExpression), false); |
| 245 | + verifyResolvability(wildcardExpression, indicesStats(wildcardExpression), false); |
| 246 | + verifyResolvability(wildcardExpression, IndicesOptionsIntegrationIT.forceMerge(wildcardExpression), false); |
| 247 | + verifyResolvability(wildcardExpression, validateQuery(wildcardExpression), false); |
| 248 | + verifyResolvability(wildcardExpression, client().admin().indices().prepareUpgrade(wildcardExpression), false); |
| 249 | + verifyResolvability(wildcardExpression, client().admin().indices().prepareRecoveries(wildcardExpression), false); |
| 250 | + verifyResolvability(wildcardExpression, client().admin().indices().prepareUpgradeStatus(wildcardExpression), false); |
| 251 | + verifyResolvability(wildcardExpression, getAliases(wildcardExpression), true); |
| 252 | + verifyResolvability(wildcardExpression, getFieldMapping(wildcardExpression), true); |
| 253 | + verifyResolvability(wildcardExpression, getMapping(wildcardExpression), true); |
| 254 | + verifyResolvability(wildcardExpression, getSettings(wildcardExpression), true); |
| 255 | + verifyResolvability(wildcardExpression, health(wildcardExpression), false); |
| 256 | + } |
| 257 | + |
| 258 | + private static void verifyResolvability(String dataStream, ActionRequestBuilder requestBuilder, boolean fail) { |
| 259 | + verifyResolvability(dataStream, requestBuilder, fail, 0); |
| 260 | + } |
| 261 | + |
| 262 | + private static void verifyResolvability(String dataStream, ActionRequestBuilder requestBuilder, boolean fail, long expectedCount) { |
| 263 | + if (fail) { |
| 264 | + String expectedErrorMessage = "The provided expression [" + dataStream + |
| 265 | + "] matches a data stream, specify the corresponding concrete indices instead."; |
| 266 | + if (requestBuilder instanceof MultiSearchRequestBuilder) { |
| 267 | + MultiSearchResponse multiSearchResponse = ((MultiSearchRequestBuilder) requestBuilder).get(); |
| 268 | + assertThat(multiSearchResponse.getResponses().length, equalTo(1)); |
| 269 | + assertThat(multiSearchResponse.getResponses()[0].isFailure(), is(true)); |
| 270 | + assertThat(multiSearchResponse.getResponses()[0].getFailure(), instanceOf(IllegalArgumentException.class)); |
| 271 | + assertThat(multiSearchResponse.getResponses()[0].getFailure().getMessage(), equalTo(expectedErrorMessage)); |
| 272 | + } else if (requestBuilder instanceof ValidateQueryRequestBuilder) { |
| 273 | + ValidateQueryResponse response = (ValidateQueryResponse) requestBuilder.get(); |
| 274 | + assertThat(response.getQueryExplanation().get(0).getError(), equalTo(expectedErrorMessage)); |
| 275 | + } else { |
| 276 | + Exception e = expectThrows(IllegalArgumentException.class, requestBuilder::get); |
| 277 | + assertThat(e.getMessage(), equalTo(expectedErrorMessage)); |
| 278 | + } |
| 279 | + } else { |
| 280 | + if (requestBuilder instanceof SearchRequestBuilder) { |
| 281 | + SearchRequestBuilder searchRequestBuilder = (SearchRequestBuilder) requestBuilder; |
| 282 | + assertHitCount(searchRequestBuilder.get(), expectedCount); |
| 283 | + } else if (requestBuilder instanceof MultiSearchRequestBuilder) { |
| 284 | + MultiSearchResponse multiSearchResponse = ((MultiSearchRequestBuilder) requestBuilder).get(); |
| 285 | + assertThat(multiSearchResponse.getResponses()[0].isFailure(), is(false)); |
| 286 | + } else { |
| 287 | + requestBuilder.get(); |
| 288 | + } |
| 289 | + } |
| 290 | + } |
| 291 | + |
182 | 292 | private static void indexDocs(String dataStream, int numDocs) {
|
183 | 293 | BulkRequest bulkRequest = new BulkRequest();
|
184 | 294 | for (int i = 0; i < numDocs; i++) {
|
|
0 commit comments