@@ -194,20 +194,79 @@ public void testUpgradeDataStream() throws Exception {
194194 createAndRolloverDataStream (dataStreamName , numRollovers );
195195 createDataStreamFromNonDataStreamIndices (dataStreamFromNonDataStreamIndices );
196196 } else if (CLUSTER_TYPE == ClusterType .UPGRADED ) {
197+ Map <String , Map <String , Object >> oldIndicesMetadata = getIndicesMetadata (dataStreamName );
197198 upgradeDataStream (dataStreamName , numRollovers , numRollovers + 1 , 0 );
198199 upgradeDataStream (dataStreamFromNonDataStreamIndices , 0 , 1 , 0 );
200+ Map <String , Map <String , Object >> upgradedIndicesMetadata = getIndicesMetadata (dataStreamName );
201+ compareIndexMetadata (oldIndicesMetadata , upgradedIndicesMetadata );
199202 }
200203 }
201204
202- private static void createAndRolloverDataStream (String dataStreamName , int numRollovers ) throws IOException {
205+ private void compareIndexMetadata (
206+ Map <String , Map <String , Object >> oldIndicesMetadata ,
207+ Map <String , Map <String , Object >> upgradedIndicesMetadata
208+ ) {
209+ for (Map .Entry <String , Map <String , Object >> upgradedIndexEntry : upgradedIndicesMetadata .entrySet ()) {
210+ String upgradedIndexName = upgradedIndexEntry .getKey ();
211+ if (upgradedIndexName .startsWith (".migrated-" )) {
212+ String oldIndexName = "." + upgradedIndexName .substring (".migrated-" .length ());
213+ Map <String , Object > oldIndexMetadata = oldIndicesMetadata .get (oldIndexName );
214+ Map <String , Object > upgradedIndexMetadata = upgradedIndexEntry .getValue ();
215+ compareSettings (oldIndexMetadata , upgradedIndexMetadata );
216+ assertThat ("Mappings did not match" , upgradedIndexMetadata .get ("mappings" ), equalTo (oldIndexMetadata .get ("mappings" )));
217+ // TODO: Uncomment the following two checks once we are correctly copying this state over:
218+ // assertThat("ILM states did not match", upgradedIndexMetadata.get("ilm"), equalTo(oldIndexMetadata.get("ilm")));
219+ // assertThat(
220+ // "Rollover info did not match",
221+ // upgradedIndexMetadata.get("rollover_info"),
222+ // equalTo(oldIndexMetadata.get("rollover_info"))
223+ // );
224+ assertThat (upgradedIndexMetadata .get ("system" ), equalTo (oldIndexMetadata .get ("system" )));
225+ }
226+ }
227+ }
228+
229+ private void compareSettings (Map <String , Object > oldIndexMetadata , Map <String , Object > upgradedIndexMetadata ) {
230+ Map <String , Object > oldIndexSettings = getIndexSettingsFromIndexMetadata (oldIndexMetadata );
231+ Map <String , Object > upgradedIndexSettings = getIndexSettingsFromIndexMetadata (upgradedIndexMetadata );
232+ final Set <String > SETTINGS_TO_CHECK = Set .of (
233+ "lifecycle" ,
234+ "mode" ,
235+ "routing" ,
236+ "hidden" ,
237+ "number_of_shards" ,
238+ // "creation_date", TODO: Uncomment this once we are correctly copying over this setting
239+ "number_of_replicas"
240+ );
241+ for (String setting : SETTINGS_TO_CHECK ) {
242+ assertThat (
243+ "Unexpected value for setting " + setting ,
244+ upgradedIndexSettings .get (setting ),
245+ equalTo (oldIndexSettings .get (setting ))
246+ );
247+ }
248+ }
249+
250+ @ SuppressWarnings ("unchecked" )
251+ private Map <String , Object > getIndexSettingsFromIndexMetadata (Map <String , Object > indexMetadata ) {
252+ return (Map <String , Object >) ((Map <String , Object >) indexMetadata .get ("settings" )).get ("index" );
253+ }
254+
255+ private void createAndRolloverDataStream (String dataStreamName , int numRollovers ) throws IOException {
256+ boolean useIlm = randomBoolean ();
257+ if (useIlm ) {
258+ createIlmPolicy ();
259+ }
203260 // We want to create a data stream and roll it over several times so that we have several indices to upgrade
204- final String template = """
261+ String template = """
205262 {
206263 "settings":{
207264 "index": {
265+ $ILM_SETTING
208266 "mode": "time_series"
209267 }
210268 },
269+ $DSL_TEMPLATE
211270 "mappings":{
212271 "dynamic_templates": [
213272 {
@@ -253,6 +312,19 @@ private static void createAndRolloverDataStream(String dataStreamName, int numRo
253312 }
254313 }
255314 """ ;
315+ if (useIlm ) {
316+ template = template .replace ("$ILM_SETTING" , """
317+ "lifecycle.name": "test-lifecycle-policy",
318+ """ );
319+ template = template .replace ("$DSL_TEMPLATE" , "" );
320+ } else {
321+ template = template .replace ("$ILM_SETTING" , "" );
322+ template = template .replace ("$DSL_TEMPLATE" , """
323+ "lifecycle": {
324+ "data_retention": "7d"
325+ },
326+ """ );
327+ }
256328 final String indexTemplate = """
257329 {
258330 "index_patterns": ["$PATTERN"],
@@ -273,6 +345,52 @@ private static void createAndRolloverDataStream(String dataStreamName, int numRo
273345 }
274346 }
275347
348+ private static void createIlmPolicy () throws IOException {
349+ String ilmPolicy = """
350+ {
351+ "policy": {
352+ "phases": {
353+ "hot": {
354+ "actions": {
355+ "rollover": {
356+ "max_primary_shard_size": "50kb"
357+ }
358+ }
359+ },
360+ "warm": {
361+ "min_age": "30d",
362+ "actions": {
363+ "shrink": {
364+ "number_of_shards": 1
365+ },
366+ "forcemerge": {
367+ "max_num_segments": 1
368+ }
369+ }
370+ }
371+ }
372+ }
373+ }""" ;
374+ Request putIlmPolicyRequest = new Request ("PUT" , "_ilm/policy/test-lifecycle-policy" );
375+ putIlmPolicyRequest .setJsonEntity (ilmPolicy );
376+ assertOK (client ().performRequest (putIlmPolicyRequest ));
377+ }
378+
379+ /*
380+ * This returns a Map of index metadata for each index in the data stream, as retrieved from the cluster state.
381+ */
382+ @ SuppressWarnings ("unchecked" )
383+ private Map <String , Map <String , Object >> getIndicesMetadata (String dataStreamName ) throws IOException {
384+ Request getClusterStateRequest = new Request ("GET" , "/_cluster/state/metadata/" + dataStreamName );
385+ Response clusterStateResponse = client ().performRequest (getClusterStateRequest );
386+ Map <String , Object > clusterState = XContentHelper .convertToMap (
387+ JsonXContent .jsonXContent ,
388+ clusterStateResponse .getEntity ().getContent (),
389+ false
390+ );
391+ return ((Map <String , Map <String , Map <String , Object >>>) clusterState .get ("metadata" )).get ("indices" );
392+ }
393+
276394 private void createDataStreamFromNonDataStreamIndices (String dataStreamFromNonDataStreamIndices ) throws IOException {
277395 /*
278396 * This method creates an index, creates an alias to that index, and then converts the aliased index into a data stream. This is
0 commit comments