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 {
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);
int numDocsFoo = randomIntBetween(2, 16);
indexDocs("metrics-foo", numDocsFoo);

View file

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

View file

@ -25,7 +25,7 @@ import java.util.Collection;
import java.util.List;
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.is;
import static org.hamcrest.Matchers.notNullValue;
@ -39,7 +39,7 @@ public class CrudDataStreamLifecycleIT extends ESIntegTestCase {
}
public void testGetLifecycle() throws Exception {
DataStreamLifecycle.Template lifecycle = randomLifecycleTemplate();
DataStreamLifecycle.Template lifecycle = randomDataLifecycleTemplate();
putComposableIndexTemplate("id1", null, List.of("with-lifecycle*"), null, null, lifecycle);
putComposableIndexTemplate("id2", null, List.of("without-lifecycle*"), null, null, null);
{
@ -226,7 +226,9 @@ public class CrudDataStreamLifecycleIT extends ESIntegTestCase {
}
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("id2", null, List.of("without-lifecycle*"), null, null, null);
{

View file

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

View file

@ -168,7 +168,7 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
}
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);
@ -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
* 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);
@ -836,7 +838,7 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
public void testReenableDataStreamLifecycle() throws Exception {
// 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);
String dataStreamName = "metrics-foo";
@ -892,7 +894,7 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
public void testLifecycleAppliedToFailureStore() throws Exception {
// 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))
.downsampling(
List.of(
@ -1088,7 +1090,8 @@ public class DataStreamLifecycleServiceIT extends ESIntegTestCase {
Template.builder()
.settings(Settings.EMPTY)
.lifecycle(
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(SYSTEM_DATA_STREAM_RETENTION_DAYS))
DataStreamLifecycle.dataLifecycleBuilder()
.dataRetention(TimeValue.timeValueDays(SYSTEM_DATA_STREAM_RETENTION_DAYS))
)
)
.build(),

View file

@ -265,7 +265,7 @@ public class ExplainDataStreamLifecycleIT extends ESIntegTestCase {
null,
null,
DataStreamLifecycle.Template.DATA_DEFAULT,
new DataStreamOptions.Template(new DataStreamFailureStore.Template(true))
new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate())
);
String dataStreamName = "metrics-foo";
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
@ -400,7 +400,7 @@ public class ExplainDataStreamLifecycleIT extends ESIntegTestCase {
null,
null,
lifecycle,
new DataStreamOptions.Template(new DataStreamFailureStore.Template(true))
new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate())
);
String dataStreamName = "metrics-foo";
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
@ -501,7 +501,7 @@ public class ExplainDataStreamLifecycleIT extends ESIntegTestCase {
List.of("metrics-foo*"),
null,
null,
DataStreamLifecycle.builder().enabled(false).buildTemplate()
DataStreamLifecycle.dataLifecycleBuilder().enabled(false).buildTemplate()
);
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
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.DataStreamFailureStore;
import org.elasticsearch.cluster.metadata.DataStreamOptions;
import org.elasticsearch.cluster.metadata.ResettableValue;
import org.elasticsearch.cluster.metadata.Template;
import org.elasticsearch.common.compress.CompressedXContent;
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 {
String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.getDefault());
ResettableValue<DataStreamOptions.Template> failureStoreOptions = failureStore == false
? ResettableValue.undefined()
: ResettableValue.create(
new DataStreamOptions.Template(ResettableValue.create(new DataStreamFailureStore.Template(ResettableValue.create(true))))
);
DataStreamOptions.Template failureStoreOptions = failureStore == false
? null
: new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate());
Template idxTemplate = new Template(null, new CompressedXContent("""
{"properties":{"@timestamp":{"type":"date"},"data":{"type":"keyword"}}}
"""), null, null, failureStoreOptions);

View file

@ -144,7 +144,11 @@ public class MetadataIndexTemplateServiceTests extends ESSingleNodeTestCase {
}
// 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);
DataStreamLifecycle result = composeDataLifecycles(lifecycles).build();
// 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
// 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);
DataStreamLifecycle result = composeDataLifecycles(lifecycles).build();
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
{
DataStreamLifecycle.Template lifecycle1 = new DataStreamLifecycle.Template(false, randomPositiveTimeValue(), randomRounds());
DataStreamLifecycle.Template lifecycle2 = new DataStreamLifecycle.Template(true, randomPositiveTimeValue(), randomRounds());
DataStreamLifecycle.Template lifecycle1 = DataStreamLifecycle.createDataLifecycleTemplate(
false,
randomPositiveTimeValue(),
randomRounds()
);
DataStreamLifecycle.Template lifecycle2 = DataStreamLifecycle.createDataLifecycleTemplate(
true,
randomPositiveTimeValue(),
randomRounds()
);
List<DataStreamLifecycle.Template> lifecycles = List.of(lifecycle1, lifecycle2);
DataStreamLifecycle result = composeDataLifecycles(lifecycles).build();
assertThat(result.enabled(), equalTo(lifecycle2.enabled()));

View file

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

View file

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

View file

@ -206,7 +206,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices,
2,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build(),
now
);
builder.put(dataStream);
@ -269,7 +269,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices,
numFailureIndices,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now
);
builder.put(dataStream);
@ -304,7 +304,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStream.copy()
.setName(dataStreamName)
.setGeneration(dataStream.getGeneration() + 1)
.setLifecycle(DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build())
.setLifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build())
.build()
);
clusterState = ClusterState.builder(clusterState).putProjectMetadata(builder).build();
@ -343,7 +343,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStream.copy()
.setName(dataStreamName)
.setGeneration(dataStream.getGeneration() + 1)
.setLifecycle(DataStreamLifecycle.builder().build())
.setLifecycle(DataStreamLifecycle.dataLifecycleBuilder().build())
.build()
);
clusterState = ClusterState.builder(clusterState).putProjectMetadata(builder).build();
@ -378,7 +378,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamName,
numBackingIndices,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueMillis(0)).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueMillis(0)).build(),
now
);
builder.put(dataStream);
@ -456,7 +456,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
Settings.builder()
.put(IndexMetadata.LIFECYCLE_NAME, "ILM_policy")
.put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build(),
now
);
builder.put(dataStream);
@ -548,7 +548,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamName,
numBackingIndices,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now
);
// all backing indices are in the error store
@ -586,7 +586,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
ilmManagedDataStreamName,
3,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now
);
// all backing indices are in the error store
@ -600,7 +600,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamWithBackingIndicesInErrorState,
5,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(700)).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(700)).build(),
now
);
// put all backing indices in the error store
@ -652,7 +652,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices,
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),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now
);
builder.put(dataStream);
@ -754,7 +754,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices,
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),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now
);
builder.put(dataStream);
@ -916,7 +916,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
1L,
null,
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);
@ -1091,7 +1091,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
dataStreamName,
numBackingIndices,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.MAX_VALUE).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.MAX_VALUE).build(),
now
);
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(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder()
DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
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(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder()
DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(new DownsamplingRound(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m"))))
)
@ -1512,7 +1512,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
numBackingIndices,
2,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.ZERO).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.ZERO).build(),
now
).copy().setDataStreamOptions(DataStreamOptions.FAILURE_STORE_DISABLED).build(); // failure store is managed even when disabled
builder.put(dataStream);
@ -1581,7 +1581,7 @@ public class DataStreamLifecycleServiceTests extends ESTestCase {
2,
settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES)
.put("index.routing_path", "@timestamp"),
DataStreamLifecycle.builder()
DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
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",
numBackingIndices,
settings(IndexVersion.current()),
DataStreamLifecycle.builder().dataRetention(TimeValue.timeValueDays(10)).build(),
DataStreamLifecycle.dataLifecycleBuilder().dataRetention(TimeValue.timeValueDays(10)).build(),
Clock.systemUTC().millis()
);
indicesInError.add(dslDataStream.getIndices().get(randomInt(numBackingIndices - 1)).getName());
@ -131,7 +131,7 @@ public class TransportGetDataStreamLifecycleStatsActionTests extends ESTestCase
IndexMetadata indexMetadata = indexMetaBuilder.build();
builder.put(indexMetadata, false);
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();
when(errorStore.getAllIndices(project.id())).thenReturn(indicesInError);

View file

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

View file

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

View file

@ -86,7 +86,7 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
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";
@ -132,17 +132,27 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
@Nullable
private final List<DownsamplingRound> downsampling;
public DataStreamLifecycle(
@Nullable Boolean enabled,
@Nullable TimeValue dataRetention,
@Nullable List<DownsamplingRound> downsampling
) {
// Visible for testing, preferably use the factory methods that are specialised by lifecycle type,
// for example for the data component.
DataStreamLifecycle(@Nullable Boolean enabled, @Nullable TimeValue dataRetention, @Nullable List<DownsamplingRound> downsampling) {
this.enabled = enabled == null || enabled;
this.dataRetention = dataRetention;
DownsamplingRound.validateRounds(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
*/
@ -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
* to allow value reset during template composition.
@ -552,7 +578,7 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
ResettableValue<List<DataStreamLifecycle.DownsamplingRound>> downsampling
) 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));
}
@ -736,8 +762,8 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
return new Builder(template);
}
public static Builder builder() {
return new Builder((DataStreamLifecycle) null);
public static Builder dataLifecycleBuilder() {
return new Builder();
}
/**
@ -750,21 +776,19 @@ public class DataStreamLifecycle implements SimpleDiffable<DataStreamLifecycle>,
@Nullable
private List<DownsamplingRound> downsampling = null;
private Builder() {}
private Builder(DataStreamLifecycle.Template template) {
if (template != null) {
enabled = template.enabled();
dataRetention = template.dataRetention().get();
downsampling = template.downsampling().get();
}
}
private Builder(DataStreamLifecycle lifecycle) {
if (lifecycle != null) {
enabled = lifecycle.enabled();
dataRetention = lifecycle.dataRetention();
downsampling = lifecycle.downsampling();
}
}
public Builder composeTemplate(DataStreamLifecycle.Template template) {
enabled(template.enabled());

View file

@ -61,7 +61,9 @@ public class Template implements SimpleDiffable<Template>, ToXContentObject {
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 {
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) {
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)
.setGeneration(randomLongBetween(1, 1000))
.setMetadata(Map.of())

View file

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

View file

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

View file

@ -90,7 +90,7 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
templateBuilder.aliases(randomAliases());
}
if (randomBoolean() && supportsDataStreams) {
templateBuilder.lifecycle(DataStreamLifecycleTemplateTests.randomLifecycleTemplate());
templateBuilder.lifecycle(DataStreamLifecycleTemplateTests.randomDataLifecycleTemplate());
}
if (randomBoolean() && supportsDataStreams) {
templateBuilder.dataStreamOptions(randomDataStreamOptionsTemplate());
@ -182,7 +182,7 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
);
case 3 -> new ComponentTemplate(
Template.builder(ot)
.lifecycle(randomValueOtherThan(ot.lifecycle(), DataStreamLifecycleTemplateTests::randomLifecycleTemplate))
.lifecycle(randomValueOtherThan(ot.lifecycle(), DataStreamLifecycleTemplateTests::randomDataLifecycleTemplate))
.build(),
orig.version(),
orig.metadata(),
@ -273,7 +273,7 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
Settings settings = null;
CompressedXContent mappings = null;
Map<String, AliasMetadata> aliases = null;
ResettableValue<DataStreamOptions.Template> dataStreamOptions = ResettableValue.undefined();
DataStreamOptions.Template dataStreamOptions = null;
if (randomBoolean()) {
settings = randomSettings();
}
@ -284,7 +284,8 @@ public class ComponentTemplateTests extends SimpleDiffableSerializationTestCase<
aliases = randomAliases();
}
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;
ComponentTemplate template = new ComponentTemplate(

View file

@ -74,7 +74,7 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
builder.aliases(randomAliases());
}
if (dataStreamTemplate != null && randomBoolean()) {
builder.lifecycle(DataStreamLifecycleTemplateTests.randomLifecycleTemplate());
builder.lifecycle(DataStreamLifecycleTemplateTests.randomDataLifecycleTemplate());
}
template = builder.build();
}
@ -174,7 +174,9 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
.mappings(randomMappings(orig.getDataStreamTemplate()))
.aliases(randomAliases())
.lifecycle(
orig.getDataStreamTemplate() == null ? null : DataStreamLifecycleTemplateTests.randomLifecycleTemplate()
orig.getDataStreamTemplate() == null
? null
: DataStreamLifecycleTemplateTests.randomDataLifecycleTemplate()
)
.build()
)
@ -221,7 +223,7 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
Settings settings = null;
CompressedXContent mappings = null;
Map<String, AliasMetadata> aliases = null;
ResettableValue<DataStreamOptions.Template> dataStreamOptions = ResettableValue.undefined();
DataStreamOptions.Template dataStreamOptions = null;
ComposableIndexTemplate.DataStreamTemplate dataStreamTemplate = randomDataStreamTemplate();
if (randomBoolean()) {
settings = randomSettings();
@ -233,7 +235,8 @@ public class ComposableIndexTemplateTests extends SimpleDiffableSerializationTes
aliases = randomAliases();
}
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
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.Template.DATA_DEFAULT;

View file

@ -31,7 +31,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
@Override
protected DataStreamLifecycle.Template createTestInstance() {
return randomLifecycleTemplate();
return randomDataLifecycleTemplate();
}
@Override
@ -57,7 +57,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{
IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class,
() -> DataStreamLifecycle.builder()
() -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -80,7 +80,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{
IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class,
() -> DataStreamLifecycle.builder()
() -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -100,7 +100,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{
IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class,
() -> DataStreamLifecycle.builder()
() -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -120,14 +120,14 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{
IllegalArgumentException exception = expectThrows(
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."));
}
{
IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class,
() -> DataStreamLifecycle.builder()
() -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
Stream.iterate(1, i -> i * 2)
.limit(12)
@ -147,7 +147,7 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
{
IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class,
() -> DataStreamLifecycle.builder()
() -> DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -165,8 +165,8 @@ public class DataStreamLifecycleTemplateTests extends AbstractXContentSerializin
}
}
public static DataStreamLifecycle.Template randomLifecycleTemplate() {
return new DataStreamLifecycle.Template(randomBoolean(), randomRetention(), randomDownsampling());
public static DataStreamLifecycle.Template randomDataLifecycleTemplate() {
return DataStreamLifecycle.createDataLifecycleTemplate(randomBoolean(), randomRetention(), randomDownsampling());
}
private static ResettableValue<TimeValue> randomRetention() {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -363,7 +363,7 @@ public final class DataStreamTestHelper {
timeProvider,
randomBoolean(),
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,
DataStream.DataStreamIndices.backingIndicesBuilder(indices)
.setRolloverOnWrite(replicated == false && randomBoolean())

View file

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

View file

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

View file

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

View file

@ -54,7 +54,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
public void testDownsampling() throws Exception {
String dataStreamName = "metrics-foo";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder()
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -127,7 +127,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
public void testDownsamplingOnlyExecutesTheLastMatchingRound() throws Exception {
String dataStreamName = "metrics-bar";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder()
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -195,7 +195,7 @@ public class DataStreamLifecycleDownsampleIT extends ESIntegTestCase {
// we expect the earlier round to be ignored
String dataStreamName = "metrics-baz";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder()
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
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
// 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.
DataStreamLifecycle updatedLifecycle = DataStreamLifecycle.builder()
DataStreamLifecycle updatedLifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
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
// 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())
.buildTemplate();
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
// 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())
.buildTemplate();
putComposableIndexTemplate(

View file

@ -120,7 +120,7 @@ public class DataStreamLifecycleDownsamplingSecurityIT extends SecurityIntegTest
public void testDownsamplingAuthorized() throws Exception {
String dataStreamName = "metrics-foo";
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.builder()
DataStreamLifecycle.Template lifecycle = DataStreamLifecycle.dataLifecycleBuilder()
.downsampling(
List.of(
new DataStreamLifecycle.DownsamplingRound(
@ -410,7 +410,7 @@ public class DataStreamLifecycleDownsamplingSecurityIT extends SecurityIntegTest
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(
List.of(
new DataStreamLifecycle.DownsamplingRound(

View file

@ -46,6 +46,7 @@ import org.elasticsearch.xpack.security.LocalStateSecurity;
import org.elasticsearch.xpack.wildcard.Wildcard;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@ -221,7 +222,7 @@ public class DataStreamLifecycleServiceRuntimeSecurityIT extends SecurityIntegTe
ExecutionException {
var dataLifecycle = retention == null
? DataStreamLifecycle.Template.DATA_DEFAULT
: new DataStreamLifecycle.Template(true, retention, null);
: DataStreamLifecycle.dataLifecycleBuilder().enabled(true).dataRetention(retention).buildTemplate();
putComposableIndexTemplate("id1", """
{
"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)))
)
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
@ -373,11 +374,8 @@ public class DataStreamLifecycleServiceRuntimeSecurityIT extends SecurityIntegTe
)
);
} 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