Create dedicated factory methods for data lifecycle (#126487)

The class `DataStreamLifecycle` is currently capturing the lifecycle
configuration that currently manages all data stream indices, but soon
enough it will be split into two variants, the data and the failures
lifecycle. 

Some pre-work has been done already but as we are progressing in our
POC, we see that it will be really useful if the `DataStreamLifecycle`
is "aware" of the target index component. This will allow us to
correctly apply global retention or to throw an error if a downsampling
configuration is provided to a failure lifecycle.

In this PR, we perform a small refactoring to reduce the noise in
https://github.com/elastic/elasticsearch/pull/125658. Here we introduce
the following:

- A factory method that creates a data lifecycle, for now it's trivial but it will be more useful soon.
- We rename the "empty" builder to explicitly mention the index component it refers to.
This commit is contained in:
Mary Gouseti 2025-04-23 13:00:25 +03:00 committed by GitHub
parent 1e7c6abaf6
commit b9917086e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 225 additions and 164 deletions

View file

@ -1384,7 +1384,9 @@ public class DataStreamIT extends ESIntegTestCase {
public void testGetDataStream() throws Exception { public void testGetDataStream() throws Exception {
Settings settings = Settings.builder().put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, maximumNumberOfReplicas() + 2).build(); Settings settings = Settings.builder().put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, maximumNumberOfReplicas() + 2).build();
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue()).buildTemplate(); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(randomPositiveTimeValue())
.buildTemplate();
putComposableIndexTemplate("template_for_foo", null, List.of("metrics-foo*"), settings, null, null, lifecycle, false); putComposableIndexTemplate("template_for_foo", null, List.of("metrics-foo*"), settings, null, null, lifecycle, false);
int numDocsFoo = randomIntBetween(2, 16); int numDocsFoo = randomIntBetween(2, 16);
indexDocs("metrics-foo", numDocsFoo); indexDocs("metrics-foo", numDocsFoo);

View file

@ -401,17 +401,23 @@ public class SystemDataStreamIT extends ESIntegTestCase {
Type.EXTERNAL, Type.EXTERNAL,
ComposableIndexTemplate.builder() ComposableIndexTemplate.builder()
.indexPatterns(List.of(".test-failure-store")) .indexPatterns(List.of(".test-failure-store"))
.template(Template.builder().mappings(new CompressedXContent(""" .template(
{ Template.builder()
"properties": { .mappings(new CompressedXContent("""
"@timestamp" : { {
"type": "date" "properties": {
}, "@timestamp" : {
"count": { "type": "date"
"type": "long" },
} "count": {
} "type": "long"
}""")).dataStreamOptions(new DataStreamOptions.Template(new DataStreamFailureStore.Template(true)))) }
}
}"""))
.dataStreamOptions(
new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate())
)
)
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate()) .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
.build(), .build(),
Map.of(), Map.of(),

View file

@ -25,7 +25,7 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import static org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleFixtures.putComposableIndexTemplate; import static org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleFixtures.putComposableIndexTemplate;
import static org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleFixtures.randomLifecycleTemplate; import static org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleFixtures.randomDataLifecycleTemplate;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.notNullValue;
@ -39,7 +39,7 @@ public class CrudDataStreamLifecycleIT extends ESIntegTestCase {
} }
public void testGetLifecycle() throws Exception { public void testGetLifecycle() throws Exception {
DataStreamLifecycle.Template lifecycle = randomLifecycleTemplate(); DataStreamLifecycle.Template lifecycle = randomDataLifecycleTemplate();
putComposableIndexTemplate("id1", null, List.of("with-lifecycle*"), null, null, lifecycle); putComposableIndexTemplate("id1", null, List.of("with-lifecycle*"), null, null, lifecycle);
putComposableIndexTemplate("id2", null, List.of("without-lifecycle*"), null, null, null); putComposableIndexTemplate("id2", null, List.of("without-lifecycle*"), null, null, null);
{ {
@ -226,7 +226,9 @@ public class CrudDataStreamLifecycleIT extends ESIntegTestCase {
} }
public void testDeleteLifecycle() throws Exception { public void testDeleteLifecycle() throws Exception {
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue()).buildTemplate(); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(randomPositiveTimeValue())
.buildTemplate();
putComposableIndexTemplate("id1", null, List.of("with-lifecycle*"), null, null, lifecycle); putComposableIndexTemplate("id1", null, List.of("with-lifecycle*"), null, null, lifecycle);
putComposableIndexTemplate("id2", null, List.of("without-lifecycle*"), null, null, null); putComposableIndexTemplate("id2", null, List.of("without-lifecycle*"), null, null, null);
{ {

View file

@ -207,7 +207,7 @@ public class CrudSystemDataStreamLifecycleIT extends ESIntegTestCase {
Template.builder() Template.builder()
.settings(Settings.EMPTY) .settings(Settings.EMPTY)
.mappings(mappings) .mappings(mappings)
.lifecycle(DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue())) .lifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomPositiveTimeValue()))
) )
.dataStreamTemplate(new DataStreamTemplate()) .dataStreamTemplate(new DataStreamTemplate())
.build(), .build(),

View file

@ -168,7 +168,7 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
} }
public void testRolloverAndRetention() throws Exception { public void testRolloverAndRetention() throws Exception {
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).buildTemplate(); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).buildTemplate();
putComposableIndexTemplate("id1", null, List.of("metrics-foo*"), null, null, lifecycle, false); putComposableIndexTemplate("id1", null, List.of("metrics-foo*"), null, null, lifecycle, false);
@ -290,7 +290,9 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
* days ago, and one with an origination date 1 day ago. After data stream lifecycle runs, we expect the one with the old * days ago, and one with an origination date 1 day ago. After data stream lifecycle runs, we expect the one with the old
* origination date to have been deleted, and the one with the newer origination date to remain. * origination date to have been deleted, and the one with the newer origination date to remain.
*/ */
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(7)).buildTemplate(); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueDays(7))
.buildTemplate();
putComposableIndexTemplate("id1", null, List.of("metrics-foo*"), null, null, lifecycle, false); putComposableIndexTemplate("id1", null, List.of("metrics-foo*"), null, null, lifecycle, false);
@ -836,7 +838,7 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
public void testReenableDataStreamLifecycle() throws Exception { public void testReenableDataStreamLifecycle() throws Exception {
// start with a lifecycle that's not enabled // start with a lifecycle that's not enabled
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder().enabled(false).buildTemplate(); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder().enabled(false).buildTemplate();
putComposableIndexTemplate("id1", null, List.of("metrics-foo*"), null, null, lifecycle, false); putComposableIndexTemplate("id1", null, List.of("metrics-foo*"), null, null, lifecycle, false);
String dataStreamName = "metrics-foo"; String dataStreamName = "metrics-foo";
@ -892,7 +894,7 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
public void testLifecycleAppliedToFailureStore() throws Exception { public void testLifecycleAppliedToFailureStore() throws Exception {
// We configure a lifecycle with downsampling to ensure it doesn't fail // We configure a lifecycle with downsampling to ensure it doesn't fail
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueSeconds(20)) .dataRetention(TimeValue.timeValueSeconds(20))
.downsampling( .downsampling(
List.of( List.of(
@ -1088,7 +1090,8 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
Template.builder() Template.builder()
.settings(Settings.EMPTY) .settings(Settings.EMPTY)
.lifecycle( .lifecycle(
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(SYSTEM_DATA_STREAM_RETENTION_DAYS)) DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueDays(SYSTEM_DATA_STREAM_RETENTION_DAYS))
) )
) )
.build(), .build(),

View file

@ -265,7 +265,7 @@ public class ExplainDataStreamLifecycleIT extends ESIntegTestCase {
null, null,
null, null,
DataStreamLifecycle.Template.DATA_DEFAULT, DataStreamLifecycle.Template.DATA_DEFAULT,
new DataStreamOptions.Template(new DataStreamFailureStore.Template(true)) new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate())
); );
String dataStreamName = "metrics-foo"; String dataStreamName = "metrics-foo";
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request( CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
@ -400,7 +400,7 @@ public class ExplainDataStreamLifecycleIT extends ESIntegTestCase {
null, null,
null, null,
lifecycle, lifecycle,
new DataStreamOptions.Template(new DataStreamFailureStore.Template(true)) new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate())
); );
String dataStreamName = "metrics-foo"; String dataStreamName = "metrics-foo";
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request( CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
@ -501,7 +501,7 @@ public class ExplainDataStreamLifecycleIT extends ESIntegTestCase {
List.of("metrics-foo*"), List.of("metrics-foo*"),
null, null,
null, null,
DataStreamLifecycle.builder().enabled(false).buildTemplate() DataStreamLifecycle.dataLifecycleBuilder().enabled(false).buildTemplate()
); );
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request( CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
TEST_REQUEST_TIMEOUT, TEST_REQUEST_TIMEOUT,

View file

@ -27,7 +27,6 @@ import org.elasticsearch.cluster.health.ClusterHealthStatus;
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
import org.elasticsearch.cluster.metadata.DataStreamFailureStore; import org.elasticsearch.cluster.metadata.DataStreamFailureStore;
import org.elasticsearch.cluster.metadata.DataStreamOptions; import org.elasticsearch.cluster.metadata.DataStreamOptions;
import org.elasticsearch.cluster.metadata.ResettableValue;
import org.elasticsearch.cluster.metadata.Template; import org.elasticsearch.cluster.metadata.Template;
import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.compress.CompressedXContent;
import org.elasticsearch.index.mapper.extras.MapperExtrasPlugin; import org.elasticsearch.index.mapper.extras.MapperExtrasPlugin;
@ -271,11 +270,9 @@ public class DataStreamsStatsTests extends ESSingleNodeTestCase {
private String createDataStream(boolean hidden, boolean failureStore) throws Exception { private String createDataStream(boolean hidden, boolean failureStore) throws Exception {
String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.getDefault()); String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.getDefault());
ResettableValue<DataStreamOptions.Template> failureStoreOptions = failureStore == false DataStreamOptions.Template failureStoreOptions = failureStore == false
? ResettableValue.undefined() ? null
: ResettableValue.create( : new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate());
new DataStreamOptions.Template(ResettableValue.create(new DataStreamFailureStore.Template(ResettableValue.create(true))))
);
Template idxTemplate = new Template(null, new CompressedXContent(""" Template idxTemplate = new Template(null, new CompressedXContent("""
{"properties":{"@timestamp":{"type":"date"},"data":{"type":"keyword"}}} {"properties":{"@timestamp":{"type":"date"},"data":{"type":"keyword"}}}
"""), null, null, failureStoreOptions); """), null, null, failureStoreOptions);

View file

@ -144,7 +144,11 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
} }
// One lifecycle results to this lifecycle as the final // One lifecycle results to this lifecycle as the final
{ {
DataStreamLifecycle.Template lifecycle = new DataStreamLifecycle.Template(true, randomRetention(), randomDownsampling()); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.createDataLifecycleTemplate(
true,
randomRetention(),
randomDownsampling()
);
List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle); List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle);
DataStreamLifecycle result = composeDataLifecycles(lifecycles).build(); DataStreamLifecycle result = composeDataLifecycles(lifecycles).build();
// Defaults to true // Defaults to true
@ -155,7 +159,11 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
// If the last lifecycle is missing a property (apart from enabled) we keep the latest from the previous ones // If the last lifecycle is missing a property (apart from enabled) we keep the latest from the previous ones
// Enabled is always true unless it's explicitly set to false // Enabled is always true unless it's explicitly set to false
{ {
DataStreamLifecycle.Template lifecycle = new DataStreamLifecycle.Template(false, randomPositiveTimeValue(), randomRounds()); DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.createDataLifecycleTemplate(
false,
randomPositiveTimeValue(),
randomRounds()
);
List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle, DataStreamLifecycle.Template.DATA_DEFAULT); List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle, DataStreamLifecycle.Template.DATA_DEFAULT);
DataStreamLifecycle result = composeDataLifecycles(lifecycles).build(); DataStreamLifecycle result = composeDataLifecycles(lifecycles).build();
assertThat(result.enabled(), equalTo(true)); assertThat(result.enabled(), equalTo(true));
@ -164,8 +172,16 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
} }
// If both lifecycle have all properties, then the latest one overwrites all the others // If both lifecycle have all properties, then the latest one overwrites all the others
{ {
DataStreamLifecycle.Template lifecycle1 = new DataStreamLifecycle.Template(false, randomPositiveTimeValue(), randomRounds()); DataStreamLifecycle.Template lifecycle1 = DataStreamLifecycle.createDataLifecycleTemplate(
DataStreamLifecycle.Template lifecycle2 = new DataStreamLifecycle.Template(true, randomPositiveTimeValue(), randomRounds()); false,
randomPositiveTimeValue(),
randomRounds()
);
DataStreamLifecycle.Template lifecycle2 = DataStreamLifecycle.createDataLifecycleTemplate(
true,
randomPositiveTimeValue(),
randomRounds()
);
List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle1, lifecycle2); List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle1, lifecycle2);
DataStreamLifecycle result = composeDataLifecycles(lifecycles).build(); DataStreamLifecycle result = composeDataLifecycles(lifecycles).build();
assertThat(result.enabled(), equalTo(lifecycle2.enabled())); assertThat(result.enabled(), equalTo(lifecycle2.enabled()));

View file

@ -153,7 +153,7 @@ public class GetDataStreamsResponseTests extends ESTestCase {
.setGeneration(3) .setGeneration(3)
.setAllowCustomRouting(true) .setAllowCustomRouting(true)
.setIndexMode(IndexMode.STANDARD) .setIndexMode(IndexMode.STANDARD)
.setLifecycle(new DataStreamLifecycle(false, null, null)) .setLifecycle(DataStreamLifecycle.createDataLifecycle(false, null, null))
.setDataStreamOptions(DataStreamOptions.FAILURE_STORE_ENABLED) .setDataStreamOptions(DataStreamOptions.FAILURE_STORE_ENABLED)
.setFailureIndices(DataStream.DataStreamIndices.failureIndicesBuilder(failureStores).build()) .setFailureIndices(DataStream.DataStreamIndices.failureIndicesBuilder(failureStores).build())
.build(); .build();

View file

@ -128,8 +128,8 @@ public class DataStreamLifecycleFixtures {
assertTrue(client().execute(TransportPutComposableIndexTemplateAction.TYPE, request).actionGet().isAcknowledged()); assertTrue(client().execute(TransportPutComposableIndexTemplateAction.TYPE, request).actionGet().isAcknowledged());
} }
static DataStreamLifecycle.Template randomLifecycleTemplate() { static DataStreamLifecycle.Template randomDataLifecycleTemplate() {
return new DataStreamLifecycle.Template( return DataStreamLifecycle.createDataLifecycleTemplate(
frequently(), frequently(),
randomResettable(ESTestCase::randomTimeValue), randomResettable(ESTestCase::randomTimeValue),
randomResettable(DataStreamLifecycleFixtures::randomDownsamplingRounds) randomResettable(DataStreamLifecycleFixtures::randomDownsamplingRounds)

View file

@ -206,7 +206,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices, numBackingIndices,
2, 2,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -269,7 +269,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices, numBackingIndices,
numFailureIndices, numFailureIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -304,7 +304,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStream.copy() dataStream.copy()
.setName(dataStreamName) .setName(dataStreamName)
.setGeneration(dataStream.getGeneration() + 1) .setGeneration(dataStream.getGeneration() + 1)
.setLifecycle(DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build()) .setLifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build())
.build() .build()
); );
clusterState = ClusterState.builder(clusterState).putProjectMetadata(builder).build(); clusterState = ClusterState.builder(clusterState).putProjectMetadata(builder).build();
@ -343,7 +343,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStream.copy() dataStream.copy()
.setName(dataStreamName) .setName(dataStreamName)
.setGeneration(dataStream.getGeneration() + 1) .setGeneration(dataStream.getGeneration() + 1)
.setLifecycle(DataStreamLifecycle.builder().build()) .setLifecycle(DataStreamLifecycle.dataLifecycleBuilder().build())
.build() .build()
); );
clusterState = ClusterState.builder(clusterState).putProjectMetadata(builder).build(); clusterState = ClusterState.builder(clusterState).putProjectMetadata(builder).build();
@ -378,7 +378,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueMillis(0)).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueMillis(0)).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -456,7 +456,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
Settings.builder() Settings.builder()
.put(IndexMetadata.LIFECYCLE_NAME, "ILM_policy") .put(IndexMetadata.LIFECYCLE_NAME, "ILM_policy")
.put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current()), .put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -548,7 +548,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now now
); );
// all backing indices are in the error store // all backing indices are in the error store
@ -586,7 +586,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
ilmManagedDataStreamName, ilmManagedDataStreamName,
3, 3,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now now
); );
// all backing indices are in the error store // all backing indices are in the error store
@ -600,7 +600,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamWithBackingIndicesInErrorState, dataStreamWithBackingIndicesInErrorState,
5, 5,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now now
); );
// put all backing indices in the error store // put all backing indices in the error store
@ -652,7 +652,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()).put(MergePolicyConfig.INDEX_MERGE_POLICY_FLOOR_SEGMENT_SETTING.getKey(), ONE_HUNDRED_MB) settings(IndexVersion.current()).put(MergePolicyConfig.INDEX_MERGE_POLICY_FLOOR_SEGMENT_SETTING.getKey(), ONE_HUNDRED_MB)
.put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE), .put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -754,7 +754,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()).put(MergePolicyConfig.INDEX_MERGE_POLICY_FLOOR_SEGMENT_SETTING.getKey(), ONE_HUNDRED_MB) settings(IndexVersion.current()).put(MergePolicyConfig.INDEX_MERGE_POLICY_FLOOR_SEGMENT_SETTING.getKey(), ONE_HUNDRED_MB)
.put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE), .put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -916,7 +916,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
1L, 1L,
null, null,
false, false,
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build() DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build()
); );
ProjectMetadata.Builder builder = ProjectMetadata.builder(randomProjectIdOrDefault()).put(newIndexMetadata, true).put(dataStream); ProjectMetadata.Builder builder = ProjectMetadata.builder(randomProjectIdOrDefault()).put(newIndexMetadata, true).put(dataStream);
@ -1091,7 +1091,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -1173,7 +1173,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
.put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE) .put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE)
.put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) .put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"), .put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m")))) List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m"))))
) )
@ -1322,7 +1322,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
.put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE) .put(MergePolicyConfig.INDEX_MERGE_POLICY_MERGE_FACTOR_SETTING.getKey(), TARGET_MERGE_FACTOR_VALUE)
.put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) .put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"), .put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m")))) List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m"))))
) )
@ -1512,7 +1512,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices, numBackingIndices,
2, 2,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build(),
now now
).copy().setDataStreamOptions(DataStreamOptions.FAILURE_STORE_DISABLED).build(); // failure store is managed even when disabled ).copy().setDataStreamOptions(DataStreamOptions.FAILURE_STORE_DISABLED).build(); // failure store is managed even when disabled
builder.put(dataStream); builder.put(dataStream);
@ -1581,7 +1581,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
2, 2,
settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"), .put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m")))) List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m"))))
) )

View file

@ -95,7 +95,7 @@ public class TransportGetDataStreamLifecycleStatsActionTests extends ESTestCase
"dsl-managed-index", "dsl-managed-index",
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(10)).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(10)).build(),
Clock.systemUTC().millis() Clock.systemUTC().millis()
); );
indicesInError.add(dslDataStream.getIndices().get(randomInt(numBackingIndices - 1)).getName()); indicesInError.add(dslDataStream.getIndices().get(randomInt(numBackingIndices - 1)).getName());
@ -131,7 +131,7 @@ public class TransportGetDataStreamLifecycleStatsActionTests extends ESTestCase
IndexMetadata indexMetadata = indexMetaBuilder.build(); IndexMetadata indexMetadata = indexMetaBuilder.build();
builder.put(indexMetadata, false); builder.put(indexMetadata, false);
backingIndices.add(indexMetadata.getIndex()); backingIndices.add(indexMetadata.getIndex());
builder.put(newInstance(dataStreamName, backingIndices, 3, null, false, DataStreamLifecycle.builder().build())); builder.put(newInstance(dataStreamName, backingIndices, 3, null, false, DataStreamLifecycle.dataLifecycleBuilder().build()));
} }
ProjectMetadata project = builder.build(); ProjectMetadata project = builder.build();
when(errorStore.getAllIndices(project.id())).thenReturn(indicesInError); when(errorStore.getAllIndices(project.id())).thenReturn(indicesInError);

View file

@ -52,7 +52,7 @@ public class DeleteSourceAndAddDownsampleToDSTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -80,7 +80,7 @@ public class DeleteSourceAndAddDownsampleToDSTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1); String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1);
@ -125,7 +125,7 @@ public class DeleteSourceAndAddDownsampleToDSTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
builder.put(dataStream); builder.put(dataStream);
@ -159,7 +159,7 @@ public class DeleteSourceAndAddDownsampleToDSTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1); String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1);
@ -221,7 +221,7 @@ public class DeleteSourceAndAddDownsampleToDSTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1); String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1);
@ -272,7 +272,7 @@ public class DeleteSourceAndAddDownsampleToDSTests extends ESTestCase {
dataStreamName, dataStreamName,
numBackingIndices, numBackingIndices,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(), DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now now
); );
String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1); String firstGenIndex = DataStream.getDefaultBackingIndexName(dataStreamName, 1);

View file

@ -149,7 +149,7 @@ public class PutDataStreamLifecycleAction {
) { ) {
super(masterNodeTimeout, ackTimeout); super(masterNodeTimeout, ackTimeout);
this.names = names; this.names = names;
this.lifecycle = DataStreamLifecycle.builder() this.lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(dataRetention) .dataRetention(dataRetention)
.enabled(enabled == null || enabled) .enabled(enabled == null || enabled)
.downsampling(downsampling) .downsampling(downsampling)

View file

@ -86,7 +86,7 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
Setting.Property.NodeScope Setting.Property.NodeScope
); );
public static final DataStreamLifecycle DEFAULT_DATA_LIFECYCLE = new DataStreamLifecycle(null, null, null); public static final DataStreamLifecycle DEFAULT_DATA_LIFECYCLE = DataStreamLifecycle.createDataLifecycle(null, null, null);
public static final String DATA_STREAM_LIFECYCLE_ORIGIN = "data_stream_lifecycle"; public static final String DATA_STREAM_LIFECYCLE_ORIGIN = "data_stream_lifecycle";
@ -132,17 +132,27 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
@Nullable @Nullable
private final List<DownsamplingRound> downsampling; private final List<DownsamplingRound> downsampling;
public DataStreamLifecycle( // Visible for testing, preferably use the factory methods that are specialised by lifecycle type,
@Nullable Boolean enabled, // for example for the data component.
@Nullable TimeValue dataRetention, DataStreamLifecycle(@Nullable Boolean enabled, @Nullable TimeValue dataRetention, @Nullable List<DownsamplingRound> downsampling) {
@Nullable List<DownsamplingRound> downsampling
) {
this.enabled = enabled == null || enabled; this.enabled = enabled == null || enabled;
this.dataRetention = dataRetention; this.dataRetention = dataRetention;
DownsamplingRound.validateRounds(downsampling); DownsamplingRound.validateRounds(downsampling);
this.downsampling = downsampling; this.downsampling = downsampling;
} }
/**
* This factory method creates a lifecycle applicable for the data index component of a data stream. This
* means it supports all configuration applicable for backing indices.
*/
public static DataStreamLifecycle createDataLifecycle(
@Nullable Boolean enabled,
@Nullable TimeValue dataRetention,
@Nullable List<DownsamplingRound> downsampling
) {
return new DataStreamLifecycle(enabled, dataRetention, downsampling);
}
/** /**
* Returns true, if this data stream lifecycle configuration is enabled, false otherwise * Returns true, if this data stream lifecycle configuration is enabled, false otherwise
*/ */
@ -542,6 +552,22 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
} }
} }
public static Template createDataLifecycleTemplate(
boolean enabled,
TimeValue dataRetention,
List<DataStreamLifecycle.DownsamplingRound> downsampling
) {
return new Template(enabled, ResettableValue.create(dataRetention), ResettableValue.create(downsampling));
}
public static Template createDataLifecycleTemplate(
boolean enabled,
ResettableValue<TimeValue> dataRetention,
ResettableValue<List<DataStreamLifecycle.DownsamplingRound>> downsampling
) {
return new Template(enabled, dataRetention, downsampling);
}
/** /**
* Represents the template configuration of a lifecycle. It supports explicitly resettable values * Represents the template configuration of a lifecycle. It supports explicitly resettable values
* to allow value reset during template composition. * to allow value reset during template composition.
@ -552,7 +578,7 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
ResettableValue<List<DataStreamLifecycle.DownsamplingRound>> downsampling ResettableValue<List<DataStreamLifecycle.DownsamplingRound>> downsampling
) implements ToXContentObject, Writeable { ) implements ToXContentObject, Writeable {
public Template(boolean enabled, TimeValue dataRetention, List<DataStreamLifecycle.DownsamplingRound> downsampling) { Template(boolean enabled, TimeValue dataRetention, List<DataStreamLifecycle.DownsamplingRound> downsampling) {
this(enabled, ResettableValue.create(dataRetention), ResettableValue.create(downsampling)); this(enabled, ResettableValue.create(dataRetention), ResettableValue.create(downsampling));
} }
@ -736,8 +762,8 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
return new Builder(template); return new Builder(template);
} }
public static Builder builder() { public static Builder dataLifecycleBuilder() {
return new Builder((DataStreamLifecycle) null); return new Builder();
} }
/** /**
@ -750,20 +776,18 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
@Nullable @Nullable
private List<DownsamplingRound> downsampling = null; private List<DownsamplingRound> downsampling = null;
private Builder() {}
private Builder(DataStreamLifecycle.Template template) { private Builder(DataStreamLifecycle.Template template) {
if (template != null) { enabled = template.enabled();
enabled = template.enabled(); dataRetention = template.dataRetention().get();
dataRetention = template.dataRetention().get(); downsampling = template.downsampling().get();
downsampling = template.downsampling().get();
}
} }
private Builder(DataStreamLifecycle lifecycle) { private Builder(DataStreamLifecycle lifecycle) {
if (lifecycle != null) { enabled = lifecycle.enabled();
enabled = lifecycle.enabled(); dataRetention = lifecycle.dataRetention();
dataRetention = lifecycle.dataRetention(); downsampling = lifecycle.downsampling();
downsampling = lifecycle.downsampling();
}
} }
public Builder composeTemplate(DataStreamLifecycle.Template template) { public Builder composeTemplate(DataStreamLifecycle.Template template) {

View file

@ -61,7 +61,9 @@ public class Template implements SimpleDiffable<Template>, ToXContentObject {
a[4] == null ? ResettableValue.undefined() : (ResettableValue<DataStreamOptions.Template>) a[4] a[4] == null ? ResettableValue.undefined() : (ResettableValue<DataStreamOptions.Template>) a[4]
) )
); );
public static final DataStreamLifecycle.Template DISABLED_LIFECYCLE = DataStreamLifecycle.builder().enabled(false).buildTemplate(); public static final DataStreamLifecycle.Template DISABLED_LIFECYCLE = DataStreamLifecycle.dataLifecycleBuilder()
.enabled(false)
.buildTemplate();
static { static {
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), (p, c) -> Settings.fromXContent(p), SETTINGS); PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), (p, c) -> Settings.fromXContent(p), SETTINGS);

View file

@ -99,7 +99,7 @@ public class GetDataStreamActionTests extends ESTestCase {
private static DataStream newDataStreamInstance(boolean isSystem, TimeValue retention) { private static DataStream newDataStreamInstance(boolean isSystem, TimeValue retention) {
List<Index> indices = List.of(new Index(randomAlphaOfLength(10), randomAlphaOfLength(10))); List<Index> indices = List.of(new Index(randomAlphaOfLength(10), randomAlphaOfLength(10)));
DataStreamLifecycle lifecycle = new DataStreamLifecycle(true, retention, null); DataStreamLifecycle lifecycle = DataStreamLifecycle.createDataLifecycle(true, retention, null);
return DataStream.builder(randomAlphaOfLength(50), indices) return DataStream.builder(randomAlphaOfLength(50), indices)
.setGeneration(randomLongBetween(1, 1000)) .setGeneration(randomLongBetween(1, 1000))
.setMetadata(Map.of()) .setMetadata(Map.of())

View file

@ -200,7 +200,7 @@ public class ExplainIndexDataStreamLifecycleTests extends AbstractWireSerializin
TimeValue configuredRetention = TimeValue.timeValueDays(100); TimeValue configuredRetention = TimeValue.timeValueDays(100);
TimeValue globalDefaultRetention = TimeValue.timeValueDays(10); TimeValue globalDefaultRetention = TimeValue.timeValueDays(10);
TimeValue globalMaxRetention = TimeValue.timeValueDays(50); TimeValue globalMaxRetention = TimeValue.timeValueDays(50);
DataStreamLifecycle dataStreamLifecycle = new DataStreamLifecycle(true, configuredRetention, null); DataStreamLifecycle dataStreamLifecycle = DataStreamLifecycle.createDataLifecycle(true, configuredRetention, null);
{ {
boolean isSystemDataStream = true; boolean isSystemDataStream = true;
ExplainIndexDataStreamLifecycle explainIndexDataStreamLifecycle = createManagedIndexDataStreamLifecycleExplanation( ExplainIndexDataStreamLifecycle explainIndexDataStreamLifecycle = createManagedIndexDataStreamLifecycleExplanation(

View file

@ -96,7 +96,7 @@ public class GetDataStreamLifecycleActionTests extends ESTestCase {
TimeValue globalDefaultRetention = TimeValue.timeValueDays(10); TimeValue globalDefaultRetention = TimeValue.timeValueDays(10);
TimeValue globalMaxRetention = TimeValue.timeValueDays(50); TimeValue globalMaxRetention = TimeValue.timeValueDays(50);
DataStreamGlobalRetention globalRetention = new DataStreamGlobalRetention(globalDefaultRetention, globalMaxRetention); DataStreamGlobalRetention globalRetention = new DataStreamGlobalRetention(globalDefaultRetention, globalMaxRetention);
DataStreamLifecycle lifecycle = new DataStreamLifecycle(true, configuredRetention, null); DataStreamLifecycle lifecycle = DataStreamLifecycle.createDataLifecycle(true, configuredRetention, null);
{ {
boolean isInternalDataStream = true; boolean isInternalDataStream = true;
GetDataStreamLifecycleAction.Response.DataStreamLifecycle explainIndexDataStreamLifecycle = createDataStreamLifecycle( GetDataStreamLifecycleAction.Response.DataStreamLifecycle explainIndexDataStreamLifecycle = createDataStreamLifecycle(

View file

@ -90,7 +90,7 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
templateBuilder.aliases(randomAliases()); templateBuilder.aliases(randomAliases());
} }
if (randomBoolean() && supportsDataStreams) { if (randomBoolean() && supportsDataStreams) {
templateBuilder.lifecycle(DataStreamLifecycleTemplateTests.randomLifecycleTemplate()); templateBuilder.lifecycle(DataStreamLifecycleTemplateTests.randomDataLifecycleTemplate());
} }
if (randomBoolean() && supportsDataStreams) { if (randomBoolean() && supportsDataStreams) {
templateBuilder.dataStreamOptions(randomDataStreamOptionsTemplate()); templateBuilder.dataStreamOptions(randomDataStreamOptionsTemplate());
@ -182,7 +182,7 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
); );
case 3 -> new ComponentTemplate( case 3 -> new ComponentTemplate(
Template.builder(ot) Template.builder(ot)
.lifecycle(randomValueOtherThan(ot.lifecycle(), DataStreamLifecycleTemplateTests::randomLifecycleTemplate)) .lifecycle(randomValueOtherThan(ot.lifecycle(), DataStreamLifecycleTemplateTests::randomDataLifecycleTemplate))
.build(), .build(),
orig.version(), orig.version(),
orig.metadata(), orig.metadata(),
@ -273,7 +273,7 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
Settings settings = null; Settings settings = null;
CompressedXContent mappings = null; CompressedXContent mappings = null;
Map<String, AliasMetadata> aliases = null; Map<String, AliasMetadata> aliases = null;
ResettableValue<DataStreamOptions.Template> dataStreamOptions = ResettableValue.undefined(); DataStreamOptions.Template dataStreamOptions = null;
if (randomBoolean()) { if (randomBoolean()) {
settings = randomSettings(); settings = randomSettings();
} }
@ -284,7 +284,8 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
aliases = randomAliases(); aliases = randomAliases();
} }
if (randomBoolean()) { if (randomBoolean()) {
dataStreamOptions = randomDataStreamOptionsTemplate(); // Do not set random lifecycle to avoid having data_retention and effective_retention in the response.
dataStreamOptions = new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(randomBoolean()).buildTemplate());
} }
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.Template.DATA_DEFAULT; DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.Template.DATA_DEFAULT;
ComponentTemplate template = new ComponentTemplate( ComponentTemplate template = new ComponentTemplate(

View file

@ -74,7 +74,7 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
builder.aliases(randomAliases()); builder.aliases(randomAliases());
} }
if (dataStreamTemplate != null && randomBoolean()) { if (dataStreamTemplate != null && randomBoolean()) {
builder.lifecycle(DataStreamLifecycleTemplateTests.randomLifecycleTemplate()); builder.lifecycle(DataStreamLifecycleTemplateTests.randomDataLifecycleTemplate());
} }
template = builder.build(); template = builder.build();
} }
@ -174,7 +174,9 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
.mappings(randomMappings(orig.getDataStreamTemplate())) .mappings(randomMappings(orig.getDataStreamTemplate()))
.aliases(randomAliases()) .aliases(randomAliases())
.lifecycle( .lifecycle(
orig.getDataStreamTemplate() == null ? null : DataStreamLifecycleTemplateTests.randomLifecycleTemplate() orig.getDataStreamTemplate() == null
? null
: DataStreamLifecycleTemplateTests.randomDataLifecycleTemplate()
) )
.build() .build()
) )
@ -221,7 +223,7 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
Settings settings = null; Settings settings = null;
CompressedXContent mappings = null; CompressedXContent mappings = null;
Map<String, AliasMetadata> aliases = null; Map<String, AliasMetadata> aliases = null;
ResettableValue<DataStreamOptions.Template> dataStreamOptions = ResettableValue.undefined(); DataStreamOptions.Template dataStreamOptions = null;
ComposableIndexTemplate.DataStreamTemplate dataStreamTemplate = randomDataStreamTemplate(); ComposableIndexTemplate.DataStreamTemplate dataStreamTemplate = randomDataStreamTemplate();
if (randomBoolean()) { if (randomBoolean()) {
settings = randomSettings(); settings = randomSettings();
@ -233,7 +235,8 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
aliases = randomAliases(); aliases = randomAliases();
} }
if (randomBoolean()) { if (randomBoolean()) {
dataStreamOptions = ComponentTemplateTests.randomDataStreamOptionsTemplate(); // Do not set random lifecycle to avoid having data_retention and effective_retention in the response.
dataStreamOptions = new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(randomBoolean()).buildTemplate());
} }
// We use the empty lifecycle so the global retention can be in effect // We use the empty lifecycle so the global retention can be in effect
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.Template.DATA_DEFAULT; DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.Template.DATA_DEFAULT;

View file

@ -31,7 +31,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
@Override @Override
protected DataStreamLifecycle.Template createTestInstance() { protected DataStreamLifecycle.Template createTestInstance() {
return randomLifecycleTemplate(); return randomDataLifecycleTemplate();
} }
@Override @Override
@ -57,7 +57,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -80,7 +80,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -100,7 +100,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -120,14 +120,14 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder().downsampling((List.of())).buildTemplate() () -> DataStreamLifecycle.dataLifecycleBuilder().downsampling((List.of())).buildTemplate()
); );
assertThat(exception.getMessage(), equalTo("Downsampling configuration should have at least one round configured.")); assertThat(exception.getMessage(), equalTo("Downsampling configuration should have at least one round configured."));
} }
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
Stream.iterate(1, i -> i * 2) Stream.iterate(1, i -> i * 2)
.limit(12) .limit(12)
@ -147,7 +147,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -165,8 +165,8 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
} }
} }
public static DataStreamLifecycle.Template randomLifecycleTemplate() { public static DataStreamLifecycle.Template randomDataLifecycleTemplate() {
return new DataStreamLifecycle.Template(randomBoolean(), randomRetention(), randomDownsampling()); return DataStreamLifecycle.createDataLifecycleTemplate(randomBoolean(), randomRetention(), randomDownsampling());
} }
private static ResettableValue<TimeValue> randomRetention() { private static ResettableValue<TimeValue> randomRetention() {

View file

@ -53,7 +53,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
@Override @Override
protected DataStreamLifecycle createTestInstance() { protected DataStreamLifecycle createTestInstance() {
return randomLifecycle(); return randomDataLifecycle();
} }
@Override @Override
@ -172,7 +172,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -195,7 +195,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -215,7 +215,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -235,14 +235,14 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder().downsampling((List.of())).build() () -> DataStreamLifecycle.dataLifecycleBuilder().downsampling((List.of())).build()
); );
assertThat(exception.getMessage(), equalTo("Downsampling configuration should have at least one round configured.")); assertThat(exception.getMessage(), equalTo("Downsampling configuration should have at least one round configured."));
} }
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
Stream.iterate(1, i -> i * 2) Stream.iterate(1, i -> i * 2)
.limit(12) .limit(12)
@ -262,7 +262,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
{ {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> DataStreamLifecycle.builder() () -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -283,7 +283,9 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
public void testEffectiveRetention() { public void testEffectiveRetention() {
// No retention in the data stream lifecycle // No retention in the data stream lifecycle
{ {
DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.builder().downsampling(randomDownsampling()).build(); DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(randomDownsampling())
.build();
TimeValue maxRetention = TimeValue.timeValueDays(randomIntBetween(50, 100)); TimeValue maxRetention = TimeValue.timeValueDays(randomIntBetween(50, 100));
TimeValue defaultRetention = TimeValue.timeValueDays(randomIntBetween(1, 50)); TimeValue defaultRetention = TimeValue.timeValueDays(randomIntBetween(1, 50));
Tuple<TimeValue, DataStreamLifecycle.RetentionSource> effectiveDataRetentionWithSource = noRetentionLifecycle Tuple<TimeValue, DataStreamLifecycle.RetentionSource> effectiveDataRetentionWithSource = noRetentionLifecycle
@ -316,7 +318,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
// With retention in the data stream lifecycle // With retention in the data stream lifecycle
{ {
TimeValue dataStreamRetention = TimeValue.timeValueDays(randomIntBetween(5, 100)); TimeValue dataStreamRetention = TimeValue.timeValueDays(randomIntBetween(5, 100));
DataStreamLifecycle lifecycleRetention = DataStreamLifecycle.builder() DataStreamLifecycle lifecycleRetention = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(dataStreamRetention) .dataRetention(dataStreamRetention)
.downsampling(randomDownsampling()) .downsampling(randomDownsampling())
.build(); .build();
@ -365,7 +367,7 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
TimeValue.timeValueDays(7), TimeValue.timeValueDays(7),
TimeValue.timeValueDays(90) TimeValue.timeValueDays(90)
); );
DataStreamLifecycle lifecycle = DataStreamLifecycle.builder().dataRetention(dataStreamRetention).build(); DataStreamLifecycle lifecycle = DataStreamLifecycle.dataLifecycleBuilder().dataRetention(dataStreamRetention).build();
// Verify that global retention should have kicked in // Verify that global retention should have kicked in
var effectiveDataRetentionWithSource = lifecycle.getEffectiveDataRetentionWithSource(globalRetention, false); var effectiveDataRetentionWithSource = lifecycle.getEffectiveDataRetentionWithSource(globalRetention, false);
@ -398,8 +400,8 @@ public class DataStreamLifecycleTests extends AbstractXContentSerializingTestCas
} }
} }
public static DataStreamLifecycle randomLifecycle() { public static DataStreamLifecycle randomDataLifecycle() {
return DataStreamLifecycle.builder() return DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(randomBoolean() ? null : randomTimeValue(1, 365, TimeUnit.DAYS)) .dataRetention(randomBoolean() ? null : randomTimeValue(1, 365, TimeUnit.DAYS))
.downsampling(randomBoolean() ? null : randomDownsampling()) .downsampling(randomBoolean() ? null : randomDownsampling())
.enabled(randomBoolean()) .enabled(randomBoolean())

View file

@ -58,13 +58,13 @@ public class DataStreamLifecycleWithRetentionWarningsTests extends ESTestCase {
ThreadContext threadContext = new ThreadContext(Settings.EMPTY); ThreadContext threadContext = new ThreadContext(Settings.EMPTY);
HeaderWarning.setThreadContext(threadContext); HeaderWarning.setThreadContext(threadContext);
DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.builder().downsampling(randomDownsampling()).build(); DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.dataLifecycleBuilder().downsampling(randomDownsampling()).build();
noRetentionLifecycle.addWarningHeaderIfDataRetentionNotEffective(null, randomBoolean()); noRetentionLifecycle.addWarningHeaderIfDataRetentionNotEffective(null, randomBoolean());
Map<String, List<String>> responseHeaders = threadContext.getResponseHeaders(); Map<String, List<String>> responseHeaders = threadContext.getResponseHeaders();
assertThat(responseHeaders.isEmpty(), is(true)); assertThat(responseHeaders.isEmpty(), is(true));
TimeValue dataStreamRetention = TimeValue.timeValueDays(randomIntBetween(5, 100)); TimeValue dataStreamRetention = TimeValue.timeValueDays(randomIntBetween(5, 100));
DataStreamLifecycle lifecycleWithRetention = DataStreamLifecycle.builder() DataStreamLifecycle lifecycleWithRetention = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(dataStreamRetention) .dataRetention(dataStreamRetention)
.downsampling(randomDownsampling()) .downsampling(randomDownsampling())
.build(); .build();
@ -81,7 +81,7 @@ public class DataStreamLifecycleWithRetentionWarningsTests extends ESTestCase {
ThreadContext threadContext = new ThreadContext(Settings.EMPTY); ThreadContext threadContext = new ThreadContext(Settings.EMPTY);
HeaderWarning.setThreadContext(threadContext); HeaderWarning.setThreadContext(threadContext);
DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.builder().downsampling(randomDownsampling()).build(); DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.dataLifecycleBuilder().downsampling(randomDownsampling()).build();
DataStreamGlobalRetention globalRetention = new DataStreamGlobalRetention( DataStreamGlobalRetention globalRetention = new DataStreamGlobalRetention(
randomTimeValue(2, 10, TimeUnit.DAYS), randomTimeValue(2, 10, TimeUnit.DAYS),
randomBoolean() ? null : TimeValue.timeValueDays(20) randomBoolean() ? null : TimeValue.timeValueDays(20)
@ -103,7 +103,7 @@ public class DataStreamLifecycleWithRetentionWarningsTests extends ESTestCase {
ThreadContext threadContext = new ThreadContext(Settings.EMPTY); ThreadContext threadContext = new ThreadContext(Settings.EMPTY);
HeaderWarning.setThreadContext(threadContext); HeaderWarning.setThreadContext(threadContext);
TimeValue maxRetention = randomTimeValue(2, 100, TimeUnit.DAYS); TimeValue maxRetention = randomTimeValue(2, 100, TimeUnit.DAYS);
DataStreamLifecycle lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(randomBoolean() ? null : TimeValue.timeValueDays(maxRetention.days() + 1)) .dataRetention(randomBoolean() ? null : TimeValue.timeValueDays(maxRetention.days() + 1))
.downsampling(randomDownsampling()) .downsampling(randomDownsampling())
.build(); .build();
@ -223,7 +223,7 @@ public class DataStreamLifecycleWithRetentionWarningsTests extends ESTestCase {
"component-template", "component-template",
new ComponentTemplate( new ComponentTemplate(
Template.builder() Template.builder()
.lifecycle(DataStreamLifecycle.builder().dataRetention(randomTimeValue(2, 100, TimeUnit.DAYS))) .lifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomTimeValue(2, 100, TimeUnit.DAYS)))
.build(), .build(),
null, null,
null null

View file

@ -140,7 +140,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
: randomValueOtherThan(indexMode, () -> randomFrom(IndexMode.values())); : randomValueOtherThan(indexMode, () -> randomFrom(IndexMode.values()));
case 9 -> lifecycle = randomBoolean() && lifecycle != null case 9 -> lifecycle = randomBoolean() && lifecycle != null
? null ? null
: DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue()).build(); : DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomPositiveTimeValue()).build();
case 10 -> failureIndices = randomValueOtherThan(failureIndices, DataStreamTestHelper::randomIndexInstances); case 10 -> failureIndices = randomValueOtherThan(failureIndices, DataStreamTestHelper::randomIndexInstances);
case 11 -> dataStreamOptions = dataStreamOptions.isEmpty() ? new DataStreamOptions(new DataStreamFailureStore(randomBoolean())) case 11 -> dataStreamOptions = dataStreamOptions.isEmpty() ? new DataStreamOptions(new DataStreamFailureStore(randomBoolean()))
: randomBoolean() ? DataStreamOptions.EMPTY : randomBoolean() ? DataStreamOptions.EMPTY
@ -1519,7 +1519,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
dataStreamName, dataStreamName,
creationAndRolloverTimes, creationAndRolloverTimes,
settings(IndexVersion.current()).put(IndexMetadata.LIFECYCLE_NAME, "ILM_policy"), settings(IndexVersion.current()).put(IndexMetadata.LIFECYCLE_NAME, "ILM_policy"),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build() DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build()
); );
Metadata metadataWithIlm = builderWithIlm.build(); Metadata metadataWithIlm = builderWithIlm.build();
@ -1784,7 +1784,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
creationAndRolloverTimes, creationAndRolloverTimes,
settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"), .put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -1844,7 +1844,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
creationAndRolloverTimes, creationAndRolloverTimes,
// no TSDB settings // no TSDB settings
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -1910,7 +1910,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
creationAndRolloverTimes, creationAndRolloverTimes,
settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"), .put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder().build() DataStreamLifecycle.dataLifecycleBuilder().build()
); );
Metadata metadata = builder.build(); Metadata metadata = builder.build();
@ -1942,7 +1942,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
dataStreamName, dataStreamName,
creationAndRolloverTimes, creationAndRolloverTimes,
settings(IndexVersion.current()), settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build() DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build()
); );
Metadata metadata = builder.build(); Metadata metadata = builder.build();
@ -2316,7 +2316,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
system, system,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES, randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES,
DataStreamLifecycleTests.randomLifecycle(), DataStreamLifecycleTests.randomDataLifecycle(),
DataStreamOptions.FAILURE_STORE_DISABLED, DataStreamOptions.FAILURE_STORE_DISABLED,
List.of(), List.of(),
replicated == false && randomBoolean(), replicated == false && randomBoolean(),
@ -2334,7 +2334,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
system, system,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES, randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES,
DataStreamLifecycleTests.randomLifecycle(), DataStreamLifecycleTests.randomDataLifecycle(),
DataStreamOptions.FAILURE_STORE_ENABLED, DataStreamOptions.FAILURE_STORE_ENABLED,
List.of(), List.of(),
replicated == false && randomBoolean(), replicated == false && randomBoolean(),
@ -2359,7 +2359,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
system, system,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES, randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES,
DataStreamLifecycleTests.randomLifecycle(), DataStreamLifecycleTests.randomDataLifecycle(),
DataStreamOptions.FAILURE_STORE_ENABLED, DataStreamOptions.FAILURE_STORE_ENABLED,
failureIndices, failureIndices,
replicated == false && randomBoolean(), replicated == false && randomBoolean(),
@ -2383,7 +2383,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
system, system,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES, randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES,
DataStreamLifecycleTests.randomLifecycle(), DataStreamLifecycleTests.randomDataLifecycle(),
DataStreamOptions.FAILURE_STORE_DISABLED, DataStreamOptions.FAILURE_STORE_DISABLED,
List.of(), List.of(),
replicated == false && randomBoolean(), replicated == false && randomBoolean(),
@ -2405,7 +2405,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
system, system,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES, randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES,
DataStreamLifecycleTests.randomLifecycle(), DataStreamLifecycleTests.randomDataLifecycle(),
DataStreamOptions.FAILURE_STORE_ENABLED, DataStreamOptions.FAILURE_STORE_ENABLED,
List.of(), List.of(),
replicated == false && randomBoolean(), replicated == false && randomBoolean(),
@ -2436,7 +2436,7 @@ public class DataStreamTests extends AbstractXContentSerializingTestCase<DataStr
system, system,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES, randomBoolean() ? IndexMode.STANDARD : IndexMode.TIME_SERIES,
DataStreamLifecycleTests.randomLifecycle(), DataStreamLifecycleTests.randomDataLifecycle(),
DataStreamOptions.FAILURE_STORE_ENABLED, DataStreamOptions.FAILURE_STORE_ENABLED,
failureIndices, failureIndices,
replicated == false && randomBoolean(), replicated == false && randomBoolean(),

View file

@ -474,7 +474,7 @@ public class MetadataDataStreamsServiceTests extends MapperServiceTestCase {
public void testUpdateLifecycle() { public void testUpdateLifecycle() {
String dataStream = randomAlphaOfLength(5); String dataStream = randomAlphaOfLength(5);
DataStreamLifecycle lifecycle = DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue()).build(); DataStreamLifecycle lifecycle = DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomPositiveTimeValue()).build();
final var projectId = randomProjectIdOrDefault(); final var projectId = randomProjectIdOrDefault();
ProjectMetadata before = DataStreamTestHelper.getClusterStateWithDataStreams( ProjectMetadata before = DataStreamTestHelper.getClusterStateWithDataStreams(
projectId, projectId,

View file

@ -1490,13 +1490,13 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
DataStreamLifecycle.Template emptyLifecycle = DataStreamLifecycle.Template.DATA_DEFAULT; DataStreamLifecycle.Template emptyLifecycle = DataStreamLifecycle.Template.DATA_DEFAULT;
DataStreamLifecycle.Template lifecycle30d = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle30d = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueDays(30)) .dataRetention(TimeValue.timeValueDays(30))
.buildTemplate(); .buildTemplate();
String ct30d = "ct_30d"; String ct30d = "ct_30d";
project = addComponentTemplate(service, project, ct30d, lifecycle30d); project = addComponentTemplate(service, project, ct30d, lifecycle30d);
DataStreamLifecycle.Template lifecycle45d = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle45d = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueDays(45)) .dataRetention(TimeValue.timeValueDays(45))
.downsampling( .downsampling(
List.of( List.of(
@ -1510,7 +1510,7 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
String ct45d = "ct_45d"; String ct45d = "ct_45d";
project = addComponentTemplate(service, project, ct45d, lifecycle45d); project = addComponentTemplate(service, project, ct45d, lifecycle45d);
DataStreamLifecycle.Template lifecycleNullRetention = new DataStreamLifecycle.Template( DataStreamLifecycle.Template lifecycleNullRetention = DataStreamLifecycle.createDataLifecycleTemplate(
true, true,
ResettableValue.reset(), ResettableValue.reset(),
ResettableValue.undefined() ResettableValue.undefined()
@ -1522,7 +1522,12 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
project = addComponentTemplate(service, project, ctEmptyLifecycle, emptyLifecycle); project = addComponentTemplate(service, project, ctEmptyLifecycle, emptyLifecycle);
String ctDisabledLifecycle = "ct_disabled_lifecycle"; String ctDisabledLifecycle = "ct_disabled_lifecycle";
project = addComponentTemplate(service, project, ctDisabledLifecycle, DataStreamLifecycle.builder().enabled(false).buildTemplate()); project = addComponentTemplate(
service,
project,
ctDisabledLifecycle,
DataStreamLifecycle.dataLifecycleBuilder().enabled(false).buildTemplate()
);
String ctNoLifecycle = "ct_no_lifecycle"; String ctNoLifecycle = "ct_no_lifecycle";
project = addComponentTemplate(service, project, ctNoLifecycle, (DataStreamLifecycle.Template) null); project = addComponentTemplate(service, project, ctNoLifecycle, (DataStreamLifecycle.Template) null);
@ -1554,7 +1559,7 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
project, project,
List.of(ctEmptyLifecycle, ct45d), List.of(ctEmptyLifecycle, ct45d),
lifecycle30d, lifecycle30d,
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(lifecycle30d.dataRetention()) .dataRetention(lifecycle30d.dataRetention())
.downsampling(lifecycle45d.downsampling()) .downsampling(lifecycle45d.downsampling())
.buildTemplate() .buildTemplate()
@ -1578,7 +1583,7 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
project, project,
List.of(ctEmptyLifecycle, ct45d), List.of(ctEmptyLifecycle, ct45d),
lifecycleNullRetention, lifecycleNullRetention,
DataStreamLifecycle.builder().downsampling(lifecycle45d.downsampling()).buildTemplate() DataStreamLifecycle.dataLifecycleBuilder().downsampling(lifecycle45d.downsampling()).buildTemplate()
); );
// Component A: "lifecycle": {"retention": "30d"} // Component A: "lifecycle": {"retention": "30d"}
@ -1589,8 +1594,8 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
service, service,
project, project,
List.of(ct30d, ct45d), List.of(ct30d, ct45d),
DataStreamLifecycle.builder().enabled(false).buildTemplate(), DataStreamLifecycle.dataLifecycleBuilder().enabled(false).buildTemplate(),
DataStreamLifecycle.builder() DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(lifecycle45d.dataRetention()) .dataRetention(lifecycle45d.dataRetention())
.downsampling(lifecycle45d.downsampling()) .downsampling(lifecycle45d.downsampling())
.enabled(false) .enabled(false)
@ -1606,7 +1611,7 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
project, project,
List.of(ct30d, ctDisabledLifecycle), List.of(ct30d, ctDisabledLifecycle),
null, null,
DataStreamLifecycle.builder().dataRetention(lifecycle30d.dataRetention()).enabled(false).buildTemplate() DataStreamLifecycle.dataLifecycleBuilder().dataRetention(lifecycle30d.dataRetention()).enabled(false).buildTemplate()
); );
// Component A: "lifecycle": {"retention": "30d"} // Component A: "lifecycle": {"retention": "30d"}
@ -2007,7 +2012,7 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
ProjectMetadata project = ProjectMetadata.builder(randomProjectIdOrDefault()).build(); ProjectMetadata project = ProjectMetadata.builder(randomProjectIdOrDefault()).build();
ComponentTemplate ct = new ComponentTemplate( ComponentTemplate ct = new ComponentTemplate(
Template.builder().lifecycle(DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue())).build(), Template.builder().lifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomPositiveTimeValue())).build(),
null, null,
null null
); );

View file

@ -363,7 +363,7 @@ public final class DataStreamTestHelper {
timeProvider, timeProvider,
randomBoolean(), randomBoolean(),
randomBoolean() ? IndexMode.STANDARD : null, // IndexMode.TIME_SERIES triggers validation that many unit tests doesn't pass randomBoolean() ? IndexMode.STANDARD : null, // IndexMode.TIME_SERIES triggers validation that many unit tests doesn't pass
randomBoolean() ? DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue()).build() : null, randomBoolean() ? DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomPositiveTimeValue()).build() : null,
failureStore ? DataStreamOptions.FAILURE_STORE_ENABLED : DataStreamOptions.EMPTY, failureStore ? DataStreamOptions.FAILURE_STORE_ENABLED : DataStreamOptions.EMPTY,
DataStream.DataStreamIndices.backingIndicesBuilder(indices) DataStream.DataStreamIndices.backingIndicesBuilder(indices)
.setRolloverOnWrite(replicated == false && randomBoolean()) .setRolloverOnWrite(replicated == false && randomBoolean())

View file

@ -133,7 +133,7 @@ public class DataStreamLifecycleUsageTransportActionIT extends ESIntegTestCase {
boolean systemDataStream = rarely(); boolean systemDataStream = rarely();
if (hasLifecycle) { if (hasLifecycle) {
if (randomBoolean()) { if (randomBoolean()) {
lifecycle = new DataStreamLifecycle(null, null, null); lifecycle = DataStreamLifecycle.DEFAULT_DATA_LIFECYCLE;
dataStreamsWithLifecycleCount.incrementAndGet(); dataStreamsWithLifecycleCount.incrementAndGet();
if (useDefaultRetention && systemDataStream == false) { if (useDefaultRetention && systemDataStream == false) {
dataStreamsWithDefaultRetentionCount.incrementAndGet(); dataStreamsWithDefaultRetentionCount.incrementAndGet();
@ -155,7 +155,7 @@ public class DataStreamLifecycleUsageTransportActionIT extends ESIntegTestCase {
} }
atLeastOne = true; atLeastOne = true;
} }
lifecycle = DataStreamLifecycle.builder() lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueMillis(retentionMillis)) .dataRetention(TimeValue.timeValueMillis(retentionMillis))
.enabled(isEnabled) .enabled(isEnabled)
.build(); .build();

View file

@ -117,7 +117,7 @@ public class DataStreamLifecycleFeatureSetUsageTests extends AbstractWireSeriali
1L, 1L,
null, null,
false, false,
new DataStreamLifecycle(true, TimeValue.timeValueSeconds(50), null) DataStreamLifecycle.createDataLifecycle(true, TimeValue.timeValueSeconds(50), null)
), ),
DataStreamTestHelper.newInstance( DataStreamTestHelper.newInstance(
randomAlphaOfLength(10), randomAlphaOfLength(10),
@ -125,7 +125,7 @@ public class DataStreamLifecycleFeatureSetUsageTests extends AbstractWireSeriali
1L, 1L,
null, null,
false, false,
new DataStreamLifecycle(true, TimeValue.timeValueMillis(150), null) DataStreamLifecycle.createDataLifecycle(true, TimeValue.timeValueMillis(150), null)
), ),
DataStreamTestHelper.newInstance( DataStreamTestHelper.newInstance(
randomAlphaOfLength(10), randomAlphaOfLength(10),
@ -133,7 +133,7 @@ public class DataStreamLifecycleFeatureSetUsageTests extends AbstractWireSeriali
1L, 1L,
null, null,
false, false,
new DataStreamLifecycle(false, TimeValue.timeValueSeconds(5), null) DataStreamLifecycle.createDataLifecycle(false, TimeValue.timeValueSeconds(5), null)
), ),
DataStreamTestHelper.newInstance( DataStreamTestHelper.newInstance(
randomAlphaOfLength(10), randomAlphaOfLength(10),

View file

@ -59,7 +59,7 @@ public class DataStreamLifecycleDownsampleDisruptionIT extends ESIntegTestCase {
ensureGreen(); ensureGreen();
final String dataStreamName = "metrics-foo"; final String dataStreamName = "metrics-foo";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(

View file

@ -54,7 +54,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
public void testDownsampling() throws Exception { public void testDownsampling() throws Exception {
String dataStreamName = "metrics-foo"; String dataStreamName = "metrics-foo";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -127,7 +127,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
public void testDownsamplingOnlyExecutesTheLastMatchingRound() throws Exception { public void testDownsamplingOnlyExecutesTheLastMatchingRound() throws Exception {
String dataStreamName = "metrics-bar"; String dataStreamName = "metrics-bar";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -195,7 +195,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
// we expect the earlier round to be ignored // we expect the earlier round to be ignored
String dataStreamName = "metrics-baz"; String dataStreamName = "metrics-baz";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -259,7 +259,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
// update the lifecycle so that it only has one round, for the same `after` parameter as before, but a different interval // update the lifecycle so that it only has one round, for the same `after` parameter as before, but a different interval
// the different interval should yield a different downsample index name so we expect the data stream lifecycle to get the previous // the different interval should yield a different downsample index name so we expect the data stream lifecycle to get the previous
// `10s` interval downsample index, downsample it to `30s` and replace it in the data stream instead of the `10s` one. // `10s` interval downsample index, downsample it to `30s` and replace it in the data stream instead of the `10s` one.
DataStreamLifecycle updatedLifecycle = DataStreamLifecycle.builder() DataStreamLifecycle updatedLifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(

View file

@ -157,7 +157,7 @@ public class DataStreamAndIndexLifecycleMixingTests extends ESIntegTestCase {
// we'll rollover the data stream by indexing 2 documents (like ILM expects) and assert that the rollover happens once so the // we'll rollover the data stream by indexing 2 documents (like ILM expects) and assert that the rollover happens once so the
// data stream has 3 backing indices, two managed by ILM and one will be managed by the data stream lifecycle // data stream has 3 backing indices, two managed by ILM and one will be managed by the data stream lifecycle
DataStreamLifecycle.Template customLifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template customLifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(randomPositiveTimeValue()) .dataRetention(randomPositiveTimeValue())
.buildTemplate(); .buildTemplate();
putComposableIndexTemplate(indexTemplateName, null, List.of(dataStreamName + "*"), Settings.EMPTY, null, customLifecycle); putComposableIndexTemplate(indexTemplateName, null, List.of(dataStreamName + "*"), Settings.EMPTY, null, customLifecycle);
@ -485,7 +485,7 @@ public class DataStreamAndIndexLifecycleMixingTests extends ESIntegTestCase {
// we'll rollover the data stream by indexing 2 documents (like ILM expects) and assert that the rollover happens once so the // we'll rollover the data stream by indexing 2 documents (like ILM expects) and assert that the rollover happens once so the
// data stream has 3 backing indices, 2 managed by ILM and 1 by the default data stream lifecycle // data stream has 3 backing indices, 2 managed by ILM and 1 by the default data stream lifecycle
DataStreamLifecycle.Template customLifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template customLifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(randomPositiveTimeValue()) .dataRetention(randomPositiveTimeValue())
.buildTemplate(); .buildTemplate();
putComposableIndexTemplate( putComposableIndexTemplate(

View file

@ -120,7 +120,7 @@ public class DataStreamLifecycleDownsamplingSecurityIT extends SecurityIntegTest
public void testDownsamplingAuthorized() throws Exception { public void testDownsamplingAuthorized() throws Exception {
String dataStreamName = "metrics-foo"; String dataStreamName = "metrics-foo";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder() DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(
@ -410,7 +410,7 @@ public class DataStreamLifecycleDownsamplingSecurityIT extends SecurityIntegTest
public static class SystemDataStreamWithDownsamplingConfigurationPlugin extends Plugin implements SystemIndexPlugin { public static class SystemDataStreamWithDownsamplingConfigurationPlugin extends Plugin implements SystemIndexPlugin {
public static final DataStreamLifecycle.Template LIFECYCLE = DataStreamLifecycle.builder() public static final DataStreamLifecycle.Template LIFECYCLE = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling( .downsampling(
List.of( List.of(
new DataStreamLifecycle.DownsamplingRound( new DataStreamLifecycle.DownsamplingRound(

View file

@ -46,6 +46,7 @@ import org.elasticsearch.xpack.security.LocalStateSecurity;
import org.elasticsearch.xpack.wildcard.Wildcard; import org.elasticsearch.xpack.wildcard.Wildcard;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -221,7 +222,7 @@ public class DataStreamLifecycleServiceRuntimeSecurityIT extends SecurityIntegTe
ExecutionException { ExecutionException {
var dataLifecycle = retention == null var dataLifecycle = retention == null
? DataStreamLifecycle.Template.DATA_DEFAULT ? DataStreamLifecycle.Template.DATA_DEFAULT
: new DataStreamLifecycle.Template(true, retention, null); : DataStreamLifecycle.dataLifecycleBuilder().enabled(true).dataRetention(retention).buildTemplate();
putComposableIndexTemplate("id1", """ putComposableIndexTemplate("id1", """
{ {
"properties": { "properties": {
@ -357,7 +358,7 @@ public class DataStreamLifecycleServiceRuntimeSecurityIT extends SecurityIntegTe
} }
} }
}""")) }"""))
.lifecycle(DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO)) .lifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO))
.dataStreamOptions(new DataStreamOptions.Template(new DataStreamFailureStore.Template(true))) .dataStreamOptions(new DataStreamOptions.Template(new DataStreamFailureStore.Template(true)))
) )
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate()) .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
@ -373,11 +374,8 @@ public class DataStreamLifecycleServiceRuntimeSecurityIT extends SecurityIntegTe
) )
); );
} catch (IOException e) { } catch (IOException e) {
fail(e.getMessage()); throw new UncheckedIOException(e);
} }
throw new IllegalStateException(
"Something went wrong, it should have either returned the descriptor or it should have thrown an assertion error"
);
} }
@Override @Override