|
19 | 19 | import org.elasticsearch.common.unit.ByteSizeValue; |
20 | 20 | import org.elasticsearch.core.Nullable; |
21 | 21 | import org.elasticsearch.core.TimeValue; |
| 22 | +import org.elasticsearch.core.Tuple; |
22 | 23 | import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; |
23 | 24 | import org.elasticsearch.test.AbstractXContentSerializingTestCase; |
24 | 25 | import org.elasticsearch.test.ESTestCase; |
|
33 | 34 | import java.util.Set; |
34 | 35 | import java.util.stream.Stream; |
35 | 36 |
|
| 37 | +import static org.elasticsearch.cluster.metadata.DataStreamLifecycle.RetentionSource.DATA_STREAM_CONFIGURATION; |
| 38 | +import static org.elasticsearch.cluster.metadata.DataStreamLifecycle.RetentionSource.DEFAULT_GLOBAL_RETENTION; |
| 39 | +import static org.elasticsearch.cluster.metadata.DataStreamLifecycle.RetentionSource.MAX_GLOBAL_RETENTION; |
36 | 40 | import static org.hamcrest.Matchers.containsString; |
37 | 41 | import static org.hamcrest.Matchers.equalTo; |
38 | 42 | import static org.hamcrest.Matchers.nullValue; |
@@ -107,10 +111,11 @@ public void testXContentSerializationWithRollover() throws IOException { |
107 | 111 | try (XContentBuilder builder = XContentBuilder.builder(XContentType.JSON.xContent())) { |
108 | 112 | builder.humanReadable(true); |
109 | 113 | RolloverConfiguration rolloverConfiguration = RolloverConfigurationTests.randomRolloverConditions(); |
110 | | - lifecycle.toXContent(builder, ToXContent.EMPTY_PARAMS, rolloverConfiguration); |
| 114 | + DataStreamGlobalRetention globalRetention = DataStreamGlobalRetentionSerializationTests.randomGlobalRetention(); |
| 115 | + lifecycle.toXContent(builder, ToXContent.EMPTY_PARAMS, rolloverConfiguration, globalRetention); |
111 | 116 | String serialized = Strings.toString(builder); |
112 | 117 | assertThat(serialized, containsString("rollover")); |
113 | | - for (String label : rolloverConfiguration.resolveRolloverConditions(lifecycle.getEffectiveDataRetention()) |
| 118 | + for (String label : rolloverConfiguration.resolveRolloverConditions(lifecycle.getEffectiveDataRetention(globalRetention)) |
114 | 119 | .getConditions() |
115 | 120 | .keySet()) { |
116 | 121 | assertThat(serialized, containsString(label)); |
@@ -253,6 +258,72 @@ public void testInvalidDownsamplingConfiguration() { |
253 | 258 | } |
254 | 259 | } |
255 | 260 |
|
| 261 | + public void testEffectiveRetention() { |
| 262 | + // No retention in the data stream lifecycle |
| 263 | + { |
| 264 | + DataStreamLifecycle noRetentionLifecycle = DataStreamLifecycle.newBuilder().downsampling(randomDownsampling()).build(); |
| 265 | + TimeValue maxRetention = TimeValue.timeValueDays(randomIntBetween(50, 100)); |
| 266 | + TimeValue defaultRetention = TimeValue.timeValueDays(randomIntBetween(1, 50)); |
| 267 | + Tuple<TimeValue, DataStreamLifecycle.RetentionSource> effectiveDataRetentionWithSource = noRetentionLifecycle |
| 268 | + .getEffectiveDataRetentionWithSource(null); |
| 269 | + assertThat(effectiveDataRetentionWithSource.v1(), nullValue()); |
| 270 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(DATA_STREAM_CONFIGURATION)); |
| 271 | + |
| 272 | + effectiveDataRetentionWithSource = noRetentionLifecycle.getEffectiveDataRetentionWithSource( |
| 273 | + new DataStreamGlobalRetention(null, maxRetention) |
| 274 | + ); |
| 275 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(maxRetention)); |
| 276 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(MAX_GLOBAL_RETENTION)); |
| 277 | + |
| 278 | + effectiveDataRetentionWithSource = noRetentionLifecycle.getEffectiveDataRetentionWithSource( |
| 279 | + new DataStreamGlobalRetention(defaultRetention, null) |
| 280 | + ); |
| 281 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(defaultRetention)); |
| 282 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(DEFAULT_GLOBAL_RETENTION)); |
| 283 | + |
| 284 | + effectiveDataRetentionWithSource = noRetentionLifecycle.getEffectiveDataRetentionWithSource( |
| 285 | + new DataStreamGlobalRetention(defaultRetention, maxRetention) |
| 286 | + ); |
| 287 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(defaultRetention)); |
| 288 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(DEFAULT_GLOBAL_RETENTION)); |
| 289 | + } |
| 290 | + |
| 291 | + // With retention in the data stream lifecycle |
| 292 | + { |
| 293 | + TimeValue dataStreamRetention = TimeValue.timeValueDays(randomIntBetween(5, 100)); |
| 294 | + DataStreamLifecycle lifecycleRetention = DataStreamLifecycle.newBuilder() |
| 295 | + .dataRetention(dataStreamRetention) |
| 296 | + .downsampling(randomDownsampling()) |
| 297 | + .build(); |
| 298 | + TimeValue defaultRetention = TimeValue.timeValueDays(randomIntBetween(1, (int) dataStreamRetention.getDays() - 1)); |
| 299 | + |
| 300 | + Tuple<TimeValue, DataStreamLifecycle.RetentionSource> effectiveDataRetentionWithSource = lifecycleRetention |
| 301 | + .getEffectiveDataRetentionWithSource(null); |
| 302 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(dataStreamRetention)); |
| 303 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(DATA_STREAM_CONFIGURATION)); |
| 304 | + |
| 305 | + effectiveDataRetentionWithSource = lifecycleRetention.getEffectiveDataRetentionWithSource( |
| 306 | + new DataStreamGlobalRetention(defaultRetention, null) |
| 307 | + ); |
| 308 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(dataStreamRetention)); |
| 309 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(DATA_STREAM_CONFIGURATION)); |
| 310 | + |
| 311 | + TimeValue maxGlobalRetention = randomBoolean() ? dataStreamRetention : TimeValue.timeValueDays(dataStreamRetention.days() + 1); |
| 312 | + effectiveDataRetentionWithSource = lifecycleRetention.getEffectiveDataRetentionWithSource( |
| 313 | + new DataStreamGlobalRetention(defaultRetention, maxGlobalRetention) |
| 314 | + ); |
| 315 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(dataStreamRetention)); |
| 316 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(DATA_STREAM_CONFIGURATION)); |
| 317 | + |
| 318 | + TimeValue maxRetentionLessThanDataStream = TimeValue.timeValueDays(dataStreamRetention.days() - 1); |
| 319 | + effectiveDataRetentionWithSource = lifecycleRetention.getEffectiveDataRetentionWithSource( |
| 320 | + new DataStreamGlobalRetention(randomBoolean() ? null : TimeValue.timeValueDays(10), maxRetentionLessThanDataStream) |
| 321 | + ); |
| 322 | + assertThat(effectiveDataRetentionWithSource.v1(), equalTo(maxRetentionLessThanDataStream)); |
| 323 | + assertThat(effectiveDataRetentionWithSource.v2(), equalTo(MAX_GLOBAL_RETENTION)); |
| 324 | + } |
| 325 | + } |
| 326 | + |
256 | 327 | @Nullable |
257 | 328 | public static DataStreamLifecycle randomLifecycle() { |
258 | 329 | return DataStreamLifecycle.newBuilder() |
|
0 commit comments