|
13 | 13 | import org.elasticsearch.action.admin.indices.diskusage.TransportAnalyzeIndexDiskUsageAction; |
14 | 14 | import org.elasticsearch.action.admin.indices.forcemerge.ForceMergeRequest; |
15 | 15 | import org.elasticsearch.action.admin.indices.get.GetIndexRequest; |
| 16 | +import org.elasticsearch.action.admin.indices.get.GetIndexResponse; |
16 | 17 | import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; |
17 | 18 | import org.elasticsearch.action.admin.indices.rollover.RolloverRequest; |
18 | 19 | import org.elasticsearch.action.admin.indices.segments.IndicesSegmentsRequest; |
19 | 20 | import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequest; |
20 | 21 | import org.elasticsearch.action.admin.indices.template.put.PutComponentTemplateAction; |
21 | 22 | import org.elasticsearch.action.admin.indices.template.put.TransportPutComposableIndexTemplateAction; |
22 | 23 | import org.elasticsearch.action.bulk.BulkRequest; |
| 24 | +import org.elasticsearch.action.bulk.BulkRequestBuilder; |
| 25 | +import org.elasticsearch.action.bulk.BulkResponse; |
23 | 26 | import org.elasticsearch.action.bulk.IndexDocFailureStoreStatus; |
24 | 27 | import org.elasticsearch.action.get.GetRequest; |
25 | 28 | import org.elasticsearch.action.index.IndexRequest; |
26 | 29 | import org.elasticsearch.action.search.SearchRequest; |
27 | 30 | import org.elasticsearch.action.support.WriteRequest; |
28 | 31 | import org.elasticsearch.cluster.metadata.ComponentTemplate; |
29 | 32 | import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; |
| 33 | +import org.elasticsearch.cluster.metadata.IndexMetadata; |
30 | 34 | import org.elasticsearch.cluster.metadata.Template; |
31 | 35 | import org.elasticsearch.common.Strings; |
32 | 36 | import org.elasticsearch.common.compress.CompressedXContent; |
33 | 37 | import org.elasticsearch.common.settings.Settings; |
34 | 38 | import org.elasticsearch.common.time.DateFormatter; |
35 | 39 | import org.elasticsearch.common.time.FormatNames; |
36 | 40 | import org.elasticsearch.common.xcontent.XContentHelper; |
| 41 | +import org.elasticsearch.index.IndexMode; |
37 | 42 | import org.elasticsearch.index.IndexSettings; |
38 | 43 | import org.elasticsearch.index.query.RangeQueryBuilder; |
| 44 | +import org.elasticsearch.index.reindex.BulkByScrollResponse; |
| 45 | +import org.elasticsearch.index.reindex.ReindexAction; |
| 46 | +import org.elasticsearch.index.reindex.ReindexRequest; |
39 | 47 | import org.elasticsearch.indices.InvalidIndexTemplateException; |
40 | 48 | import org.elasticsearch.plugins.Plugin; |
| 49 | +import org.elasticsearch.reindex.ReindexPlugin; |
41 | 50 | import org.elasticsearch.rest.RestStatus; |
42 | 51 | import org.elasticsearch.search.builder.SearchSourceBuilder; |
43 | 52 | import org.elasticsearch.test.ESSingleNodeTestCase; |
|
53 | 62 |
|
54 | 63 | import static org.elasticsearch.test.MapMatcher.assertMap; |
55 | 64 | import static org.elasticsearch.test.MapMatcher.matchesMap; |
| 65 | +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; |
56 | 66 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertResponse; |
57 | 67 | import static org.hamcrest.Matchers.containsString; |
58 | 68 | import static org.hamcrest.Matchers.equalTo; |
@@ -98,7 +108,7 @@ public class TSDBIndexingIT extends ESSingleNodeTestCase { |
98 | 108 |
|
99 | 109 | @Override |
100 | 110 | protected Collection<Class<? extends Plugin>> getPlugins() { |
101 | | - return List.of(DataStreamsPlugin.class, InternalSettingsPlugin.class); |
| 111 | + return List.of(DataStreamsPlugin.class, InternalSettingsPlugin.class, ReindexPlugin.class); |
102 | 112 | } |
103 | 113 |
|
104 | 114 | @Override |
@@ -557,6 +567,60 @@ public void testTrimId() throws Exception { |
557 | 567 | }); |
558 | 568 | } |
559 | 569 |
|
| 570 | + public void testReindexing() throws Exception { |
| 571 | + String dataStreamName = "my-ds"; |
| 572 | + String reindexedDataStreamName = "my-reindexed-ds"; |
| 573 | + var putTemplateRequest = new TransportPutComposableIndexTemplateAction.Request("id"); |
| 574 | + putTemplateRequest.indexTemplate( |
| 575 | + ComposableIndexTemplate.builder() |
| 576 | + .indexPatterns(List.of(dataStreamName, reindexedDataStreamName)) |
| 577 | + .template( |
| 578 | + new Template( |
| 579 | + Settings.builder().put("index.mode", "time_series").build(), |
| 580 | + new CompressedXContent(MAPPING_TEMPLATE), |
| 581 | + null |
| 582 | + ) |
| 583 | + ) |
| 584 | + .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(false, false)) |
| 585 | + .build() |
| 586 | + ); |
| 587 | + assertAcked(client().execute(TransportPutComposableIndexTemplateAction.TYPE, putTemplateRequest)); |
| 588 | + |
| 589 | + // index doc |
| 590 | + long docCount = randomLongBetween(10, 50); |
| 591 | + Instant startTime = Instant.now(); |
| 592 | + BulkRequestBuilder bulkRequestBuilder = client().prepareBulk(); |
| 593 | + bulkRequestBuilder.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); |
| 594 | + for (int i = 0; i < docCount; i++) { |
| 595 | + IndexRequest indexRequest = new IndexRequest(dataStreamName).opType(DocWriteRequest.OpType.CREATE); |
| 596 | + indexRequest.source(DOC.replace("$time", formatInstant(startTime.plusSeconds(i))), XContentType.JSON); |
| 597 | + bulkRequestBuilder.add(indexRequest); |
| 598 | + } |
| 599 | + BulkResponse bulkResponse = bulkRequestBuilder.get(); |
| 600 | + assertThat(bulkResponse.hasFailures(), is(false)); |
| 601 | + |
| 602 | + BulkByScrollResponse reindexResponse = safeGet( |
| 603 | + client().execute( |
| 604 | + ReindexAction.INSTANCE, |
| 605 | + new ReindexRequest().setSourceIndices(dataStreamName).setDestIndex(reindexedDataStreamName).setDestOpType("create") |
| 606 | + ) |
| 607 | + ); |
| 608 | + assertThat(reindexResponse.getCreated(), equalTo(docCount)); |
| 609 | + |
| 610 | + GetIndexResponse getIndexResponse = safeGet( |
| 611 | + indicesAdmin().getIndex(new GetIndexRequest().indices(dataStreamName, reindexedDataStreamName)) |
| 612 | + ); |
| 613 | + assertThat(getIndexResponse.getIndices().length, equalTo(2)); |
| 614 | + var index1 = getIndexResponse.getIndices()[0]; |
| 615 | + var index2 = getIndexResponse.getIndices()[1]; |
| 616 | + assertThat(getIndexResponse.getSetting(index1, IndexSettings.MODE.getKey()), equalTo(IndexMode.TIME_SERIES.getName())); |
| 617 | + assertThat(getIndexResponse.getSetting(index2, IndexSettings.MODE.getKey()), equalTo(IndexMode.TIME_SERIES.getName())); |
| 618 | + assertThat( |
| 619 | + getIndexResponse.getSetting(index2, IndexMetadata.INDEX_ROUTING_PATH.getKey()), |
| 620 | + equalTo(getIndexResponse.getSetting(index1, IndexMetadata.INDEX_ROUTING_PATH.getKey())) |
| 621 | + ); |
| 622 | + } |
| 623 | + |
560 | 624 | static String formatInstant(Instant instant) { |
561 | 625 | return DateFormatter.forPattern(FormatNames.STRICT_DATE_OPTIONAL_TIME.getName()).format(instant); |
562 | 626 | } |
|
0 commit comments