diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/deprecation/DeprecationIssue.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/deprecation/DeprecationIssue.java index 85a7edd1093..8413938f2b2 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/deprecation/DeprecationIssue.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/deprecation/DeprecationIssue.java @@ -7,6 +7,7 @@ package org.elasticsearch.xpack.core.deprecation; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; @@ -137,5 +138,10 @@ public class DeprecationIssue implements Writeable, ToXContentObject { public int hashCode() { return Objects.hash(level, message, url, details); } + + @Override + public String toString() { + return Strings.toString(this); + } } diff --git a/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/DeprecationChecks.java b/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/DeprecationChecks.java index 2589cb80cb5..1363d3a09a0 100644 --- a/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/DeprecationChecks.java +++ b/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/DeprecationChecks.java @@ -15,8 +15,10 @@ import org.elasticsearch.xpack.core.deprecation.DeprecationIssue; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.stream.Collectors; /** * Class containing all the cluster, node, and index deprecation checks that will be served @@ -37,11 +39,17 @@ public class DeprecationChecks { static List> INDEX_SETTINGS_CHECKS = Collections.unmodifiableList(Arrays.asList( - IndexDeprecationChecks::baseSimilarityDefinedCheck, - IndexDeprecationChecks::dynamicTemplateWithMatchMappingTypeCheck, - IndexDeprecationChecks::indexSharedFileSystemCheck, - IndexDeprecationChecks::indexStoreTypeCheck, - IndexDeprecationChecks::storeThrottleSettingsCheck, - IndexDeprecationChecks::delimitedPayloadFilterCheck)); + IndexDeprecationChecks::oldIndicesCheck)); + /** + * helper utility function to reduce repeat of running a specific {@link List} of checks. + * + * @param checks The functional checks to execute using the mapper function + * @param mapper The function that executes the lambda check with the appropriate arguments + * @param The signature of the check (BiFunction, Function, including the appropriate arguments) + * @return The list of {@link DeprecationIssue} that were found in the cluster + */ + static List filterChecks(List checks, Function mapper) { + return checks.stream().map(mapper).filter(Objects::nonNull).collect(Collectors.toList()); + } } diff --git a/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java b/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java index fcc6532fc99..7defb80ccaa 100644 --- a/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java +++ b/x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecks.java @@ -7,18 +7,12 @@ package org.elasticsearch.xpack.deprecation; import com.carrotsearch.hppc.cursors.ObjectCursor; - import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MappingMetaData; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.analysis.AnalysisRegistry; -import org.elasticsearch.index.mapper.DynamicTemplate; import org.elasticsearch.xpack.core.deprecation.DeprecationIssue; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -79,119 +73,15 @@ public class IndexDeprecationChecks { return issues; } - static DeprecationIssue dynamicTemplateWithMatchMappingTypeCheck(IndexMetaData indexMetaData) { - if (indexMetaData.getCreationVersion().before(Version.V_6_0_0_alpha1)) { - List issues = new ArrayList<>(); - fieldLevelMappingIssue(indexMetaData, (mappingMetaData, sourceAsMap) -> { - List dynamicTemplates = (List) mappingMetaData - .getSourceAsMap().getOrDefault("dynamic_templates", Collections.emptyList()); - for (Object template : dynamicTemplates) { - for (Map.Entry prop : ((Map) template).entrySet()) { - Map val = (Map) prop.getValue(); - if (val.containsKey("match_mapping_type")) { - Object mappingMatchType = val.get("match_mapping_type"); - boolean isValidMatchType = Arrays.stream(DynamicTemplate.XContentFieldType.values()) - .anyMatch(v -> v.toString().equals(mappingMatchType)); - if (isValidMatchType == false) { - issues.add("type: " + mappingMetaData.type() + ", dynamicFieldDefinition" - + prop.getKey() + ", unknown match_mapping_type[" + mappingMatchType + "]"); - } - } - } - } - }); - if (issues.size() > 0) { + static DeprecationIssue oldIndicesCheck(IndexMetaData indexMetaData) { + Version createdWith = indexMetaData.getCreationVersion(); + if (createdWith.before(Version.V_7_0_0)) { return new DeprecationIssue(DeprecationIssue.Level.CRITICAL, - "Unrecognized match_mapping_type options not silently ignored", + "Index created before 7.0", "https://www.elastic.co/guide/en/elasticsearch/reference/master/" + - "breaking_60_mappings_changes.html" + - "#_unrecognized_literal_match_mapping_type_literal_options_not_silently_ignored", - issues.toString()); + "breaking-changes-8.0.html", + "This index was created using version: " + createdWith); } - } - return null; - } - - static DeprecationIssue baseSimilarityDefinedCheck(IndexMetaData indexMetaData) { - if (indexMetaData.getCreationVersion().before(Version.V_6_0_0_alpha1)) { - Settings settings = indexMetaData.getSettings().getAsSettings("index.similarity.base"); - if (settings.size() > 0) { - return new DeprecationIssue(DeprecationIssue.Level.WARNING, - "The base similarity is now ignored as coords and query normalization have been removed." + - "If provided, this setting will be ignored and issue a deprecation warning", - "https://www.elastic.co/guide/en/elasticsearch/reference/master/" + - "breaking_60_settings_changes.html#_similarity_settings", null); - - } - } - return null; - } - - static DeprecationIssue delimitedPayloadFilterCheck(IndexMetaData indexMetaData) { - if (indexMetaData.getCreationVersion().before(Version.V_7_0_0)) { - List issues = new ArrayList<>(); - Map filters = indexMetaData.getSettings().getGroups(AnalysisRegistry.INDEX_ANALYSIS_FILTER); - for (Map.Entry entry : filters.entrySet()) { - if ("delimited_payload_filter".equals(entry.getValue().get("type"))) { - issues.add("The filter [" + entry.getKey() + "] is of deprecated 'delimited_payload_filter' type. " - + "The filter type should be changed to 'delimited_payload'."); - } - } - if (issues.size() > 0) { - return new DeprecationIssue(DeprecationIssue.Level.WARNING, - "Use of 'delimited_payload_filter'.", - "https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking_70_analysis_changes.html", - issues.toString()); - } - } - return null; - } - - static DeprecationIssue indexStoreTypeCheck(IndexMetaData indexMetaData) { - if (indexMetaData.getCreationVersion().before(Version.V_6_0_0_alpha1) && - indexMetaData.getSettings().get("index.store.type") != null) { - return new DeprecationIssue(DeprecationIssue.Level.CRITICAL, - "The default index.store.type has been removed. If you were using it, " + - "we advise that you simply remove it from your index settings and Elasticsearch" + - "will use the best store implementation for your operating system.", - "https://www.elastic.co/guide/en/elasticsearch/reference/master/" + - "breaking_60_settings_changes.html#_store_settings", null); - - } - return null; - } - - static DeprecationIssue storeThrottleSettingsCheck(IndexMetaData indexMetaData) { - if (indexMetaData.getCreationVersion().before(Version.V_6_0_0_alpha1)) { - Settings settings = indexMetaData.getSettings(); - Settings throttleSettings = settings.getAsSettings("index.store.throttle"); - ArrayList foundSettings = new ArrayList<>(); - if (throttleSettings.get("max_bytes_per_sec") != null) { - foundSettings.add("index.store.throttle.max_bytes_per_sec"); - } - if (throttleSettings.get("type") != null) { - foundSettings.add("index.store.throttle.type"); - } - - if (foundSettings.isEmpty() == false) { - return new DeprecationIssue(DeprecationIssue.Level.CRITICAL, - "index.store.throttle settings are no longer recognized. these settings should be removed", - "https://www.elastic.co/guide/en/elasticsearch/reference/master/" + - "breaking_60_settings_changes.html#_store_throttling_settings", "present settings: " + foundSettings); - } - } - return null; - } - - static DeprecationIssue indexSharedFileSystemCheck(IndexMetaData indexMetaData) { - if (indexMetaData.getCreationVersion().before(Version.V_6_0_0_alpha1) && - indexMetaData.getSettings().get("index.shared_filesystem") != null) { - return new DeprecationIssue(DeprecationIssue.Level.CRITICAL, - "[index.shared_filesystem] setting should be removed", - "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/" + - "breaking_60_indices_changes.html#_shadow_replicas_have_been_removed", null); - - } return null; } } diff --git a/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/DeprecationChecksTests.java b/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/DeprecationChecksTests.java new file mode 100644 index 00000000000..57b579a5085 --- /dev/null +++ b/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/DeprecationChecksTests.java @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +package org.elasticsearch.xpack.deprecation; + +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.core.deprecation.DeprecationInfoAction; +import org.elasticsearch.xpack.core.deprecation.DeprecationIssue; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import static org.hamcrest.Matchers.equalTo; + +public class DeprecationChecksTests extends ESTestCase { + + public void testFilterChecks() { + DeprecationIssue issue = createRandomDeprecationIssue(); + int numChecksPassed = randomIntBetween(0, 5); + int numChecksFailed = 10 - numChecksPassed; + List> checks = new ArrayList<>(); + for (int i = 0; i < numChecksFailed; i++) { + checks.add(() -> issue); + } + for (int i = 0; i < numChecksPassed; i++) { + checks.add(() -> null); + } + List filteredIssues = DeprecationInfoAction.filterChecks(checks, Supplier::get); + assertThat(filteredIssues.size(), equalTo(numChecksFailed)); + } + + private static DeprecationIssue createRandomDeprecationIssue() { + String details = randomBoolean() ? randomAlphaOfLength(10) : null; + return new DeprecationIssue(randomFrom(DeprecationIssue.Level.values()), randomAlphaOfLength(10), + randomAlphaOfLength(10), details); + } +} diff --git a/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecksTests.java b/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecksTests.java index 7203a853846..b0f5a556ac6 100644 --- a/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecksTests.java +++ b/x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/IndexDeprecationChecksTests.java @@ -3,37 +3,35 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + package org.elasticsearch.xpack.deprecation; import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.VersionUtils; -import org.elasticsearch.xpack.core.deprecation.DeprecationInfoAction; import org.elasticsearch.xpack.core.deprecation.DeprecationIssue; -import java.io.IOException; import java.util.List; import static java.util.Collections.singletonList; import static org.elasticsearch.xpack.deprecation.DeprecationChecks.INDEX_SETTINGS_CHECKS; public class IndexDeprecationChecksTests extends ESTestCase { - public void testDelimitedPayloadFilterCheck() throws IOException { - Settings settings = settings( - VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, VersionUtils.getPreviousVersion(Version.V_7_0_0))) - .put("index.analysis.filter.my_delimited_payload_filter.type", "delimited_payload_filter") - .put("index.analysis.filter.my_delimited_payload_filter.delimiter", "^") - .put("index.analysis.filter.my_delimited_payload_filter.encoding", "identity").build(); - - IndexMetaData indexMetaData = IndexMetaData.builder("test").settings(settings).numberOfShards(1).numberOfReplicas(0).build(); - - DeprecationIssue expected = new DeprecationIssue(DeprecationIssue.Level.WARNING, "Use of 'delimited_payload_filter'.", - "https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking_70_analysis_changes.html", - "[The filter [my_delimited_payload_filter] is of deprecated 'delimited_payload_filter' type. " - + "The filter type should be changed to 'delimited_payload'.]"); - List issues = DeprecationInfoAction.filterChecks(INDEX_SETTINGS_CHECKS, c -> c.apply(indexMetaData)); + public void testOldIndicesCheck() { + Version createdWith = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, + VersionUtils.getPreviousVersion(Version.V_7_0_0)); + IndexMetaData indexMetaData = IndexMetaData.builder("test") + .settings(settings(createdWith)) + .numberOfShards(1) + .numberOfReplicas(0) + .build(); + DeprecationIssue expected = new DeprecationIssue(DeprecationIssue.Level.CRITICAL, + "Index created before 7.0", + "https://www.elastic.co/guide/en/elasticsearch/reference/master/" + + "breaking-changes-8.0.html", + "This index was created using version: " + createdWith); + List issues = DeprecationChecks.filterChecks(INDEX_SETTINGS_CHECKS, c -> c.apply(indexMetaData)); assertEquals(singletonList(expected), issues); } }