|  | @@ -24,6 +24,7 @@ import org.elasticsearch.cluster.ClusterState;
 | 
	
		
			
				|  |  |  import org.elasticsearch.cluster.block.ClusterBlockException;
 | 
	
		
			
				|  |  |  import org.elasticsearch.cluster.block.ClusterBlockLevel;
 | 
	
		
			
				|  |  |  import org.elasticsearch.cluster.health.ClusterStateHealth;
 | 
	
		
			
				|  |  | +import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
 | 
	
		
			
				|  |  |  import org.elasticsearch.cluster.metadata.DataStream;
 | 
	
		
			
				|  |  |  import org.elasticsearch.cluster.metadata.DataStreamFailureStoreSettings;
 | 
	
		
			
				|  |  |  import org.elasticsearch.cluster.metadata.DataStreamGlobalRetentionSettings;
 | 
	
	
		
			
				|  | @@ -39,6 +40,9 @@ import org.elasticsearch.core.Nullable;
 | 
	
		
			
				|  |  |  import org.elasticsearch.core.Tuple;
 | 
	
		
			
				|  |  |  import org.elasticsearch.index.Index;
 | 
	
		
			
				|  |  |  import org.elasticsearch.index.IndexMode;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.IndexSettingProvider;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.IndexSettingProviders;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.IndexSettings;
 | 
	
		
			
				|  |  |  import org.elasticsearch.indices.SystemDataStreamDescriptor;
 | 
	
		
			
				|  |  |  import org.elasticsearch.indices.SystemIndices;
 | 
	
		
			
				|  |  |  import org.elasticsearch.injection.guice.Inject;
 | 
	
	
		
			
				|  | @@ -52,6 +56,7 @@ import java.util.Arrays;
 | 
	
		
			
				|  |  |  import java.util.Comparator;
 | 
	
		
			
				|  |  |  import java.util.HashMap;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Locale;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -67,6 +72,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |      private final ClusterSettings clusterSettings;
 | 
	
		
			
				|  |  |      private final DataStreamGlobalRetentionSettings globalRetentionSettings;
 | 
	
		
			
				|  |  |      private final DataStreamFailureStoreSettings dataStreamFailureStoreSettings;
 | 
	
		
			
				|  |  | +    private final IndexSettingProviders indexSettingProviders;
 | 
	
		
			
				|  |  |      private final Client client;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Inject
 | 
	
	
		
			
				|  | @@ -79,6 +85,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |          SystemIndices systemIndices,
 | 
	
		
			
				|  |  |          DataStreamGlobalRetentionSettings globalRetentionSettings,
 | 
	
		
			
				|  |  |          DataStreamFailureStoreSettings dataStreamFailureStoreSettings,
 | 
	
		
			
				|  |  | +        IndexSettingProviders indexSettingProviders,
 | 
	
		
			
				|  |  |          Client client
 | 
	
		
			
				|  |  |      ) {
 | 
	
		
			
				|  |  |          super(
 | 
	
	
		
			
				|  | @@ -96,6 +103,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |          this.globalRetentionSettings = globalRetentionSettings;
 | 
	
		
			
				|  |  |          clusterSettings = clusterService.getClusterSettings();
 | 
	
		
			
				|  |  |          this.dataStreamFailureStoreSettings = dataStreamFailureStoreSettings;
 | 
	
		
			
				|  |  | +        this.indexSettingProviders = indexSettingProviders;
 | 
	
		
			
				|  |  |          this.client = new OriginSettingClient(client, "stack");
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -128,6 +136,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |                              clusterSettings,
 | 
	
		
			
				|  |  |                              globalRetentionSettings,
 | 
	
		
			
				|  |  |                              dataStreamFailureStoreSettings,
 | 
	
		
			
				|  |  | +                            indexSettingProviders,
 | 
	
		
			
				|  |  |                              maxTimestamps
 | 
	
		
			
				|  |  |                          )
 | 
	
		
			
				|  |  |                      );
 | 
	
	
		
			
				|  | @@ -148,12 +157,43 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |                      clusterSettings,
 | 
	
		
			
				|  |  |                      globalRetentionSettings,
 | 
	
		
			
				|  |  |                      dataStreamFailureStoreSettings,
 | 
	
		
			
				|  |  | +                    indexSettingProviders,
 | 
	
		
			
				|  |  |                      null
 | 
	
		
			
				|  |  |                  )
 | 
	
		
			
				|  |  |              );
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Resolves the index mode ("index.mode" setting) for the given data stream, from the template or additional setting providers
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Nullable
 | 
	
		
			
				|  |  | +    static IndexMode resolveMode(
 | 
	
		
			
				|  |  | +        ClusterState state,
 | 
	
		
			
				|  |  | +        IndexSettingProviders indexSettingProviders,
 | 
	
		
			
				|  |  | +        DataStream dataStream,
 | 
	
		
			
				|  |  | +        Settings settings,
 | 
	
		
			
				|  |  | +        ComposableIndexTemplate indexTemplate
 | 
	
		
			
				|  |  | +    ) {
 | 
	
		
			
				|  |  | +        IndexMode indexMode = state.metadata().retrieveIndexModeFromTemplate(indexTemplate);
 | 
	
		
			
				|  |  | +        for (IndexSettingProvider provider : indexSettingProviders.getIndexSettingProviders()) {
 | 
	
		
			
				|  |  | +            Settings addlSettinsg = provider.getAdditionalIndexSettings(
 | 
	
		
			
				|  |  | +                MetadataIndexTemplateService.VALIDATE_INDEX_NAME,
 | 
	
		
			
				|  |  | +                dataStream.getName(),
 | 
	
		
			
				|  |  | +                indexMode,
 | 
	
		
			
				|  |  | +                state.metadata(),
 | 
	
		
			
				|  |  | +                Instant.now(),
 | 
	
		
			
				|  |  | +                settings,
 | 
	
		
			
				|  |  | +                List.of()
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +            var rawMode = addlSettinsg.get(IndexSettings.MODE.getKey());
 | 
	
		
			
				|  |  | +            if (rawMode != null) {
 | 
	
		
			
				|  |  | +                indexMode = Enum.valueOf(IndexMode.class, rawMode.toUpperCase(Locale.ROOT));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return indexMode;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      static GetDataStreamAction.Response innerOperation(
 | 
	
		
			
				|  |  |          ClusterState state,
 | 
	
		
			
				|  |  |          GetDataStreamAction.Request request,
 | 
	
	
		
			
				|  | @@ -162,6 +202,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |          ClusterSettings clusterSettings,
 | 
	
		
			
				|  |  |          DataStreamGlobalRetentionSettings globalRetentionSettings,
 | 
	
		
			
				|  |  |          DataStreamFailureStoreSettings dataStreamFailureStoreSettings,
 | 
	
		
			
				|  |  | +        IndexSettingProviders indexSettingProviders,
 | 
	
		
			
				|  |  |          @Nullable Map<String, Long> maxTimestamps
 | 
	
		
			
				|  |  |      ) {
 | 
	
		
			
				|  |  |          List<DataStream> dataStreams = getDataStreams(state, indexNameExpressionResolver, request);
 | 
	
	
		
			
				|  | @@ -173,6 +214,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |              final String indexTemplate;
 | 
	
		
			
				|  |  |              boolean indexTemplatePreferIlmValue = true;
 | 
	
		
			
				|  |  |              String ilmPolicyName = null;
 | 
	
		
			
				|  |  | +            IndexMode indexMode = dataStream.getIndexMode();
 | 
	
		
			
				|  |  |              if (dataStream.isSystem()) {
 | 
	
		
			
				|  |  |                  SystemDataStreamDescriptor dataStreamDescriptor = systemIndices.findMatchingDataStreamDescriptor(dataStream.getName());
 | 
	
		
			
				|  |  |                  indexTemplate = dataStreamDescriptor != null ? dataStreamDescriptor.getDataStreamName() : null;
 | 
	
	
		
			
				|  | @@ -182,6 +224,15 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |                          dataStreamDescriptor.getComponentTemplates()
 | 
	
		
			
				|  |  |                      );
 | 
	
		
			
				|  |  |                      ilmPolicyName = settings.get(IndexMetadata.LIFECYCLE_NAME);
 | 
	
		
			
				|  |  | +                    if (indexMode == null) {
 | 
	
		
			
				|  |  | +                        indexMode = resolveMode(
 | 
	
		
			
				|  |  | +                            state,
 | 
	
		
			
				|  |  | +                            indexSettingProviders,
 | 
	
		
			
				|  |  | +                            dataStream,
 | 
	
		
			
				|  |  | +                            settings,
 | 
	
		
			
				|  |  | +                            dataStreamDescriptor.getComposableIndexTemplate()
 | 
	
		
			
				|  |  | +                        );
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                      indexTemplatePreferIlmValue = PREFER_ILM_SETTING.get(settings);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              } else {
 | 
	
	
		
			
				|  | @@ -189,6 +240,15 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |                  if (indexTemplate != null) {
 | 
	
		
			
				|  |  |                      Settings settings = MetadataIndexTemplateService.resolveSettings(state.metadata(), indexTemplate);
 | 
	
		
			
				|  |  |                      ilmPolicyName = settings.get(IndexMetadata.LIFECYCLE_NAME);
 | 
	
		
			
				|  |  | +                    if (indexMode == null && state.metadata().templatesV2().get(indexTemplate) != null) {
 | 
	
		
			
				|  |  | +                        indexMode = resolveMode(
 | 
	
		
			
				|  |  | +                            state,
 | 
	
		
			
				|  |  | +                            indexSettingProviders,
 | 
	
		
			
				|  |  | +                            dataStream,
 | 
	
		
			
				|  |  | +                            settings,
 | 
	
		
			
				|  |  | +                            state.metadata().templatesV2().get(indexTemplate)
 | 
	
		
			
				|  |  | +                        );
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                      indexTemplatePreferIlmValue = PREFER_ILM_SETTING.get(settings);
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      LOGGER.warn(
 | 
	
	
		
			
				|  | @@ -280,7 +340,9 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |                      timeSeries,
 | 
	
		
			
				|  |  |                      backingIndicesSettingsValues,
 | 
	
		
			
				|  |  |                      indexTemplatePreferIlmValue,
 | 
	
		
			
				|  |  | -                    maxTimestamps == null ? null : maxTimestamps.get(dataStream.getName())
 | 
	
		
			
				|  |  | +                    maxTimestamps == null ? null : maxTimestamps.get(dataStream.getName()),
 | 
	
		
			
				|  |  | +                    // Default to standard mode if not specified; should we set this to "unset" or "unspecified" instead?
 | 
	
		
			
				|  |  | +                    indexMode == null ? IndexMode.STANDARD.getName() : indexMode.getName()
 | 
	
		
			
				|  |  |                  )
 | 
	
		
			
				|  |  |              );
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -310,7 +372,11 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  managedBy = ManagedBy.UNMANAGED;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            backingIndicesSettingsValues.put(index, new IndexProperties(preferIlm, indexMetadata.getLifecyclePolicyName(), managedBy));
 | 
	
		
			
				|  |  | +            String indexMode = IndexSettings.MODE.get(indexMetadata.getSettings()).getName();
 | 
	
		
			
				|  |  | +            backingIndicesSettingsValues.put(
 | 
	
		
			
				|  |  | +                index,
 | 
	
		
			
				|  |  | +                new IndexProperties(preferIlm, indexMetadata.getLifecyclePolicyName(), managedBy, indexMode)
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |