Skip to content

Commit 6a240b9

Browse files
authored
Trigger index settings providers when updating component templates. (#91615)
If index templates make use of the auto index.routing_path generation and use component templates then making any chang to component templates will fail. This commit addresses this, by changing the logic that creates/updates component templates to use the index settings provider when validating index templates that use the component templates being updated. Closes #91592
1 parent 53e500d commit 6a240b9

File tree

4 files changed

+49
-31
lines changed

4 files changed

+49
-31
lines changed

docs/changelog/91615.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 91615
2+
summary: Trigger index settings providers when updating component templates
3+
area: Indices APIs
4+
type: bug
5+
issues:
6+
- 91592

modules/data-streams/src/javaRestTest/java/org/elasticsearch/datastreams/TsdbDataStreamRestIT.java

+38-20
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.common.time.FormatNames;
1414
import org.elasticsearch.test.rest.ESRestTestCase;
1515
import org.elasticsearch.test.rest.ObjectPath;
16+
import org.junit.Before;
1617

1718
import java.io.IOException;
1819
import java.time.Instant;
@@ -35,6 +36,14 @@
3536

3637
public class TsdbDataStreamRestIT extends ESRestTestCase {
3738

39+
private static final String COMPONENT_TEMPLATE = """
40+
{
41+
"template": {
42+
"settings": {}
43+
}
44+
}
45+
""";
46+
3847
private static final String TEMPLATE = """
3948
{
4049
"index_patterns": ["k8s*"],
@@ -97,6 +106,7 @@ public class TsdbDataStreamRestIT extends ESRestTestCase {
97106
}
98107
}
99108
},
109+
"composed_of": ["custom_template"],
100110
"data_stream": {
101111
}
102112
}""";
@@ -190,12 +200,19 @@ public class TsdbDataStreamRestIT extends ESRestTestCase {
190200
{"@timestamp": "$now", "metricset": "pod", "k8s": {"pod": {"name": "elephant", "uid":"df3145b3-0563-4d3b-a0f7-897eb2876eb4", "ip": "10.10.55.3", "network": {"tx": 1434595272, "rx": 530605511}}}}
191201
""";
192202

193-
public void testTsdbDataStreams() throws Exception {
194-
// Create a template
195-
var putComposableIndexTemplateRequest = new Request("POST", "/_index_template/1");
196-
putComposableIndexTemplateRequest.setJsonEntity(TEMPLATE);
197-
assertOK(client().performRequest(putComposableIndexTemplateRequest));
203+
@Before
204+
public void setup() throws IOException {
205+
// Add component template:
206+
var request = new Request("POST", "/_component_template/custom_template");
207+
request.setJsonEntity(COMPONENT_TEMPLATE);
208+
assertOK(client().performRequest(request));
209+
// Add composable index template
210+
request = new Request("POST", "/_index_template/1");
211+
request.setJsonEntity(TEMPLATE);
212+
assertOK(client().performRequest(request));
213+
}
198214

215+
public void testTsdbDataStreams() throws Exception {
199216
var bulkRequest = new Request("POST", "/k8s/_bulk");
200217
bulkRequest.setJsonEntity(BULK.replace("$now", formatInstant(Instant.now())));
201218
bulkRequest.addParameter("refresh", "true");
@@ -331,10 +348,6 @@ public void testTsdbDataStreamsNanos() throws Exception {
331348
}
332349

333350
public void testSimulateTsdbDataStreamTemplate() throws Exception {
334-
var putComposableIndexTemplateRequest = new Request("POST", "/_index_template/1");
335-
putComposableIndexTemplateRequest.setJsonEntity(TEMPLATE);
336-
assertOK(client().performRequest(putComposableIndexTemplateRequest));
337-
338351
var simulateIndexTemplateRequest = new Request("POST", "/_index_template/_simulate_index/k8s");
339352
var response = client().performRequest(simulateIndexTemplateRequest);
340353
assertOK(response);
@@ -353,11 +366,6 @@ public void testSimulateTsdbDataStreamTemplate() throws Exception {
353366
}
354367

355368
public void testSubsequentRollovers() throws Exception {
356-
// Create a template
357-
var putComposableIndexTemplateRequest = new Request("POST", "/_index_template/1");
358-
putComposableIndexTemplateRequest.setJsonEntity(TEMPLATE);
359-
assertOK(client().performRequest(putComposableIndexTemplateRequest));
360-
361369
var createDataStreamRequest = new Request("PUT", "/_data_stream/k8s");
362370
assertOK(client().performRequest(createDataStreamRequest));
363371

@@ -461,12 +469,6 @@ public void testMigrateRegularDataStreamToTsdbDataStream() throws Exception {
461469
}
462470

463471
public void testChangeTemplateIndexMode() throws Exception {
464-
// Create a template
465-
{
466-
var putComposableIndexTemplateRequest = new Request("POST", "/_index_template/1");
467-
putComposableIndexTemplateRequest.setJsonEntity(TEMPLATE);
468-
assertOK(client().performRequest(putComposableIndexTemplateRequest));
469-
}
470472
{
471473
var indexRequest = new Request("POST", "/k8s/_doc");
472474
var time = Instant.now();
@@ -489,6 +491,22 @@ public void testChangeTemplateIndexMode() throws Exception {
489491
}
490492
}
491493

494+
public void testUpdateComponentTemplateDoesNotFailIndexTemplateValidation() throws IOException {
495+
var request = new Request("POST", "/_component_template/custom_template");
496+
request.setJsonEntity("""
497+
{
498+
"template": {
499+
"settings": {
500+
"index": {
501+
"number_of_replicas": 1
502+
}
503+
}
504+
}
505+
}
506+
""");
507+
client().performRequest(request);
508+
}
509+
492510
private static Map<?, ?> getIndex(String indexName) throws IOException {
493511
var getIndexRequest = new Request("GET", "/" + indexName + "?human");
494512
var response = client().performRequest(getIndexRequest);

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

+1-8
Original file line numberDiff line numberDiff line change
@@ -309,14 +309,7 @@ public ClusterState addComponentTemplate(
309309
final String composableTemplateName = entry.getKey();
310310
final ComposableIndexTemplate composableTemplate = entry.getValue();
311311
try {
312-
validateCompositeTemplate(
313-
tempStateWithComponentTemplateAdded,
314-
composableTemplateName,
315-
composableTemplate,
316-
indicesService,
317-
xContentRegistry,
318-
systemIndices
319-
);
312+
validateIndexTemplateV2(composableTemplateName, composableTemplate, tempStateWithComponentTemplateAdded);
320313
} catch (Exception e) {
321314
if (validationFailure == null) {
322315
validationFailure = new IllegalArgumentException(

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -1723,11 +1723,12 @@ public void testUpdateComponentTemplateFailsIfResolvedIndexTemplatesWouldBeInval
17231723
);
17241724

17251725
assertNotNull(e.getCause());
1726-
assertThat(e.getCause().getMessage(), containsString("invalid composite mappings for [my-template]"));
1727-
17281726
assertNotNull(e.getCause().getCause());
1727+
assertThat(e.getCause().getCause().getMessage(), containsString("invalid composite mappings for [my-template]"));
1728+
1729+
assertNotNull(e.getCause().getCause().getCause());
17291730
assertThat(
1730-
e.getCause().getCause().getMessage(),
1731+
e.getCause().getCause().getCause().getMessage(),
17311732
containsString("can't merge a non object mapping [field2] with an object mapping")
17321733
);
17331734
}

0 commit comments

Comments
 (0)