diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java index 7c0ccbfc116a9..968aab2dceab6 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java @@ -1384,7 +1384,9 @@ public void testSearchAllResolvesDataStreams() throws Exception { 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); diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/SystemDataStreamIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/SystemDataStreamIT.java index 0b39ae7855967..4b773e79fe354 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/SystemDataStreamIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/SystemDataStreamIT.java @@ -401,17 +401,23 @@ public Collection getSystemDataStreamDescriptors() { Type.EXTERNAL, ComposableIndexTemplate.builder() .indexPatterns(List.of(".test-failure-store")) - .template(Template.builder().mappings(new CompressedXContent(""" - { - "properties": { - "@timestamp" : { - "type": "date" - }, - "count": { - "type": "long" - } - } - }""")).dataStreamOptions(new DataStreamOptions.Template(new DataStreamFailureStore.Template(true)))) + .template( + Template.builder() + .mappings(new CompressedXContent(""" + { + "properties": { + "@timestamp" : { + "type": "date" + }, + "count": { + "type": "long" + } + } + }""")) + .dataStreamOptions( + new DataStreamOptions.Template(DataStreamFailureStore.builder().enabled(true).buildTemplate()) + ) + ) .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate()) .build(), Map.of(), diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudDataStreamLifecycleIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudDataStreamLifecycleIT.java index 7ab58163f0a2f..b82ee87952568 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudDataStreamLifecycleIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudDataStreamLifecycleIT.java @@ -25,7 +25,7 @@ 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 @@ protected Collection> nodePlugins() { } 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 void testPutLifecycle() 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("id2", null, List.of("without-lifecycle*"), null, null, null); { diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudSystemDataStreamLifecycleIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudSystemDataStreamLifecycleIT.java index 4119ef2f34de8..1173ad95006cf 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudSystemDataStreamLifecycleIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudSystemDataStreamLifecycleIT.java @@ -207,7 +207,7 @@ public Collection getSystemDataStreamDescriptors() { Template.builder() .settings(Settings.EMPTY) .mappings(mappings) - .lifecycle(DataStreamLifecycle.builder().dataRetention(randomPositiveTimeValue())) + .lifecycle(DataStreamLifecycle.dataLifecycleBuilder().dataRetention(randomPositiveTimeValue())) ) .dataStreamTemplate(new DataStreamTemplate()) .build(), diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceIT.java index cc1a5af0d6760..8a1e01bfe3f5a 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceIT.java @@ -168,7 +168,7 @@ public void testRolloverLifecycle() 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); @@ -290,7 +290,9 @@ public void testOriginationDate() throws Exception { * 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 void testDataLifecycleServiceConfiguresTheMergePolicy() throws Exception 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 void testReenableDataStreamLifecycle() throws Exception { 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 Collection getSystemDataStreamDescriptors() { 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(), diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/ExplainDataStreamLifecycleIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/ExplainDataStreamLifecycleIT.java index 7f5fd14fd45d6..87fd46d715329 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/ExplainDataStreamLifecycleIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/ExplainDataStreamLifecycleIT.java @@ -265,7 +265,7 @@ public void testExplainFailuresLifecycle() throws Exception { 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 void testExplainLifecycleForIndicesWithErrors() throws Exception { 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 void testExplainDataStreamLifecycleForUnmanagedIndices() throws Exception 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, diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamsStatsTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamsStatsTests.java index e8fbb46b430ba..6f0f2935449da 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamsStatsTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/DataStreamsStatsTests.java @@ -27,7 +27,6 @@ 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 @@ private String createDataStream() throws Exception { private String createDataStream(boolean hidden, boolean failureStore) throws Exception { String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.getDefault()); - ResettableValue 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); diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/MetadataIndexTemplateServiceTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/MetadataIndexTemplateServiceTests.java index a7414b8a231c4..8a6d510ad1bd8 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/MetadataIndexTemplateServiceTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/MetadataIndexTemplateServiceTests.java @@ -144,7 +144,11 @@ public void testLifecycleComposition() { } // 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 lifecycles = List.of(lifecycle); DataStreamLifecycle result = composeDataLifecycles(lifecycles).build(); // Defaults to true @@ -155,7 +159,11 @@ public void testLifecycleComposition() { // 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 lifecycles = List.of(lifecycle, DataStreamLifecycle.Template.DATA_DEFAULT); DataStreamLifecycle result = composeDataLifecycles(lifecycles).build(); assertThat(result.enabled(), equalTo(true)); @@ -164,8 +172,16 @@ public void testLifecycleComposition() { } // 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 lifecycles = List.of(lifecycle1, lifecycle2); DataStreamLifecycle result = composeDataLifecycles(lifecycles).build(); assertThat(result.enabled(), equalTo(lifecycle2.enabled())); diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/GetDataStreamsResponseTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/GetDataStreamsResponseTests.java index e6428b8d785b5..d0b2db97e3395 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/GetDataStreamsResponseTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/GetDataStreamsResponseTests.java @@ -153,7 +153,7 @@ public void testResponseIlmAndDataStreamLifecycleRepresentation() throws Excepti .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(); diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleFixtures.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleFixtures.java index 78bf365efa846..91afe3a15dce4 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleFixtures.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleFixtures.java @@ -128,8 +128,8 @@ static void putComposableIndexTemplate( 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) diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceTests.java index 37301fbf403a8..6dc5a3eb526a9 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/DataStreamLifecycleServiceTests.java @@ -206,7 +206,7 @@ public void testOperationsExecutedOnce() { 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 void testRetentionNotExecutedDueToAge() { 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 void testRetentionNotExecutedForTSIndicesWithinTimeBounds() { 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 void testMergePolicyNotExecutedForTSIndicesWithinTimeBounds() { 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 void testRetentionSkippedWhilstDownsamplingInProgress() { 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 void testIlmManagedIndicesAreSkipped() { 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 void testErrorStoreIsClearedOnBackingIndexBecomingUnmanaged() { 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 void testBackingIndicesFromMultipleDataStreamsInErrorStore() { 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 void testBackingIndicesFromMultipleDataStreamsInErrorStore() { 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 void testForceMerge() throws Exception { 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 void testForceMergeRetries() throws Exception { 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 void testForceMergeDedup() throws Exception { 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 void testMergePolicySettingsAreConfiguredBeforeForcemerge() throws Except 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 void testDownsampling() throws Exception { .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 void testDownsamplingWhenTargetIndexNameClashYieldsException() throws Exc .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 void testFailureStoreIsManagedEvenWhenDisabled() { 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 @@ private ClusterState downsampleSetup(ProjectId projectId, String dataStreamName, 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")))) ) diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java index 6135411f14ea2..6f110078fb122 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java @@ -95,7 +95,7 @@ public void testMixedDataStreams() { "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 void testMixedDataStreams() { 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); diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/downsampling/DeleteSourceAndAddDownsampleToDSTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/downsampling/DeleteSourceAndAddDownsampleToDSTests.java index d860840dfe2c5..0bfbf76bbfca0 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/downsampling/DeleteSourceAndAddDownsampleToDSTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/downsampling/DeleteSourceAndAddDownsampleToDSTests.java @@ -52,7 +52,7 @@ public void testDownsampleIndexMissingIsNoOp() { 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 void testDownsampleIsAddedToDSEvenIfSourceDeleted() { 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 void testSourceIndexIsWriteIndexThrowsException() { 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 void testSourceIsDeleteAndDownsampleOriginationDateIsConfigured() { 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 void testSourceWithoutLifecycleMetaAndDestWithOriginationDateAlreadyConfi 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 void testSourceIndexIsDeleteEvenIfNotPartOfDSAnymore() { 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); diff --git a/server/src/main/java/org/elasticsearch/action/datastreams/lifecycle/PutDataStreamLifecycleAction.java b/server/src/main/java/org/elasticsearch/action/datastreams/lifecycle/PutDataStreamLifecycleAction.java index 1dbfb97851aa6..45b71fd63cb16 100644 --- a/server/src/main/java/org/elasticsearch/action/datastreams/lifecycle/PutDataStreamLifecycleAction.java +++ b/server/src/main/java/org/elasticsearch/action/datastreams/lifecycle/PutDataStreamLifecycleAction.java @@ -149,7 +149,7 @@ public Request( ) { super(masterNodeTimeout, ackTimeout); this.names = names; - this.lifecycle = DataStreamLifecycle.builder() + this.lifecycle = DataStreamLifecycle.dataLifecycleBuilder() .dataRetention(dataRetention) .enabled(enabled == null || enabled) .downsampling(downsampling) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamLifecycle.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamLifecycle.java index fdae853292457..d578b3ce72bcb 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamLifecycle.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamLifecycle.java @@ -86,7 +86,7 @@ public static boolean isDataStreamsLifecycleOnlyMode(final Settings settings) { 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 static boolean isDataStreamsLifecycleOnlyMode(final Settings settings) { @Nullable private final List downsampling; - public DataStreamLifecycle( - @Nullable Boolean enabled, - @Nullable TimeValue dataRetention, - @Nullable List 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 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 downsampling + ) { + return new DataStreamLifecycle(enabled, dataRetention, downsampling); + } + /** * Returns true, if this data stream lifecycle configuration is enabled, false otherwise */ @@ -542,6 +552,22 @@ public String toString() { } } + public static Template createDataLifecycleTemplate( + boolean enabled, + TimeValue dataRetention, + List downsampling + ) { + return new Template(enabled, ResettableValue.create(dataRetention), ResettableValue.create(downsampling)); + } + + public static Template createDataLifecycleTemplate( + boolean enabled, + ResettableValue dataRetention, + ResettableValue> 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 record Template( ResettableValue> downsampling ) implements ToXContentObject, Writeable { - public Template(boolean enabled, TimeValue dataRetention, List downsampling) { + Template(boolean enabled, TimeValue dataRetention, List downsampling) { this(enabled, ResettableValue.create(dataRetention), ResettableValue.create(downsampling)); } @@ -736,8 +762,8 @@ public static Builder builder(Template template) { return new Builder(template); } - public static Builder builder() { - return new Builder((DataStreamLifecycle) null); + public static Builder dataLifecycleBuilder() { + return new Builder(); } /** @@ -750,20 +776,18 @@ public static class Builder { @Nullable private List downsampling = null; + private Builder() {} + private Builder(DataStreamLifecycle.Template template) { - if (template != null) { - enabled = template.enabled(); - dataRetention = template.dataRetention().get(); - downsampling = template.downsampling().get(); - } + 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(); - } + enabled = lifecycle.enabled(); + dataRetention = lifecycle.dataRetention(); + downsampling = lifecycle.downsampling(); } public Builder composeTemplate(DataStreamLifecycle.Template template) { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/Template.java b/server/src/main/java/org/elasticsearch/cluster/metadata/Template.java index 444a3b60297d5..f4e0d32113a9a 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/Template.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Template.java @@ -61,7 +61,9 @@ public class Template implements SimpleDiffable