diff --git a/modules/reindex/src/main/java/org/elasticsearch/reindex/Reindexer.java b/modules/reindex/src/main/java/org/elasticsearch/reindex/Reindexer.java index 4db59ddf15427..538c6ccd93cb2 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/reindex/Reindexer.java +++ b/modules/reindex/src/main/java/org/elasticsearch/reindex/Reindexer.java @@ -30,10 +30,12 @@ import org.elasticsearch.client.internal.ParentTaskAssigningClient; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.MetadataIndexTemplateService; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.lucene.uid.Versions; +import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.VersionType; @@ -226,9 +228,20 @@ static class AsyncIndexBySearchAction extends AbstractAsyncBulkByScrollAction { public void testEmptyStateCopiesId() throws Exception { @@ -34,15 +39,31 @@ public void testEmptyStateCopiesId() throws Exception { } public void testStandardIndexCopiesId() throws Exception { - Settings.Builder settings = Settings.builder().put(IndexSettings.MODE.getKey(), IndexMode.STANDARD); - assertThat(action(stateWithIndex(settings)).buildRequest(doc()).getId(), equalTo(doc().getId())); + assertThat(action(stateWithIndex(standardSettings())).buildRequest(doc()).getId(), equalTo(doc().getId())); } public void testTsdbIndexClearsId() throws Exception { - Settings.Builder settings = Settings.builder() - .put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) - .put(IndexMetadata.INDEX_ROUTING_PATH.getKey(), "foo"); - assertThat(action(stateWithIndex(settings)).buildRequest(doc()).getId(), nullValue()); + assertThat(action(stateWithIndex(tsdbSettings())).buildRequest(doc()).getId(), nullValue()); + } + + public void testMissingIndexWithStandardTemplateCopiesId() throws Exception { + assertThat(action(stateWithTemplate(standardSettings())).buildRequest(doc()).getId(), equalTo(doc().getId())); + } + + public void testMissingIndexWithTsdbTemplateClearsId() throws Exception { + assertThat(action(stateWithTemplate(tsdbSettings())).buildRequest(doc()).getId(), nullValue()); + } + + private ClusterState stateWithTemplate(Settings.Builder settings) { + Metadata.Builder metadata = Metadata.builder(); + Template template = new Template(settings.build(), null, null); + if (randomBoolean()) { + metadata.put("c", new ComponentTemplate(template, null, null)); + metadata.put("c", new ComposableIndexTemplate(List.of("dest_index"), null, List.of("c"), null, null, null)); + } else { + metadata.put("c", new ComposableIndexTemplate(List.of("dest_index"), template, null, null, null, null)); + } + return ClusterState.builder(ClusterState.EMPTY_STATE).metadata(metadata).build(); } private ClusterState stateWithIndex(Settings.Builder settings) { @@ -53,6 +74,19 @@ private ClusterState stateWithIndex(Settings.Builder settings) { return ClusterState.builder(ClusterState.EMPTY_STATE).metadata(Metadata.builder(Metadata.EMPTY_METADATA).put(meta)).build(); } + private Settings.Builder standardSettings() { + if (randomBoolean()) { + return Settings.builder(); + } + return Settings.builder().put(IndexSettings.MODE.getKey(), IndexMode.STANDARD); + } + + private Settings.Builder tsdbSettings() { + return Settings.builder() + .put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) + .put(IndexMetadata.INDEX_ROUTING_PATH.getKey(), "foo"); + } + private ScrollableHitSource.BasicHit doc() { return new ScrollableHitSource.BasicHit("index", "id", -1).setSource(new BytesArray("{}"), XContentType.JSON); } diff --git a/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexMetadataTests.java b/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexMetadataTests.java index 2ac2faeb49502..a24536a7502c0 100644 --- a/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexMetadataTests.java +++ b/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexMetadataTests.java @@ -63,7 +63,9 @@ protected TestAction action() { @Override protected ReindexRequest request() { - return new ReindexRequest(); + ReindexRequest request = new ReindexRequest(); + request.getDestination().index("test"); + return request; } private class TestAction extends Reindexer.AsyncIndexBySearchAction { diff --git a/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexScriptTests.java b/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexScriptTests.java index 077c3b5cbf458..a3d2bceacb212 100644 --- a/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexScriptTests.java +++ b/modules/reindex/src/test/java/org/elasticsearch/reindex/ReindexScriptTests.java @@ -77,7 +77,9 @@ public void testSetRouting() throws Exception { @Override protected ReindexRequest request() { - return new ReindexRequest(); + ReindexRequest request = new ReindexRequest(); + request.getDestination().index("test"); + return request; } @Override diff --git a/modules/reindex/src/yamlRestTest/resources/rest-api-spec/test/reindex/100_tsdb.yml b/modules/reindex/src/yamlRestTest/resources/rest-api-spec/test/reindex/100_tsdb.yml index 4ba78db0d678a..a3cb1210060c3 100644 --- a/modules/reindex/src/yamlRestTest/resources/rest-api-spec/test/reindex/100_tsdb.yml +++ b/modules/reindex/src/yamlRestTest/resources/rest-api-spec/test/reindex/100_tsdb.yml @@ -399,3 +399,96 @@ from tsdb to tsdb modifying dimension: - match: {hits.hits.1._source.@timestamp: 2021-04-28T18:50:23.142Z} - match: {hits.hits.2._source.@timestamp: 2021-04-28T18:50:53.142Z} - match: {hits.hits.3._source.@timestamp: 2021-04-28T18:51:03.142Z} + +--- +from tsdb to tsdb created by template while modifying dimension: + - skip: + version: " - 8.2.99" + reason: introduced in 8.3.0 + + - do: + cluster.put_component_template: + name: test-component-template + body: + template: + settings: + index: + mode: time_series + routing_path: [metricset, k8s.pod.uid] + number_of_replicas: 0 + number_of_shards: 2 + mappings: + properties: + "@timestamp": + type: date + metricset: + type: keyword + time_series_dimension: true + k8s: + properties: + pod: + properties: + uid: + type: keyword + time_series_dimension: true + name: + type: keyword + ip: + type: ip + network: + properties: + tx: + type: long + rx: + type: long + - do: + indices.put_index_template: + name: test-composable-1 + body: + index_patterns: + - tsdb_templated_* + composed_of: + - test-component-template + + - do: + reindex: + refresh: true + body: + source: + index: tsdb + dest: + index: tsdb_templated_new + script: + source: ctx._source["metricset"] = "bubbles" + - match: {created: 4} + - match: {updated: 0} + - match: {version_conflicts: 0} + - match: {batches: 1} + - match: {failures: []} + - match: {throttled_millis: 0} + - gte: { took: 0 } + - is_false: task + - is_false: deleted + + - do: + indices.refresh: {} + + - do: + search: + index: tsdb_templated_new + body: + sort: '@timestamp' + aggs: + tsids: + terms: + field: _tsid + order: + _key: asc + + - match: {hits.total.value: 4} + - match: {aggregations.tsids.buckets.0.key: {k8s.pod.uid: 1c4fc7b8-93b7-4ba8-b609-2a48af2f8e39, metricset: bubbles}} + - match: {aggregations.tsids.buckets.0.doc_count: 4} + - match: {hits.hits.0._source.@timestamp: 2021-04-28T18:50:03.142Z} + - match: {hits.hits.1._source.@timestamp: 2021-04-28T18:50:23.142Z} + - match: {hits.hits.2._source.@timestamp: 2021-04-28T18:50:53.142Z} + - match: {hits.hits.3._source.@timestamp: 2021-04-28T18:51:03.142Z}