diff --git a/modules/tasks/build.gradle b/modules/tasks/build.gradle deleted file mode 100644 index b3ba90ccb6a11..0000000000000 --- a/modules/tasks/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -esplugin { - description 'Supports the Tasks API' - classname 'org.elasticsearch.tasksplugin.TasksPlugin' -} - -integTest.enabled = false diff --git a/modules/tasks/src/main/java/org/elasticsearch/tasksplugin/TasksPlugin.java b/modules/tasks/src/main/java/org/elasticsearch/tasksplugin/TasksPlugin.java deleted file mode 100644 index 0467b9419c778..0000000000000 --- a/modules/tasks/src/main/java/org/elasticsearch/tasksplugin/TasksPlugin.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.tasksplugin; - -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.indices.SystemIndexDescriptor; -import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.plugins.SystemIndexPlugin; - -import java.util.Collection; -import java.util.Collections; - -import static org.elasticsearch.tasks.TaskResultsService.TASK_INDEX; - -/** - * This plugin currently only exists to register `.tasks` as a system index. - */ -public class TasksPlugin extends Plugin implements SystemIndexPlugin { - - @Override - public Collection getSystemIndexDescriptors(Settings settings) { - return Collections.singletonList(new SystemIndexDescriptor(TASK_INDEX, this.getClass().getSimpleName())); - } -} diff --git a/modules/tasks/src/test/java/org/elasticsearch/tasksplugin/TasksPluginTests.java b/modules/tasks/src/test/java/org/elasticsearch/tasksplugin/TasksPluginTests.java deleted file mode 100644 index 23b873e377eb3..0000000000000 --- a/modules/tasks/src/test/java/org/elasticsearch/tasksplugin/TasksPluginTests.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.tasksplugin; - -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.test.ESTestCase; -import org.hamcrest.Matchers; - -public class TasksPluginTests extends ESTestCase { - - public void testDummy() { - // This is a dummy test case to satisfy the conventions - TasksPlugin plugin = new TasksPlugin(); - assertThat(plugin.getSystemIndexDescriptors(Settings.EMPTY), Matchers.hasSize(1)); - } -} diff --git a/server/src/main/java/org/elasticsearch/indices/SystemIndices.java b/server/src/main/java/org/elasticsearch/indices/SystemIndices.java index e774b884db95a..71a21b277763c 100644 --- a/server/src/main/java/org/elasticsearch/indices/SystemIndices.java +++ b/server/src/main/java/org/elasticsearch/indices/SystemIndices.java @@ -28,15 +28,18 @@ import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.regex.Regex; import org.elasticsearch.index.Index; +import org.elasticsearch.tasks.TaskResultsService; import java.util.Collection; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import static java.util.stream.Collectors.toUnmodifiableList; +import static org.elasticsearch.tasks.TaskResultsService.TASK_INDEX; /** * This class holds the {@link SystemIndexDescriptor} objects that represent system indices the @@ -45,12 +48,17 @@ */ public class SystemIndices { + private static final Map> SERVER_SYSTEM_INDEX_DESCRIPTORS = Map.of( + TaskResultsService.class.getName(), List.of(new SystemIndexDescriptor(TASK_INDEX + "*", "Task Result Index")) + ); + private final CharacterRunAutomaton runAutomaton; private final Collection systemIndexDescriptors; - public SystemIndices(Map> systemIndexDescriptorMap) { - checkForOverlappingPatterns(systemIndexDescriptorMap); - this.systemIndexDescriptors = systemIndexDescriptorMap.values() + public SystemIndices(Map> pluginAndModulesDescriptors) { + final Map> descriptorsMap = buildSystemIndexDescriptorMap(pluginAndModulesDescriptors); + checkForOverlappingPatterns(descriptorsMap); + this.systemIndexDescriptors = descriptorsMap.values() .stream() .flatMap(Collection::stream) .collect(Collectors.toUnmodifiableList()); @@ -63,7 +71,16 @@ public SystemIndices(Map> systemIndexD * @return true if the {@link Index}'s name matches a pattern from a {@link SystemIndexDescriptor} */ public boolean isSystemIndex(Index index) { - return runAutomaton.run(index.getName()); + return isSystemIndex(index.getName()); + } + + /** + * Determines whether a given index is a system index by comparing its name to the collection of loaded {@link SystemIndexDescriptor}s + * @param indexName the index name to check against loaded {@link SystemIndexDescriptor}s + * @return true if the index name matches a pattern from a {@link SystemIndexDescriptor} + */ + public boolean isSystemIndex(String indexName) { + return runAutomaton.run(indexName); } /** @@ -126,10 +143,10 @@ static void checkForOverlappingPatterns(Map overlaps(descriptorToCheck.v2(), d.v2())) .collect(Collectors.toUnmodifiableList()); if (descriptorsMatchingThisPattern.isEmpty() == false) { - throw new IllegalStateException("a system index descriptor [" + descriptorToCheck.v2() + "] from plugin [" + + throw new IllegalStateException("a system index descriptor [" + descriptorToCheck.v2() + "] from [" + descriptorToCheck.v1() + "] overlaps with other system index descriptors: [" + descriptorsMatchingThisPattern.stream() - .map(descriptor -> descriptor.v2() + " from plugin [" + descriptor.v1() + "]") + .map(descriptor -> descriptor.v2() + " from [" + descriptor.v1() + "]") .collect(Collectors.joining(", "))); } }); @@ -140,4 +157,19 @@ private static boolean overlaps(SystemIndexDescriptor a1, SystemIndexDescriptor Automaton a2Automaton = Regex.simpleMatchToAutomaton(a2.getIndexPattern()); return Operations.isEmpty(Operations.intersection(a1Automaton, a2Automaton)) == false; } + + private static Map> buildSystemIndexDescriptorMap( + Map> pluginAndModulesMap) { + final Map> map = + new HashMap<>(pluginAndModulesMap.size() + SERVER_SYSTEM_INDEX_DESCRIPTORS.size()); + map.putAll(pluginAndModulesMap); + // put the server items last since we expect less of them + SERVER_SYSTEM_INDEX_DESCRIPTORS.forEach((source, descriptors) -> { + if (map.putIfAbsent(source, descriptors) != null) { + throw new IllegalArgumentException("plugin or module attempted to define the same source [" + source + + "] as a built-in system index"); + } + }); + return Map.copyOf(map); + } } diff --git a/server/src/test/java/org/elasticsearch/indices/SystemIndicesTests.java b/server/src/test/java/org/elasticsearch/indices/SystemIndicesTests.java index 7851522556063..439df84e184b2 100644 --- a/server/src/test/java/org/elasticsearch/indices/SystemIndicesTests.java +++ b/server/src/test/java/org/elasticsearch/indices/SystemIndicesTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.indices; +import org.elasticsearch.tasks.TaskResultsService; import org.elasticsearch.test.ESTestCase; import java.util.Collection; @@ -26,6 +27,7 @@ import java.util.List; import java.util.Map; +import static org.elasticsearch.tasks.TaskResultsService.TASK_INDEX; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; @@ -50,8 +52,8 @@ public void testBasicOverlappingPatterns() { IllegalStateException exception = expectThrows(IllegalStateException.class, () -> SystemIndices.checkForOverlappingPatterns(descriptors)); assertThat(exception.getMessage(), containsString("a system index descriptor [" + broadPattern + - "] from plugin [" + broadPatternSource + "] overlaps with other system index descriptors:")); - String fromPluginString = " from plugin [" + otherSource + "]"; + "] from [" + broadPatternSource + "] overlaps with other system index descriptors:")); + String fromPluginString = " from [" + otherSource + "]"; assertThat(exception.getMessage(), containsString(overlapping1.toString() + fromPluginString)); assertThat(exception.getMessage(), containsString(overlapping2.toString() + fromPluginString)); assertThat(exception.getMessage(), containsString(overlapping3.toString() + fromPluginString)); @@ -77,10 +79,25 @@ public void testComplexOverlappingPatterns() { IllegalStateException exception = expectThrows(IllegalStateException.class, () -> SystemIndices.checkForOverlappingPatterns(descriptors)); assertThat(exception.getMessage(), containsString("a system index descriptor [" + pattern1 + - "] from plugin [" + source1 + "] overlaps with other system index descriptors:")); - assertThat(exception.getMessage(), containsString(pattern2.toString() + " from plugin [" + source2 + "]")); + "] from [" + source1 + "] overlaps with other system index descriptors:")); + assertThat(exception.getMessage(), containsString(pattern2.toString() + " from [" + source2 + "]")); IllegalStateException constructorException = expectThrows(IllegalStateException.class, () -> new SystemIndices(descriptors)); assertThat(constructorException.getMessage(), equalTo(exception.getMessage())); } + + public void testBuiltInSystemIndices() { + SystemIndices systemIndices = new SystemIndices(Map.of()); + assertTrue(systemIndices.isSystemIndex(".tasks")); + assertTrue(systemIndices.isSystemIndex(".tasks1")); + assertTrue(systemIndices.isSystemIndex(".tasks-old")); + } + + public void testPluginCannotOverrideBuiltInSystemIndex() { + Map> pluginMap = Map.of( + TaskResultsService.class.getName(), List.of(new SystemIndexDescriptor(TASK_INDEX, "Task Result Index")) + ); + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new SystemIndices(pluginMap)); + assertThat(e.getMessage(), containsString("plugin or module attempted to define the same source")); + } }