Skip to content

Commit 652e0ce

Browse files
committed
System data streams incorrectly show up in the list of template validation problems
1 parent a84dff8 commit 652e0ce

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,12 @@ private static void validateDataStreamsStillReferenced(
884884
String templateName,
885885
ComposableIndexTemplate newTemplate
886886
) {
887-
final Set<String> dataStreams = project.dataStreams().keySet();
887+
final Set<String> dataStreams = project.dataStreams()
888+
.entrySet()
889+
.stream()
890+
.filter(entry -> entry.getValue().isSystem() == false)
891+
.map(Map.Entry::getKey)
892+
.collect(Collectors.toSet());
888893

889894
Function<ProjectMetadata, Set<String>> findUnreferencedDataStreams = meta -> {
890895
final Set<String> unreferenced = new HashSet<>();

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.elasticsearch.common.settings.IndexScopedSettings;
2323
import org.elasticsearch.common.settings.Settings;
2424
import org.elasticsearch.common.util.concurrent.ThreadContext;
25+
import org.elasticsearch.core.Strings;
2526
import org.elasticsearch.core.TimeValue;
2627
import org.elasticsearch.env.Environment;
2728
import org.elasticsearch.health.node.selection.HealthNodeTaskExecutor;
@@ -1718,6 +1719,76 @@ public void testInvalidNonDataStreamTemplateWithDataStreamOptions() throws Excep
17181719
);
17191720
}
17201721

1722+
public void testSystemDataStreamsIgnoredByValidateIndexTemplateV2() throws Exception {
1723+
/*
1724+
* This test makes sure that system data streams (which do not have named templates) do not appear in the list of data streams
1725+
* without named templates when validateIndexTemplateV2 fails due to another non-system data stream not having a named template.
1726+
*/
1727+
MetadataIndexTemplateService metadataIndexTemplateService = getMetadataIndexTemplateService();
1728+
final String dataStreamTemplateName = "data_stream_template";
1729+
final String indexTemplateName = "index_template";
1730+
final String systemDataStreamName = "system_ds";
1731+
final String ordinaryDataStreamName = "my_ds";
1732+
final String ordinaryDataStreamIndexPattern = "my_ds*";
1733+
ComposableIndexTemplate highPriorityDataStreamTemplate = ComposableIndexTemplate.builder()
1734+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1735+
.priority(275L)
1736+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(randomBoolean(), randomBoolean()))
1737+
.build();
1738+
ComposableIndexTemplate highPriorityIndexTemplate = ComposableIndexTemplate.builder()
1739+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1740+
.priority(200L)
1741+
.build();
1742+
ProjectMetadata project = ProjectMetadata.builder(randomProjectIdOrDefault())
1743+
.dataStreams(
1744+
Map.of(
1745+
systemDataStreamName,
1746+
DataStreamTestHelper.randomInstance(systemDataStreamName, System::currentTimeMillis, randomBoolean(), true),
1747+
ordinaryDataStreamName,
1748+
DataStreamTestHelper.randomInstance(ordinaryDataStreamName, System::currentTimeMillis, randomBoolean(), false)
1749+
),
1750+
Map.of()
1751+
)
1752+
.indexTemplates(Map.of(dataStreamTemplateName, highPriorityDataStreamTemplate, indexTemplateName, highPriorityIndexTemplate))
1753+
.build();
1754+
ComposableIndexTemplate lowPriorityDataStreamTemplate = ComposableIndexTemplate.builder()
1755+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1756+
.priority(1L)
1757+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(randomBoolean(), randomBoolean()))
1758+
.build();
1759+
/*
1760+
* Here we attempt to change the priority of a template that matches an existing non-system data stream so that it is so low that
1761+
* the data stream matches the index (non data-stream) template instead. We expect an error, but that the error only mentions the
1762+
* non-system data stream.
1763+
*/
1764+
Exception exception = expectThrows(
1765+
Exception.class,
1766+
() -> metadataIndexTemplateService.validateIndexTemplateV2(project, dataStreamTemplateName, lowPriorityDataStreamTemplate)
1767+
);
1768+
assertThat(
1769+
exception.getMessage(),
1770+
containsString(
1771+
Strings.format(
1772+
"composable template [%s] with index patterns [%s], priority [1] would cause data streams [%s] to no longer "
1773+
+ "match a data stream template",
1774+
dataStreamTemplateName,
1775+
ordinaryDataStreamIndexPattern,
1776+
ordinaryDataStreamName
1777+
)
1778+
)
1779+
);
1780+
ComposableIndexTemplate mediumPriorityDataStreamTemplate = ComposableIndexTemplate.builder()
1781+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1782+
.priority(201L)
1783+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(randomBoolean(), randomBoolean()))
1784+
.build();
1785+
/*
1786+
* We have now corrected the problem -- the priority of the new template is lower than the old data stream template but still higher
1787+
* than the non-data-stream index template. So we expect no validation errors.
1788+
*/
1789+
metadataIndexTemplateService.validateIndexTemplateV2(project, dataStreamTemplateName, mediumPriorityDataStreamTemplate);
1790+
}
1791+
17211792
private ProjectMetadata addComponentTemplate(
17221793
MetadataIndexTemplateService service,
17231794
ProjectMetadata project,

test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,11 @@ public static DataStream randomInstance(LongSupplier timeProvider, boolean failu
335335
}
336336

337337
public static DataStream randomInstance(String dataStreamName, LongSupplier timeProvider, boolean failureStore) {
338+
// Some tests don't work well with system data streams, since these data streams require special handling
339+
return randomInstance(dataStreamName, timeProvider, failureStore, false);
340+
}
341+
342+
public static DataStream randomInstance(String dataStreamName, LongSupplier timeProvider, boolean failureStore, boolean system) {
338343
List<Index> indices = randomIndexInstances();
339344
long generation = indices.size() + ESTestCase.randomLongBetween(1, 128);
340345
indices.add(new Index(getDefaultBackingIndexName(dataStreamName, generation), UUIDs.randomBase64UUID(LuceneTestCase.random())));
@@ -360,9 +365,9 @@ public static DataStream randomInstance(String dataStreamName, LongSupplier time
360365
generation,
361366
metadata,
362367
randomSettings(),
363-
randomBoolean(),
368+
system ? true : randomBoolean(),
364369
replicated,
365-
false, // Some tests don't work well with system data streams, since these data streams require special handling
370+
system,
366371
timeProvider,
367372
randomBoolean(),
368373
randomBoolean() ? IndexMode.STANDARD : null, // IndexMode.TIME_SERIES triggers validation that many unit tests doesn't pass

0 commit comments

Comments
 (0)