diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/TransportGetDataStreamsActionTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/TransportGetDataStreamsActionTests.java index c6facb8a03f3d..41bd3c2ad1454 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/TransportGetDataStreamsActionTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/TransportGetDataStreamsActionTests.java @@ -11,6 +11,7 @@ import org.elasticsearch.action.datastreams.GetDataStreamAction; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterState; +import org.elasticsearch.cluster.metadata.ComponentTemplate; import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; import org.elasticsearch.cluster.metadata.DataStream; import org.elasticsearch.cluster.metadata.DataStreamFailureStoreSettings; @@ -40,6 +41,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -543,11 +545,44 @@ public void testGetEffectiveSettingsTemplateOnlySettings() { GetDataStreamAction.Request req = new GetDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] {}); final String templatePolicy = "templatePolicy"; final String templateIndexMode = IndexMode.LOOKUP.getName(); - final String dataStreamPolicy = "dataStreamPolicy"; - final String dataStreamIndexMode = IndexMode.LOGSDB.getName(); ClusterState state = getClusterStateWithDataStreamWithSettings( projectId, + Settings.builder() + .put(IndexMetadata.LIFECYCLE_NAME, templatePolicy) + .put(IndexSettings.MODE.getKey(), templateIndexMode) + .build(), + Settings.EMPTY, + Settings.EMPTY + ); + + GetDataStreamAction.Response response = TransportGetDataStreamsAction.innerOperation( + state.projectState(projectId), + req, + resolver, + systemIndices, + ClusterSettings.createBuiltInClusterSettings(), + dataStreamGlobalRetentionSettings, + emptyDataStreamFailureStoreSettings, + new IndexSettingProviders(Set.of()), + null + ); + assertNotNull(response.getDataStreams()); + assertThat(response.getDataStreams().size(), equalTo(1)); + assertThat(response.getDataStreams().get(0).getIlmPolicy(), equalTo(templatePolicy)); + assertThat(response.getDataStreams().get(0).getIndexModeName(), equalTo(templateIndexMode)); + } + + public void testGetEffectiveSettingsComponentTemplateOnlySettings() { + // Set a lifecycle only in the template, and make sure that is in the response: + ProjectId projectId = randomProjectIdOrDefault(); + GetDataStreamAction.Request req = new GetDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] {}); + final String templatePolicy = "templatePolicy"; + final String templateIndexMode = IndexMode.LOOKUP.getName(); + + ClusterState state = getClusterStateWithDataStreamWithSettings( + projectId, + Settings.EMPTY, Settings.builder() .put(IndexMetadata.LIFECYCLE_NAME, templatePolicy) .put(IndexSettings.MODE.getKey(), templateIndexMode) @@ -582,6 +617,10 @@ public void testGetEffectiveSettings() { // Now set a lifecycle in both the template and the data stream, and make sure the response has the data stream one: ClusterState state = getClusterStateWithDataStreamWithSettings( projectId, + Settings.builder() + .put(IndexMetadata.LIFECYCLE_NAME, templatePolicy) + .put(IndexSettings.MODE.getKey(), templateIndexMode) + .build(), Settings.builder() .put(IndexMetadata.LIFECYCLE_NAME, templatePolicy) .put(IndexSettings.MODE.getKey(), templateIndexMode) @@ -611,6 +650,7 @@ public void testGetEffectiveSettings() { private static ClusterState getClusterStateWithDataStreamWithSettings( ProjectId projectId, Settings templateSettings, + Settings componentTemplateSettings, Settings dataStreamSettings ) { String dataStreamName = "data-stream-1"; @@ -625,8 +665,16 @@ private static ClusterState getClusterStateWithDataStreamWithSettings( .indexPatterns(List.of("*")) .template(Template.builder().settings(templateSettings)) .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate()) + .componentTemplates(List.of("component_template_1")) .build() ); + ComponentTemplate componentTemplate = new ComponentTemplate( + Template.builder().settings(componentTemplateSettings).build(), + null, + null, + null + ); + builder.componentTemplates(Map.of("component_template_1", componentTemplate)); List backingIndices = new ArrayList<>(); for (int backingIndexNumber = 1; backingIndexNumber <= numberOfBackingIndices; backingIndexNumber++) { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java index 72dcbd13e7e00..d6372a8e1b5c0 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java @@ -381,12 +381,7 @@ public ComposableIndexTemplate getEffectiveIndexTemplate(ProjectMetadata project public Settings getEffectiveSettings(ProjectMetadata projectMetadata) { ComposableIndexTemplate template = getMatchingIndexTemplate(projectMetadata); - final Settings templateSettings; - if (template.template() == null || template.template().settings() == null) { - templateSettings = Settings.EMPTY; - } else { - templateSettings = template.template().settings(); - } + Settings templateSettings = MetadataIndexTemplateService.resolveSettings(template, projectMetadata.componentTemplates()); return templateSettings.merge(settings); } diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/DataStreamTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/DataStreamTests.java index 6d665d7992fc8..07f6f2828f7a6 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/DataStreamTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/DataStreamTests.java @@ -2654,6 +2654,26 @@ public void testGetEffectiveSettingsTemplateSettingsOnly() { assertThat(dataStream.getEffectiveSettings(projectMetadataBuilder.build()), equalTo(templateSettings)); } + public void testGetEffectiveSettingsComponentTemplateSettingsOnly() { + // We only have settings from a component template, so we expect to get those back + DataStream dataStream = createDataStream(Settings.EMPTY); + Settings templateSettings = Settings.EMPTY; + Template.Builder indexTemplateBuilder = Template.builder().settings(templateSettings); + ComposableIndexTemplate indexTemplate = ComposableIndexTemplate.builder() + .indexPatterns(List.of(dataStream.getName())) + .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate()) + .template(indexTemplateBuilder) + .componentTemplates(List.of("component-template-1")) + .build(); + Settings componentSettings = randomSettings(); + Template.Builder componentTemplateBuilder = Template.builder().settings(componentSettings); + ComponentTemplate componentTemplate1 = new ComponentTemplate(componentTemplateBuilder.build(), null, null, null); + ProjectMetadata.Builder projectMetadataBuilder = ProjectMetadata.builder(randomProjectIdOrDefault()) + .indexTemplates(Map.of(dataStream.getName(), indexTemplate)) + .componentTemplates(Map.of("component-template-1", componentTemplate1)); + assertThat(dataStream.getEffectiveSettings(projectMetadataBuilder.build()), equalTo(componentSettings)); + } + public void testGetEffectiveSettingsDataStreamSettingsOnly() { // We only have settings from the data stream, so we expect to get those back Settings dataStreamSettings = randomSettings();