diff --git a/modules/dot-prefix-validation/src/main/java/org/elasticsearch/validation/DotPrefixValidator.java b/modules/dot-prefix-validation/src/main/java/org/elasticsearch/validation/DotPrefixValidator.java index 4f5d4cf15d7f1..e681b663bd2b0 100644 --- a/modules/dot-prefix-validation/src/main/java/org/elasticsearch/validation/DotPrefixValidator.java +++ b/modules/dot-prefix-validation/src/main/java/org/elasticsearch/validation/DotPrefixValidator.java @@ -62,16 +62,14 @@ public abstract class DotPrefixValidator implements MappedActionFil * .ml-* is used by ML * .slo-observability-* is used by Observability */ - private static Set IGNORED_INDEX_NAMES = Set.of( - ".elastic-connectors-v1", - ".elastic-connectors-sync-jobs-v1", - ".ml-state", - ".ml-anomalies-unrelated" - ); + private static Set IGNORED_INDEX_NAMES = Set.of(".elastic-connectors-v1", ".elastic-connectors-sync-jobs-v1", ".ml-state"); public static Setting> IGNORED_INDEX_PATTERNS_SETTING = Setting.listSetting( "cluster.indices.validate_ignored_dot_patterns", List.of( + "\\.ml-anomalies-.*", + "\\.ml-annotations-\\d+", "\\.ml-state-\\d+", + "\\.ml-stats-\\d+", "\\.slo-observability\\.sli-v\\d+.*", "\\.slo-observability\\.summary-v\\d+.*", "\\.entities\\.v\\d+\\.latest\\..*" diff --git a/modules/dot-prefix-validation/src/test/java/org/elasticsearch/validation/DotPrefixValidatorTests.java b/modules/dot-prefix-validation/src/test/java/org/elasticsearch/validation/DotPrefixValidatorTests.java index 6953f1cfc63df..15102f809c9ed 100644 --- a/modules/dot-prefix-validation/src/test/java/org/elasticsearch/validation/DotPrefixValidatorTests.java +++ b/modules/dot-prefix-validation/src/test/java/org/elasticsearch/validation/DotPrefixValidatorTests.java @@ -15,6 +15,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.util.set.Sets; +import org.elasticsearch.core.Nullable; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool; import org.junit.BeforeClass; @@ -27,8 +28,8 @@ import static org.mockito.Mockito.when; public class DotPrefixValidatorTests extends ESTestCase { - private final OperatorValidator opV = new OperatorValidator<>(); - private final NonOperatorValidator nonOpV = new NonOperatorValidator<>(); + private final OperatorValidator opV = new OperatorValidator<>(true); + private final NonOperatorValidator nonOpV = new NonOperatorValidator<>(true); private static ClusterService clusterService; @@ -58,14 +59,19 @@ public void testValidation() { opV.validateIndices(Set.of(".regular")); assertFails(Set.of("first", ".second")); assertFails(Set.of("<.regular-{MM-yy-dd}>")); + assertFails(Set.of(".this_index_contains_an_excepted_pattern.ml-annotations-1")); // Test ignored names nonOpV.validateIndices(Set.of(".elastic-connectors-v1")); nonOpV.validateIndices(Set.of(".elastic-connectors-sync-jobs-v1")); nonOpV.validateIndices(Set.of(".ml-state")); + nonOpV.validateIndices(Set.of(".ml-state-000001")); + nonOpV.validateIndices(Set.of(".ml-stats-000001")); nonOpV.validateIndices(Set.of(".ml-anomalies-unrelated")); // Test ignored patterns + nonOpV.validateIndices(Set.of(".ml-annotations-21309")); + nonOpV.validateIndices(Set.of(".ml-annotations-2")); nonOpV.validateIndices(Set.of(".ml-state-21309")); nonOpV.validateIndices(Set.of(">.ml-state-21309>")); nonOpV.validateIndices(Set.of(".slo-observability.sli-v2")); @@ -86,7 +92,8 @@ public void testValidation() { } private void assertFails(Set indices) { - nonOpV.validateIndices(indices); + var validator = new NonOperatorValidator<>(false); + validator.validateIndices(indices); assertWarnings( "Index [" + indices.stream().filter(i -> i.startsWith(".") || i.startsWith("<.")).toList().get(0) @@ -94,10 +101,13 @@ private void assertFails(Set indices) { ); } - private static class NonOperatorValidator extends DotPrefixValidator { + private class NonOperatorValidator extends DotPrefixValidator { - private NonOperatorValidator() { + private final boolean assertNoWarnings; + + private NonOperatorValidator(boolean assertNoWarnings) { super(new ThreadContext(Settings.EMPTY), clusterService); + this.assertNoWarnings = assertNoWarnings; } @Override @@ -110,13 +120,25 @@ public String actionName() { return ""; } + @Override + void validateIndices(@Nullable Set indices) { + super.validateIndices(indices); + if (assertNoWarnings) { + assertWarnings(); + } + } + @Override boolean isInternalRequest() { return false; } } - private static class OperatorValidator extends NonOperatorValidator { + private class OperatorValidator extends NonOperatorValidator { + private OperatorValidator(boolean assertNoWarnings) { + super(assertNoWarnings); + } + @Override boolean isInternalRequest() { return true;