Skip to content

Commit 2dabf97

Browse files
authored
Adding tests that index metadata is correct after data stream upgrade (elastic#121845) (elastic#121910)
1 parent 24b7b69 commit 2dabf97

File tree

1 file changed

+120
-2
lines changed

1 file changed

+120
-2
lines changed

x-pack/qa/rolling-upgrade/src/test/java/org/elasticsearch/upgrades/DataStreamsUpgradeIT.java

Lines changed: 120 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)