24
24
import org .elasticsearch .client .internal .Client ;
25
25
import org .elasticsearch .cluster .metadata .ComposableIndexTemplate ;
26
26
import org .elasticsearch .cluster .metadata .ComposableIndexTemplate .DataStreamTemplate ;
27
+ import org .elasticsearch .cluster .metadata .DataStream ;
28
+ import org .elasticsearch .cluster .metadata .DataStreamFailureStore ;
29
+ import org .elasticsearch .cluster .metadata .DataStreamOptions ;
27
30
import org .elasticsearch .cluster .metadata .Template ;
28
31
import org .elasticsearch .cluster .project .ProjectResolver ;
29
32
import org .elasticsearch .cluster .project .TestProjectResolvers ;
33
36
import org .elasticsearch .common .network .NetworkModule ;
34
37
import org .elasticsearch .common .settings .Settings ;
35
38
import org .elasticsearch .common .xcontent .XContentHelper ;
39
+ import org .elasticsearch .index .mapper .DateFieldMapper ;
40
+ import org .elasticsearch .index .mapper .extras .MapperExtrasPlugin ;
36
41
import org .elasticsearch .indices .ExecutorNames ;
37
42
import org .elasticsearch .indices .SystemDataStreamDescriptor ;
38
43
import org .elasticsearch .indices .SystemDataStreamDescriptor .Type ;
48
53
import java .util .ArrayList ;
49
54
import java .util .Collection ;
50
55
import java .util .List ;
56
+ import java .util .Locale ;
51
57
import java .util .Map ;
52
58
import java .util .stream .Collectors ;
53
59
60
+ import static org .elasticsearch .cluster .metadata .MetadataIndexTemplateService .DEFAULT_TIMESTAMP_FIELD ;
54
61
import static org .hamcrest .Matchers .containsString ;
55
62
import static org .hamcrest .Matchers .equalTo ;
56
63
import static org .hamcrest .Matchers .is ;
64
+ import static org .hamcrest .Matchers .startsWith ;
57
65
58
66
public class SystemDataStreamIT extends ESIntegTestCase {
59
67
@@ -62,6 +70,7 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
62
70
List <Class <? extends Plugin >> plugins = new ArrayList <>(super .nodePlugins ());
63
71
plugins .add (DataStreamsPlugin .class );
64
72
plugins .add (TestSystemDataStreamPlugin .class );
73
+ plugins .add (MapperExtrasPlugin .class );
65
74
return plugins ;
66
75
}
67
76
@@ -169,6 +178,63 @@ public void testDataStreamStats() throws Exception {
169
178
}
170
179
}
171
180
181
+ public void testSystemDataStreamWithFailureStore () throws Exception {
182
+ String dataStreamName = ".test-failure-store" ;
183
+ RequestOptions productHeader = RequestOptions .DEFAULT .toBuilder ().addHeader ("X-elastic-product-origin" , "product" ).build ();
184
+ try (RestClient restClient = createRestClient ()) {
185
+ Request indexRequest = new Request ("POST" , "/" + dataStreamName + "/_doc" );
186
+ indexRequest .setOptions (productHeader );
187
+ String value = DateFieldMapper .DEFAULT_DATE_TIME_FORMATTER .formatMillis (System .currentTimeMillis ());
188
+ indexRequest .setJsonEntity (
189
+ String .format (Locale .ROOT , "{\" %s\" :\" %s\" ,\" count\" :\" not-a-number\" }" , DEFAULT_TIMESTAMP_FIELD , value )
190
+ );
191
+
192
+ Response indexResponse = restClient .performRequest (indexRequest );
193
+ assertThat (indexResponse .getStatusLine ().getStatusCode (), is (201 ));
194
+ Map <String , Object > responseMap = XContentHelper .convertToMap (
195
+ XContentType .JSON .xContent (),
196
+ EntityUtils .toString (indexResponse .getEntity ()),
197
+ false
198
+ );
199
+ assertThat (responseMap .get ("result" ), equalTo ("created" ));
200
+ assertThat ((String ) responseMap .get ("_index" ), startsWith (DataStream .FAILURE_STORE_PREFIX ));
201
+ assertThat (responseMap .get ("failure_store" ), equalTo ("used" ));
202
+
203
+ // Rollover
204
+ Request rolloverRequest = new Request ("POST" , "/" + dataStreamName + "::failures/_rollover" );
205
+ rolloverRequest .setOptions (productHeader );
206
+ Response rolloverResponse = restClient .performRequest (rolloverRequest );
207
+ assertThat (rolloverResponse .getStatusLine ().getStatusCode (), is (200 ));
208
+ responseMap = XContentHelper .convertToMap (
209
+ XContentType .JSON .xContent (),
210
+ EntityUtils .toString (rolloverResponse .getEntity ()),
211
+ false
212
+ );
213
+ assertThat (responseMap .get ("acknowledged" ), equalTo (true ));
214
+ assertThat (responseMap .get ("rolled_over" ), equalTo (true ));
215
+ assertThat ((String ) responseMap .get ("new_index" ), startsWith (DataStream .FAILURE_STORE_PREFIX ));
216
+
217
+ // Edit data stream options
218
+ Request editOptionsRequest = new Request ("PUT" , "/_data_stream/" + dataStreamName + "/_options" );
219
+ editOptionsRequest .setJsonEntity ("{\" failure_store\" :{\" enabled\" :\" false\" }}" );
220
+ editOptionsRequest .setOptions (productHeader );
221
+ Response editOptionsResponse = restClient .performRequest (editOptionsRequest );
222
+ assertThat (editOptionsResponse .getStatusLine ().getStatusCode (), is (200 ));
223
+ responseMap = XContentHelper .convertToMap (
224
+ XContentType .JSON .xContent (),
225
+ EntityUtils .toString (editOptionsResponse .getEntity ()),
226
+ false
227
+ );
228
+ assertThat (responseMap .get ("acknowledged" ), equalTo (true ));
229
+
230
+ // delete
231
+ Request deleteRequest = new Request ("DELETE" , "/_data_stream/" + dataStreamName );
232
+ deleteRequest .setOptions (productHeader );
233
+ Response deleteResponse = restClient .performRequest (deleteRequest );
234
+ assertThat (deleteResponse .getStatusLine ().getStatusCode (), is (200 ));
235
+ }
236
+ }
237
+
172
238
@ SuppressWarnings ("unchecked" )
173
239
public void testSystemDataStreamReadWrite () throws Exception {
174
240
try (RestClient restClient = createRestClient ()) {
@@ -328,6 +394,30 @@ public Collection<SystemDataStreamDescriptor> getSystemDataStreamDescriptors() {
328
394
List .of ("product" ),
329
395
"product" ,
330
396
ExecutorNames .DEFAULT_SYSTEM_DATA_STREAM_THREAD_POOLS
397
+ ),
398
+ new SystemDataStreamDescriptor (
399
+ ".test-failure-store" ,
400
+ "system data stream test with failure store" ,
401
+ Type .EXTERNAL ,
402
+ ComposableIndexTemplate .builder ()
403
+ .indexPatterns (List .of (".test-failure-store" ))
404
+ .template (Template .builder ().mappings (new CompressedXContent ("""
405
+ {
406
+ "properties": {
407
+ "@timestamp" : {
408
+ "type": "date"
409
+ },
410
+ "count": {
411
+ "type": "long"
412
+ }
413
+ }
414
+ }""" )).dataStreamOptions (new DataStreamOptions .Template (new DataStreamFailureStore .Template (true ))))
415
+ .dataStreamTemplate (new ComposableIndexTemplate .DataStreamTemplate ())
416
+ .build (),
417
+ Map .of (),
418
+ List .of ("product" ),
419
+ "product" ,
420
+ ExecutorNames .DEFAULT_SYSTEM_DATA_STREAM_THREAD_POOLS
331
421
)
332
422
);
333
423
} catch (IOException e ) {
0 commit comments