Browse Source

Simulate template api to include settings from IndexSettingProvider (#82609)

The simulate template api should include the settings that registered IndexSettingProvider generate.
Currently, these settings are not included in the simulate template api response,
but are only used to create a dummy IndexService instance to validate aliases.
Martijn van Groningen 3 years ago
parent
commit
e6326078a0

+ 8 - 1
docs/reference/indices/simulate-index.asciidoc

@@ -189,7 +189,14 @@ The response shows the index settings, mappings, and aliases applied by the `fin
     "settings" : {
       "index" : {
         "number_of_shards" : "2",
-        "number_of_replicas" : "0"
+        "number_of_replicas" : "0",
+        "routing" : {
+          "allocation" : {
+            "include" : {
+              "_tier_preference" : "data_content"
+            }
+          }
+        }
       }
     },
     "mappings" : {

+ 8 - 1
docs/reference/indices/simulate-multi-component-templates.asciidoc

@@ -97,7 +97,14 @@ or higher-priority templates.
     "settings" : {
       "index" : {
         "number_of_shards" : "3",   <1>
-        "number_of_replicas" : "0"
+        "number_of_replicas" : "0",
+        "routing" : {
+          "allocation" : {
+            "include" : {
+              "_tier_preference" : "data_content"
+            }
+          }
+        }
       }
     },
     "mappings" : {

+ 17 - 3
docs/reference/indices/simulate-template.asciidoc

@@ -4,7 +4,7 @@
 <titleabbrev>Simulate template</titleabbrev>
 ++++
 
-Returns the index configuration that would be applied by a particular 
+Returns the index configuration that would be applied by a particular
 <<index-templates, index template>>.
 
 ////
@@ -193,7 +193,14 @@ The response shows the index settings, mappings, and aliases applied by the `fin
     "settings" : {
       "index" : {
         "number_of_shards" : "2",  <1>
-        "number_of_replicas" : "0" <2>
+        "number_of_replicas" : "0", <2>
+        "routing" : {
+          "allocation" : {
+            "include" : {
+              "_tier_preference" : "data_content"
+            }
+          }
+        }
       }
     },
     "mappings" : {                 <3>
@@ -244,7 +251,14 @@ The response shows any overlapping templates with a lower priority.
   "template" : {
     "settings" : {
       "index" : {
-        "number_of_replicas" : "1"
+        "number_of_replicas" : "1",
+        "routing" : {
+          "allocation" : {
+            "include" : {
+              "_tier_preference" : "data_content"
+            }
+          }
+        }
       }
     },
     "mappings" : {

+ 12 - 10
server/src/main/java/org/elasticsearch/action/admin/indices/template/post/TransportSimulateIndexTemplateAction.java

@@ -197,7 +197,7 @@ public class TransportSimulateIndexTemplateAction extends TransportMasterNodeRea
         final SystemIndices systemIndices,
         Set<IndexSettingProvider> indexSettingProviders
     ) throws Exception {
-        Settings settings = resolveSettings(simulatedState.metadata(), matchingTemplate);
+        Settings templateSettings = resolveSettings(simulatedState.metadata(), matchingTemplate);
 
         List<Map<String, AliasMetadata>> resolvedAliases = MetadataIndexTemplateService.resolveAliases(
             simulatedState.metadata(),
@@ -213,19 +213,20 @@ public class TransportSimulateIndexTemplateAction extends TransportMasterNodeRea
             .put(IndexMetadata.SETTING_INDEX_UUID, UUIDs.randomBase64UUID());
 
         // First apply settings sourced from index settings providers
+        Settings.Builder additionalSettings = Settings.builder();
         for (var provider : indexSettingProviders) {
-            dummySettings.put(
-                provider.getAdditionalIndexSettings(
-                    indexName,
-                    template.getDataStreamTemplate() != null ? indexName : null,
-                    simulatedState.getMetadata(),
-                    System.currentTimeMillis(),
-                    settings
-                )
+            Settings result = provider.getAdditionalIndexSettings(
+                indexName,
+                template.getDataStreamTemplate() != null ? indexName : null,
+                simulatedState.getMetadata(),
+                System.currentTimeMillis(),
+                templateSettings
             );
+            dummySettings.put(result);
+            additionalSettings.put(result);
         }
         // Then apply settings resolved from templates:
-        dummySettings.put(settings);
+        dummySettings.put(templateSettings);
 
         final IndexMetadata indexMetadata = IndexMetadata.builder(indexName).settings(dummySettings).build();
 
@@ -274,6 +275,7 @@ public class TransportSimulateIndexTemplateAction extends TransportMasterNodeRea
             }
         );
 
+        Settings settings = Settings.builder().put(templateSettings).put(additionalSettings.build()).build();
         return new Template(settings, mergedMapping, aliasesByName);
     }
 }

+ 3 - 1
x-pack/plugin/data-streams/qa/rest/src/javaRestTest/java/org/elasticsearch/xpack/datastreams/TsdbDataStreamRestIT.java

@@ -196,10 +196,12 @@ public class TsdbDataStreamRestIT extends ESRestTestCase {
         var response = client().performRequest(simulateIndexTemplateRequest);
         assertOK(response);
         var responseBody = entityAsMap(response);
-        assertThat(ObjectPath.evaluate(responseBody, "template.settings.index"), aMapWithSize(4));
+        assertThat(ObjectPath.evaluate(responseBody, "template.settings.index"), aMapWithSize(6));
         assertThat(ObjectPath.evaluate(responseBody, "template.settings.index.number_of_shards"), equalTo("2"));
         assertThat(ObjectPath.evaluate(responseBody, "template.settings.index.number_of_replicas"), equalTo("0"));
         assertThat(ObjectPath.evaluate(responseBody, "template.settings.index.mode"), equalTo("time_series"));
+        assertThat(ObjectPath.evaluate(responseBody, "template.settings.index.time_series.start_time"), notNullValue());
+        assertThat(ObjectPath.evaluate(responseBody, "template.settings.index.time_series.end_time"), notNullValue());
         assertThat(
             ObjectPath.evaluate(responseBody, "template.settings.index.routing_path"),
             contains("metricset", "time_series_dimension")