|
@@ -631,6 +631,92 @@ public class MetadataRolloverServiceTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void testRolloverDataStreamWorksWithTemplateThatAlsoCreatesAliases() throws Exception {
|
|
|
+ final DataStream dataStream = DataStreamTestHelper.randomInstance()
|
|
|
+ // ensure no replicate data stream
|
|
|
+ .promoteDataStream();
|
|
|
+ ComposableIndexTemplate template = new ComposableIndexTemplate.Builder().indexPatterns(List.of(dataStream.getName() + "*"))
|
|
|
+ .template(new Template(null, null, Map.of("my-alias", AliasMetadata.newAliasMetadataBuilder("my-alias").build())))
|
|
|
+ .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate()).build();
|
|
|
+ Metadata.Builder builder = Metadata.builder();
|
|
|
+ builder.put("template", template);
|
|
|
+ for (Index index : dataStream.getIndices()) {
|
|
|
+ builder.put(DataStreamTestHelper.getIndexMetadataBuilderForIndex(index));
|
|
|
+ }
|
|
|
+ builder.put(dataStream);
|
|
|
+ final ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metadata(builder).build();
|
|
|
+
|
|
|
+ ThreadPool testThreadPool = new TestThreadPool(getTestName());
|
|
|
+ try {
|
|
|
+ DateFieldMapper dateFieldMapper
|
|
|
+ = new DateFieldMapper.Builder("@timestamp", DateFieldMapper.Resolution.MILLISECONDS, null, false, Version.CURRENT)
|
|
|
+ .build(new ContentPath());
|
|
|
+ MappedFieldType mockedTimestampFieldType = mock(MappedFieldType.class);
|
|
|
+ when(mockedTimestampFieldType.name()).thenReturn("_data_stream_timestamp");
|
|
|
+ MetadataFieldMapper mockedTimestampField = new MetadataFieldMapper(mockedTimestampFieldType) {
|
|
|
+ @Override
|
|
|
+ protected String contentType() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ MappingLookup mappingLookup = new MappingLookup(
|
|
|
+ Mapping.EMPTY,
|
|
|
+ List.of(mockedTimestampField, dateFieldMapper),
|
|
|
+ List.of(),
|
|
|
+ List.of(),
|
|
|
+ null,
|
|
|
+ null,
|
|
|
+ null);
|
|
|
+ ClusterService clusterService = ClusterServiceUtils.createClusterService(testThreadPool);
|
|
|
+ Environment env = mock(Environment.class);
|
|
|
+ when(env.sharedDataFile()).thenReturn(null);
|
|
|
+ AllocationService allocationService = mock(AllocationService.class);
|
|
|
+ when(allocationService.reroute(any(ClusterState.class), any(String.class))).then(i -> i.getArguments()[0]);
|
|
|
+ DocumentMapper documentMapper = mock(DocumentMapper.class);
|
|
|
+ when(documentMapper.mappers()).thenReturn(mappingLookup);
|
|
|
+ when(documentMapper.type()).thenReturn("_doc");
|
|
|
+ CompressedXContent mapping =
|
|
|
+ new CompressedXContent("{\"_doc\":" + generateMapping(dataStream.getTimeStampField().getName(), "date") + "}");
|
|
|
+ when(documentMapper.mappingSource()).thenReturn(mapping);
|
|
|
+ RoutingFieldMapper routingFieldMapper = mock(RoutingFieldMapper.class);
|
|
|
+ when(routingFieldMapper.required()).thenReturn(false);
|
|
|
+ when(documentMapper.routingFieldMapper()).thenReturn(routingFieldMapper);
|
|
|
+ IndicesService indicesService = mockIndicesServices(documentMapper);
|
|
|
+ IndexNameExpressionResolver mockIndexNameExpressionResolver = mock(IndexNameExpressionResolver.class);
|
|
|
+ when(mockIndexNameExpressionResolver.resolveDateMathExpression(any())).then(returnsFirstArg());
|
|
|
+
|
|
|
+ ShardLimitValidator shardLimitValidator = new ShardLimitValidator(Settings.EMPTY, clusterService);
|
|
|
+ MetadataCreateIndexService createIndexService = new MetadataCreateIndexService(Settings.EMPTY,
|
|
|
+ clusterService, indicesService, allocationService, new AliasValidator(), shardLimitValidator, env,
|
|
|
+ IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, new SystemIndices(Map.of()), false);
|
|
|
+ MetadataIndexAliasesService indexAliasesService = new MetadataIndexAliasesService(clusterService, indicesService,
|
|
|
+ new AliasValidator(), null, xContentRegistry());
|
|
|
+ MetadataRolloverService rolloverService = new MetadataRolloverService(testThreadPool, createIndexService, indexAliasesService,
|
|
|
+ mockIndexNameExpressionResolver);
|
|
|
+
|
|
|
+ MaxDocsCondition condition = new MaxDocsCondition(randomNonNegativeLong());
|
|
|
+ List<Condition<?>> metConditions = Collections.singletonList(condition);
|
|
|
+ CreateIndexRequest createIndexRequest = new CreateIndexRequest("_na_");
|
|
|
+
|
|
|
+ // Ensure that a warning header is emitted
|
|
|
+ MetadataRolloverService.RolloverResult rolloverResult =
|
|
|
+ rolloverService.rolloverClusterState(clusterState, dataStream.getName(), null, createIndexRequest, metConditions,
|
|
|
+ randomBoolean(), false);
|
|
|
+ assertWarnings(
|
|
|
+ "aliases [my-alias] cannot refer to backing indices of data streams",
|
|
|
+ "template [template] has alias and data stream definitions"
|
|
|
+ );
|
|
|
+
|
|
|
+ // Just checking that the rollover was successful:
|
|
|
+ String sourceIndexName = DataStream.getDefaultBackingIndexName(dataStream.getName(), dataStream.getGeneration());
|
|
|
+ String newIndexName = DataStream.getDefaultBackingIndexName(dataStream.getName(), dataStream.getGeneration() + 1);
|
|
|
+ assertEquals(sourceIndexName, rolloverResult.sourceIndexName);
|
|
|
+ assertEquals(newIndexName, rolloverResult.rolloverIndexName);
|
|
|
+ } finally {
|
|
|
+ testThreadPool.shutdown();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public void testValidation() throws Exception {
|
|
|
final String rolloverTarget;
|
|
|
final String sourceIndexName;
|