From bba94d7b5d7d25e52058f3d02eb1e0b939e2351d Mon Sep 17 00:00:00 2001 From: Jay Modi Date: Mon, 1 Mar 2021 10:38:53 -0700 Subject: [PATCH 1/2] Introduce system index types including external This commit introduces system index types that will be used to differentiate behavior. Previously system indices were all treated the same regardless of whether they belonged to Elasticsearch, a stack component, or one of our solutions. Upon further discussion and analysis this decision was not in the best interest of the various teams and instead a new type of system index was needed. These system indices will be referred to as external system indices. Within external system indices, an option exists for these indices to be managed by Elasticsearch or to be managed by the external product. In order to represent this within Elasticsearch, each system index will have a type and this type will be used to control behavior. Closes #67383 Backport of #68919 --- .../kibana/KibanaSystemIndexIT.java | 68 ++--- .../elasticsearch/kibana/KibanaPlugin.java | 155 +++-------- .../kibana/KibanaPluginTests.java | 19 +- .../ReindexSourceTargetValidationTests.java | 14 +- .../elasticsearch/http/SystemIndexRestIT.java | 45 +++- .../action/IndicesRequestIT.java | 6 +- .../cluster/ClusterInfoServiceIT.java | 4 +- .../indices/TestSystemIndexDescriptor.java | 17 +- .../DedicatedClusterSnapshotRestoreIT.java | 4 +- .../alias/get/TransportGetAliasesAction.java | 49 +++- .../elasticsearch/cluster/ClusterModule.java | 6 +- .../metadata/IndexNameExpressionResolver.java | 109 +++++--- .../indices/SystemIndexDescriptor.java | 114 ++++++++- .../elasticsearch/indices/SystemIndices.java | 45 ++++ .../java/org/elasticsearch/node/Node.java | 31 +-- .../elasticsearch/rest/RestController.java | 19 +- .../action/ActionModuleTests.java | 18 +- ...tAddVotingConfigExclusionsActionTests.java | 5 +- ...learVotingConfigExclusionsActionTests.java | 5 +- .../get/TransportGetAliasesActionTests.java | 33 ++- .../indices/get/GetIndexActionTests.java | 3 +- .../mapping/put/PutMappingRequestTests.java | 19 +- .../indices/resolve/ResolveIndexTests.java | 6 +- .../MetadataRolloverServiceTests.java | 16 +- .../settings/get/GetSettingsActionTests.java | 3 +- ...ActionIndicesThatCannotBeCreatedTests.java | 16 +- .../bulk/TransportBulkActionIngestTests.java | 11 +- .../action/bulk/TransportBulkActionTests.java | 3 +- .../bulk/TransportBulkActionTookTests.java | 6 +- .../get/TransportMultiGetActionTests.java | 3 +- ...TransportResyncReplicationActionTests.java | 9 +- .../search/MultiSearchActionTookTests.java | 14 - .../action/support/AutoCreateIndexTests.java | 20 +- .../TransportBroadcastByNodeActionTests.java | 5 +- .../TransportMasterNodeActionTests.java | 9 +- .../BroadcastReplicationTests.java | 4 +- .../TransportWriteActionTests.java | 9 +- ...ortInstanceSingleOperationActionTests.java | 5 +- .../TransportMultiTermVectorsActionTests.java | 3 +- .../cluster/ClusterModuleTests.java | 26 +- .../health/ClusterStateHealthTests.java | 7 +- .../DateMathExpressionResolverTests.java | 6 +- ...ExpressionResolverAliasIterationTests.java | 7 +- ...sionResolverExpressionsIterationTests.java | 7 +- .../IndexNameExpressionResolverTests.java | 242 +++++++++++++----- .../MetadataCreateIndexServiceTests.java | 3 +- .../MetadataIndexTemplateServiceTests.java | 6 +- .../WildcardExpressionResolverTests.java | 31 +-- .../elasticsearch/index/IndexModuleTests.java | 43 ++-- .../query/SearchIndexNameMatcherTests.java | 9 +- .../seqno/RetentionLeaseSyncActionTests.java | 11 +- .../indices/cluster/ClusterStateChanges.java | 17 +- .../snapshots/SnapshotResiliencyTests.java | 26 +- .../indices/EmptySystemIndices.java | 25 ++ .../TestIndexNameExpressionResolver.java | 46 ++++ .../org/elasticsearch/test/ESTestCase.java | 4 +- .../core/ilm/GenerateSnapshotNameStep.java | 3 +- .../validation/SourceDestValidatorTests.java | 20 +- .../DeprecationInfoActionResponseTests.java | 4 +- .../core/ml/utils/MlIndexAndAliasTests.java | 4 +- .../DeleteDataStreamTransportActionTests.java | 5 +- .../GetDataStreamsTransportActionTests.java | 57 +---- .../xpack/enrich/AbstractEnrichTestCase.java | 5 +- .../enrich/EnrichPolicyExecutorTests.java | 16 +- .../EnrichPolicyMaintenanceServiceTests.java | 4 +- .../org/elasticsearch/xpack/fleet/Fleet.java | 13 +- .../integration/ModelSnapshotRetentionIT.java | 7 +- .../AutodetectResultProcessorIT.java | 9 +- .../ml/integration/EstablishedMemUsageIT.java | 7 +- .../ml/integration/JobResultsProviderIT.java | 8 +- .../integration/JobStorageDeletionTaskIT.java | 5 +- .../ml/integration/MlConfigMigratorIT.java | 4 +- .../ml/integration/UnusedStatsRemoverIT.java | 4 +- ...ortStartDataFrameAnalyticsActionTests.java | 5 +- .../datafeed/DatafeedNodeSelectorTests.java | 5 +- .../TrainedModelStatsServiceTests.java | 6 +- .../persistence/JobResultsProviderTests.java | 4 +- .../AutodetectProcessManagerTests.java | 4 +- .../OpenJobPersistentTasksExecutorTests.java | 5 +- ...stractJobPersistentTasksExecutorTests.java | 7 +- .../cluster/ClusterStatsCollectorTests.java | 6 +- .../DateMathExpressionIntegTests.java | 7 +- .../xpack/security/SecurityTests.java | 4 +- .../authz/AuthorizationServiceTests.java | 14 +- .../authz/IndicesAndAliasesResolverTests.java | 6 +- ...TransformPersistentTasksExecutorTests.java | 12 +- .../xpack/watcher/WatcherPluginTests.java | 5 +- 87 files changed, 1001 insertions(+), 710 deletions(-) create mode 100644 test/framework/src/main/java/org/elasticsearch/indices/EmptySystemIndices.java create mode 100644 test/framework/src/main/java/org/elasticsearch/indices/TestIndexNameExpressionResolver.java diff --git a/modules/kibana/src/javaRestTest/java/org/elasticsearch/kibana/KibanaSystemIndexIT.java b/modules/kibana/src/javaRestTest/java/org/elasticsearch/kibana/KibanaSystemIndexIT.java index 8bcce5b24c4ed..05379770793d0 100644 --- a/modules/kibana/src/javaRestTest/java/org/elasticsearch/kibana/KibanaSystemIndexIT.java +++ b/modules/kibana/src/javaRestTest/java/org/elasticsearch/kibana/KibanaSystemIndexIT.java @@ -44,45 +44,45 @@ public static Iterable data() { } public void testCreateIndex() throws IOException { - Request request = new Request("PUT", "/_kibana/" + indexName); + Request request = request("PUT", "/" + indexName); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); } public void testAliases() throws IOException { assumeFalse("In this test, .kibana is the alias name", ".kibana".equals(indexName)); - Request request = new Request("PUT", "/_kibana/" + indexName); + Request request = request("PUT", "/" + indexName); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - request = new Request("PUT", "/_kibana/" + indexName + "/_alias/.kibana"); + request = request("PUT", "/" + indexName + "/_alias/.kibana"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - request = new Request("GET", "/_kibana/_aliases"); + request = request("GET", "/_aliases"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); assertThat(EntityUtils.toString(response.getEntity()), containsString(".kibana")); } public void testBulkToKibanaIndex() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity("{ \"index\" : { \"_index\" : \"" + indexName + "\", \"_id\" : \"1\" } }\n{ \"foo\" : \"bar\" }\n"); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); } public void testRefresh() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity("{ \"index\" : { \"_index\" : \"" + indexName + "\", \"_id\" : \"1\" } }\n{ \"foo\" : \"bar\" }\n"); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - request = new Request("GET", "/_kibana/" + indexName + "/_refresh"); + request = request("GET", "/" + indexName + "/_refresh"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request getRequest = new Request("GET", "/_kibana/" + indexName + "/_doc/1"); + Request getRequest = request("GET", "/" + indexName + "/_doc/1"); Response getResponse = client().performRequest(getRequest); assertThat(getResponse.getStatusLine().getStatusCode(), is(200)); String responseBody = EntityUtils.toString(getResponse.getEntity()); @@ -91,14 +91,14 @@ public void testRefresh() throws IOException { } public void testGetFromKibanaIndex() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity("{ \"index\" : { \"_index\" : \"" + indexName + "\", \"_id\" : \"1\" } }\n{ \"foo\" : \"bar\" }\n"); request.addParameter("refresh", "true"); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request getRequest = new Request("GET", "/_kibana/" + indexName + "/_doc/1"); + Request getRequest = request("GET", "/" + indexName + "/_doc/1"); Response getResponse = client().performRequest(getRequest); assertThat(getResponse.getStatusLine().getStatusCode(), is(200)); String responseBody = EntityUtils.toString(getResponse.getEntity()); @@ -107,7 +107,7 @@ public void testGetFromKibanaIndex() throws IOException { } public void testMultiGetFromKibanaIndex() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity( "{ \"index\" : { \"_index\" : \"" + indexName @@ -121,7 +121,7 @@ public void testMultiGetFromKibanaIndex() throws IOException { Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request getRequest = new Request("GET", "/_kibana/_mget"); + Request getRequest = request("GET", "/_mget"); getRequest.setJsonEntity( "{ \"docs\" : [ { \"_index\" : \"" + indexName @@ -140,7 +140,7 @@ public void testMultiGetFromKibanaIndex() throws IOException { } public void testSearchFromKibanaIndex() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity( "{ \"index\" : { \"_index\" : \"" + indexName @@ -154,7 +154,7 @@ public void testSearchFromKibanaIndex() throws IOException { Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request searchRequest = new Request("GET", "/_kibana/" + indexName + "/_search"); + Request searchRequest = request("GET", "/" + indexName + "/_search"); searchRequest.setJsonEntity("{ \"query\" : { \"match_all\" : {} } }\n"); Response getResponse = client().performRequest(searchRequest); assertThat(getResponse.getStatusLine().getStatusCode(), is(200)); @@ -166,7 +166,7 @@ public void testSearchFromKibanaIndex() throws IOException { } public void testDeleteFromKibanaIndex() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity( "{ \"index\" : { \"_index\" : \"" + indexName @@ -180,13 +180,13 @@ public void testDeleteFromKibanaIndex() throws IOException { Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request deleteRequest = new Request("DELETE", "/_kibana/" + indexName + "/_doc/1"); + Request deleteRequest = request("DELETE", "/" + indexName + "/_doc/1"); Response deleteResponse = client().performRequest(deleteRequest); assertThat(deleteResponse.getStatusLine().getStatusCode(), is(200)); } public void testDeleteByQueryFromKibanaIndex() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity( "{ \"index\" : { \"_index\" : \"" + indexName @@ -200,62 +200,62 @@ public void testDeleteByQueryFromKibanaIndex() throws IOException { Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request dbqRequest = new Request("POST", "/_kibana/" + indexName + "/_delete_by_query"); + Request dbqRequest = request("POST", "/" + indexName + "/_delete_by_query"); dbqRequest.setJsonEntity("{ \"query\" : { \"match_all\" : {} } }\n"); Response dbqResponse = client().performRequest(dbqRequest); assertThat(dbqResponse.getStatusLine().getStatusCode(), is(200)); } public void testUpdateIndexSettings() throws IOException { - Request request = new Request("PUT", "/_kibana/" + indexName); + Request request = request("PUT", "/" + indexName); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - request = new Request("PUT", "/_kibana/" + indexName + "/_settings"); + request = request("PUT", "/" + indexName + "/_settings"); request.setJsonEntity("{ \"index.blocks.read_only\" : false }"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); } public void testGetIndex() throws IOException { - Request request = new Request("PUT", "/_kibana/" + indexName); + Request request = request("PUT", "/" + indexName); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - request = new Request("GET", "/_kibana/" + indexName); + request = request("GET", "/" + indexName); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); assertThat(EntityUtils.toString(response.getEntity()), containsString(indexName)); } public void testIndexingAndUpdatingDocs() throws IOException { - Request request = new Request("PUT", "/_kibana/" + indexName + "/_doc/1"); + Request request = request("PUT", "/" + indexName + "/_doc/1"); request.setJsonEntity("{ \"foo\" : \"bar\" }"); Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(201)); - request = new Request("PUT", "/_kibana/" + indexName + "/_create/2"); + request = request("PUT", "/" + indexName + "/_create/2"); request.setJsonEntity("{ \"foo\" : \"bar\" }"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(201)); - request = new Request("POST", "/_kibana/" + indexName + "/_doc"); + request = request("POST", "/" + indexName + "/_doc"); request.setJsonEntity("{ \"foo\" : \"bar\" }"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(201)); - request = new Request("GET", "/_kibana/" + indexName + "/_refresh"); + request = request("GET", "/" + indexName + "/_refresh"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - request = new Request("POST", "/_kibana/" + indexName + "/_update/1"); + request = request("POST", "/" + indexName + "/_update/1"); request.setJsonEntity("{ \"doc\" : { \"foo\" : \"baz\" } }"); response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); } public void testScrollingDocs() throws IOException { - Request request = new Request("POST", "/_kibana/_bulk"); + Request request = request("POST", "/_bulk"); request.setJsonEntity( "{ \"index\" : { \"_index\" : \"" + indexName @@ -271,7 +271,7 @@ public void testScrollingDocs() throws IOException { Response response = client().performRequest(request); assertThat(response.getStatusLine().getStatusCode(), is(200)); - Request searchRequest = new Request("GET", "/_kibana/" + indexName + "/_search"); + Request searchRequest = request("GET", "/" + indexName + "/_search"); searchRequest.setJsonEntity("{ \"size\" : 1,\n\"query\" : { \"match_all\" : {} } }\n"); searchRequest.addParameter("scroll", "1m"); response = client().performRequest(searchRequest); @@ -280,7 +280,7 @@ public void testScrollingDocs() throws IOException { assertNotNull(map.get("_scroll_id")); String scrollId = (String) map.get("_scroll_id"); - Request scrollRequest = new Request("POST", "/_kibana/_search/scroll"); + Request scrollRequest = request("POST", "/_search/scroll"); scrollRequest.addParameter("scroll_id", scrollId); scrollRequest.addParameter("scroll", "1m"); response = client().performRequest(scrollRequest); @@ -289,9 +289,15 @@ public void testScrollingDocs() throws IOException { assertNotNull(map.get("_scroll_id")); scrollId = (String) map.get("_scroll_id"); - Request clearScrollRequest = new Request("DELETE", "/_kibana/_search/scroll"); + Request clearScrollRequest = request("DELETE", "/_search/scroll"); clearScrollRequest.addParameter("scroll_id", scrollId); response = client().performRequest(clearScrollRequest); assertThat(response.getStatusLine().getStatusCode(), is(200)); } + + private Request request(String method, String endpoint) { + Request request = new Request(method, endpoint); + request.setOptions(request.getOptions().toBuilder().addHeader("X-elastic-product-origin", "kibana").build()); + return request; + } } diff --git a/modules/kibana/src/main/java/org/elasticsearch/kibana/KibanaPlugin.java b/modules/kibana/src/main/java/org/elasticsearch/kibana/KibanaPlugin.java index bc782a99c6671..e120c4e41f3d5 100644 --- a/modules/kibana/src/main/java/org/elasticsearch/kibana/KibanaPlugin.java +++ b/modules/kibana/src/main/java/org/elasticsearch/kibana/KibanaPlugin.java @@ -8,65 +8,61 @@ package org.elasticsearch.kibana; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.cluster.node.DiscoveryNodes; -import org.elasticsearch.common.settings.ClusterSettings; -import org.elasticsearch.common.settings.IndexScopedSettings; -import org.elasticsearch.common.settings.Setting; -import org.elasticsearch.common.settings.Setting.Property; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsFilter; -import org.elasticsearch.index.reindex.RestDeleteByQueryAction; import org.elasticsearch.indices.SystemIndexDescriptor; +import org.elasticsearch.indices.SystemIndexDescriptor.Type; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.SystemIndexPlugin; -import org.elasticsearch.rest.BaseRestHandler; -import org.elasticsearch.rest.RestController; -import org.elasticsearch.rest.RestHandler; -import org.elasticsearch.rest.action.admin.indices.RestCreateIndexAction; -import org.elasticsearch.rest.action.admin.indices.RestGetAliasesAction; -import org.elasticsearch.rest.action.admin.indices.RestGetIndicesAction; -import org.elasticsearch.rest.action.admin.indices.RestIndexPutAliasAction; -import org.elasticsearch.rest.action.admin.indices.RestRefreshAction; -import org.elasticsearch.rest.action.admin.indices.RestUpdateSettingsAction; -import org.elasticsearch.rest.action.document.RestBulkAction; -import org.elasticsearch.rest.action.document.RestDeleteAction; -import org.elasticsearch.rest.action.document.RestGetAction; -import org.elasticsearch.rest.action.document.RestIndexAction; -import org.elasticsearch.rest.action.document.RestIndexAction.AutoIdHandler; -import org.elasticsearch.rest.action.document.RestIndexAction.CreateHandler; -import org.elasticsearch.rest.action.document.RestMultiGetAction; -import org.elasticsearch.rest.action.document.RestUpdateAction; -import org.elasticsearch.rest.action.search.RestClearScrollAction; -import org.elasticsearch.rest.action.search.RestSearchAction; -import org.elasticsearch.rest.action.search.RestSearchScrollAction; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; +import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; public class KibanaPlugin extends Plugin implements SystemIndexPlugin { - public static final Setting> KIBANA_INDEX_NAMES_SETTING = Setting.listSetting( - "kibana.system_indices", - unmodifiableList(Arrays.asList(".kibana", ".kibana_*", ".reporting-*", ".apm-agent-configuration", ".apm-custom-link")), - Function.identity(), - Property.NodeScope - ); + private static final List KIBANA_PRODUCT_ORIGIN = singletonList("kibana"); + + public static final SystemIndexDescriptor KIBANA_INDEX_DESCRIPTOR = SystemIndexDescriptor.builder() + .setIndexPattern(".kibana_*") + .setDescription("Kibana saved objects system index") + .setAliasName(".kibana") + .setType(Type.EXTERNAL_UNMANAGED) + .setAllowedElasticProductOrigins(KIBANA_PRODUCT_ORIGIN) + .build(); + + public static final SystemIndexDescriptor REPORTING_INDEX_DESCRIPTOR = SystemIndexDescriptor.builder() + .setIndexPattern(".reporting-*") + .setDescription("system index for reporting") + .setType(Type.EXTERNAL_UNMANAGED) + .setAllowedElasticProductOrigins(KIBANA_PRODUCT_ORIGIN) + .build(); + + public static final SystemIndexDescriptor APM_AGENT_CONFIG_INDEX_DESCRIPTOR = SystemIndexDescriptor.builder() + .setIndexPattern(".apm-agent-configuration") + .setDescription("system index for APM agent configuration") + .setType(Type.EXTERNAL_UNMANAGED) + .setAllowedElasticProductOrigins(KIBANA_PRODUCT_ORIGIN) + .build(); + + public static final SystemIndexDescriptor APM_CUSTOM_LINK_INDEX_DESCRIPTOR = SystemIndexDescriptor.builder() + .setIndexPattern(".apm-custom-link") + .setDescription("system index for APM custom links") + .setType(Type.EXTERNAL_UNMANAGED) + .setAllowedElasticProductOrigins(KIBANA_PRODUCT_ORIGIN) + .build(); @Override public Collection getSystemIndexDescriptors(Settings settings) { return unmodifiableList( - KIBANA_INDEX_NAMES_SETTING.get(settings) - .stream() - .map(pattern -> new SystemIndexDescriptor(pattern, "System index used by kibana")) - .collect(Collectors.toList()) + Arrays.asList( + KIBANA_INDEX_DESCRIPTOR, + REPORTING_INDEX_DESCRIPTOR, + APM_AGENT_CONFIG_INDEX_DESCRIPTOR, + APM_CUSTOM_LINK_INDEX_DESCRIPTOR + ) ); } @@ -79,79 +75,4 @@ public String getFeatureName() { public String getFeatureDescription() { return "Manages Kibana configuration and reports"; } - - @Override - public List getRestHandlers( - Settings settings, - RestController restController, - ClusterSettings clusterSettings, - IndexScopedSettings indexScopedSettings, - SettingsFilter settingsFilter, - IndexNameExpressionResolver indexNameExpressionResolver, - Supplier nodesInCluster - ) { - // TODO need to figure out what subset of system indices Kibana should have access to via these APIs - return unmodifiableList( - Arrays.asList( - // Based on https://github.com/elastic/kibana/issues/49764 - // apis needed to perform migrations... ideally these will go away - new KibanaWrappedRestHandler(new RestCreateIndexAction()), - new KibanaWrappedRestHandler(new RestGetAliasesAction()), - new KibanaWrappedRestHandler(new RestIndexPutAliasAction()), - new KibanaWrappedRestHandler(new RestRefreshAction()), - - // apis needed to access saved objects - new KibanaWrappedRestHandler(new RestGetAction()), - new KibanaWrappedRestHandler(new RestMultiGetAction(settings)), - new KibanaWrappedRestHandler(new RestSearchAction()), - new KibanaWrappedRestHandler(new RestBulkAction(settings)), - new KibanaWrappedRestHandler(new RestDeleteAction()), - new KibanaWrappedRestHandler(new RestDeleteByQueryAction()), - - // api used for testing - new KibanaWrappedRestHandler(new RestUpdateSettingsAction()), - - // apis used specifically by reporting - new KibanaWrappedRestHandler(new RestGetIndicesAction()), - new KibanaWrappedRestHandler(new RestIndexAction()), - new KibanaWrappedRestHandler(new CreateHandler()), - new KibanaWrappedRestHandler(new AutoIdHandler(nodesInCluster)), - new KibanaWrappedRestHandler(new RestUpdateAction()), - new KibanaWrappedRestHandler(new RestSearchScrollAction()), - new KibanaWrappedRestHandler(new RestClearScrollAction()) - ) - ); - - } - - @Override - public List> getSettings() { - return Collections.singletonList(KIBANA_INDEX_NAMES_SETTING); - } - - static class KibanaWrappedRestHandler extends BaseRestHandler.Wrapper { - - KibanaWrappedRestHandler(BaseRestHandler delegate) { - super(delegate); - } - - @Override - public String getName() { - return "kibana_" + super.getName(); - } - - @Override - public boolean allowSystemIndexAccessByDefault() { - return true; - } - - @Override - public List routes() { - return unmodifiableList( - super.routes().stream() - .map(route -> new Route(route.getMethod(), "/_kibana" + route.getPath())) - .collect(Collectors.toList()) - ); - } - } } diff --git a/modules/kibana/src/test/java/org/elasticsearch/kibana/KibanaPluginTests.java b/modules/kibana/src/test/java/org/elasticsearch/kibana/KibanaPluginTests.java index 578de98efa03b..7adece35dbfc5 100644 --- a/modules/kibana/src/test/java/org/elasticsearch/kibana/KibanaPluginTests.java +++ b/modules/kibana/src/test/java/org/elasticsearch/kibana/KibanaPluginTests.java @@ -12,36 +12,19 @@ import org.elasticsearch.indices.SystemIndexDescriptor; import org.elasticsearch.test.ESTestCase; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.stream.Collectors; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.is; public class KibanaPluginTests extends ESTestCase { public void testKibanaIndexNames() { - assertThat(new KibanaPlugin().getSettings(), contains(KibanaPlugin.KIBANA_INDEX_NAMES_SETTING)); assertThat( new KibanaPlugin().getSystemIndexDescriptors(Settings.EMPTY) .stream() .map(SystemIndexDescriptor::getIndexPattern) .collect(Collectors.toList()), - contains(".kibana", ".kibana_*", ".reporting-*", ".apm-agent-configuration", ".apm-custom-link") - ); - final List names = Collections.unmodifiableList(Arrays.asList("." + randomAlphaOfLength(4), "." + randomAlphaOfLength(5))); - final List namesFromDescriptors = new KibanaPlugin().getSystemIndexDescriptors( - Settings.builder().putList(KibanaPlugin.KIBANA_INDEX_NAMES_SETTING.getKey(), names).build() - ).stream().map(SystemIndexDescriptor::getIndexPattern).collect(Collectors.toList()); - assertThat(namesFromDescriptors, is(names)); - - assertThat( - new KibanaPlugin().getSystemIndexDescriptors(Settings.EMPTY) - .stream() - .anyMatch(systemIndexDescriptor -> systemIndexDescriptor.matchesIndexPattern(".kibana-event-log-7-1")), - is(false) + contains(".kibana_*", ".reporting-*", ".apm-agent-configuration", ".apm-custom-link") ); } } diff --git a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexSourceTargetValidationTests.java b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexSourceTargetValidationTests.java index 57f4aa2502ecf..6996165411916 100644 --- a/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexSourceTargetValidationTests.java +++ b/modules/reindex/src/test/java/org/elasticsearch/index/reindex/ReindexSourceTargetValidationTests.java @@ -24,12 +24,10 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.indices.SystemIndices; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.EmptySystemIndices; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; -import java.util.HashMap; - import static java.util.Collections.emptyMap; import static org.hamcrest.Matchers.containsString; @@ -51,11 +49,11 @@ public class ReindexSourceTargetValidationTests extends ESTestCase { .put(index("baz"), true) .put(index("source", "source_multi"), true) .put(index("source2", "source_multi"), true)).build(); - private static final IndexNameExpressionResolver INDEX_NAME_EXPRESSION_RESOLVER = - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + private static final IndexNameExpressionResolver INDEX_NAME_EXPRESSION_RESOLVER = TestIndexNameExpressionResolver.newInstance(); private static final AutoCreateIndex AUTO_CREATE_INDEX = new AutoCreateIndex(Settings.EMPTY, - new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), INDEX_NAME_EXPRESSION_RESOLVER, - new SystemIndices(new HashMap<>())); + new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), INDEX_NAME_EXPRESSION_RESOLVER, + EmptySystemIndices.INSTANCE + ); private final BytesReference query = new BytesArray("{ \"foo\" : \"bar\" }"); diff --git a/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java b/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java index df061c9f02aa6..2583f7bcaa47d 100644 --- a/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java +++ b/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java @@ -8,12 +8,14 @@ package org.elasticsearch.http; +import org.elasticsearch.Version; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.client.Request; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.Response; import org.elasticsearch.client.node.NodeClient; +import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.common.settings.ClusterSettings; @@ -21,7 +23,9 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.SettingsFilter; import org.elasticsearch.common.util.CollectionUtils; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.indices.SystemIndexDescriptor; +import org.elasticsearch.indices.SystemIndexDescriptor.Type; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.SystemIndexPlugin; import org.elasticsearch.rest.BaseRestHandler; @@ -31,12 +35,14 @@ import org.elasticsearch.rest.action.RestStatusToXContentListener; import java.io.IOException; +import java.io.UncheckedIOException; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Supplier; +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.test.rest.ESRestTestCase.entityAsMap; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasKey; @@ -117,6 +123,12 @@ public static class SystemIndexTestPlugin extends Plugin implements SystemIndexP public static final String SYSTEM_INDEX_NAME = ".test-system-idx"; + public static final Settings SETTINGS = Settings.builder() + .put(IndexMetadata.INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), 1) + .put(IndexMetadata.INDEX_AUTO_EXPAND_REPLICAS_SETTING.getKey(), "0-1") + .put(IndexMetadata.SETTING_PRIORITY, Integer.MAX_VALUE) + .build(); + @Override public List getRestHandlers(Settings settings, RestController restController, ClusterSettings clusterSettings, IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter, @@ -127,7 +139,38 @@ public List getRestHandlers(Settings settings, RestController restC @Override public Collection getSystemIndexDescriptors(Settings settings) { - return Collections.singletonList(new SystemIndexDescriptor(SYSTEM_INDEX_NAME, "System indices for tests")); + try (XContentBuilder builder = jsonBuilder()) { + builder.startObject(); + { + builder.startObject("_meta"); + builder.field("version", Version.CURRENT.toString()); + builder.endObject(); + + builder.field("dynamic", "strict"); + builder.startObject("properties"); + { + builder.startObject("some_field"); + builder.field("type", "keyword"); + builder.endObject(); + } + builder.endObject(); + } + builder.endObject(); + + return Collections.singletonList(SystemIndexDescriptor.builder() + .setIndexPattern(SYSTEM_INDEX_NAME + "*") + .setPrimaryIndex(SYSTEM_INDEX_NAME) + .setDescription("Test system index") + .setOrigin(getClass().getName()) + .setVersionMetaKey("version") + .setMappings(builder) + .setSettings(SETTINGS) + .setType(Type.INTERNAL) + .build() + ); + } catch (IOException e) { + throw new UncheckedIOException("Failed to build " + SYSTEM_INDEX_NAME + " index mappings", e); + } } @Override diff --git a/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java b/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java index 6a3e99c3d02dd..65f903ebdcf8f 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java @@ -67,11 +67,11 @@ import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Requests; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.plugins.NetworkPlugin; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.PluginsService; @@ -381,7 +381,7 @@ public void testFlush() { internalCluster().coordOnlyNodeClient().admin().indices().flush(flushRequest).actionGet(); clearInterceptedActions(); - String[] indices = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) + String[] indices = TestIndexNameExpressionResolver.newInstance() .concreteIndexNames(client().admin().cluster().prepareState().get().getState(), flushRequest); assertIndicesSubset(Arrays.asList(indices), indexShardActions); } @@ -406,7 +406,7 @@ public void testRefresh() { internalCluster().coordOnlyNodeClient().admin().indices().refresh(refreshRequest).actionGet(); clearInterceptedActions(); - String[] indices = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) + String[] indices = TestIndexNameExpressionResolver.newInstance() .concreteIndexNames(client().admin().cluster().prepareState().get().getState(), refreshRequest); assertIndicesSubset(Arrays.asList(indices), indexShardActions); } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterInfoServiceIT.java b/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterInfoServiceIT.java index 4734d2eb27087..4747fd8307173 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterInfoServiceIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterInfoServiceIT.java @@ -42,7 +42,6 @@ import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Set; @@ -83,8 +82,7 @@ public List getActionFilters() { @Override public Collection getSystemIndexDescriptors(Settings settings) { - return Collections.singletonList(new SystemIndexDescriptor(TEST_SYSTEM_INDEX_NAME, - "System index for [" + getTestClass().getName() + ']')); + return singletonList(new SystemIndexDescriptor(TEST_SYSTEM_INDEX_NAME, "Test system index")); } @Override diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java index 6df2d6123d2a5..580197b1ab2d2 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/TestSystemIndexDescriptor.java @@ -13,12 +13,12 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.mapper.MapperService; import java.io.IOException; import java.io.UncheckedIOException; import java.util.concurrent.atomic.AtomicBoolean; +import static java.util.Collections.emptyList; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.mapper.MapperService.SINGLE_MAPPING_NAME; @@ -40,19 +40,8 @@ public class TestSystemIndexDescriptor extends SystemIndexDescriptor { .build(); TestSystemIndexDescriptor() { - super( - INDEX_NAME + "*", - PRIMARY_INDEX_NAME, - "Test system index", - null, - SETTINGS, - INDEX_NAME, - 0, - "version", - "stack", - MapperService.SINGLE_MAPPING_NAME, - null - ); + super(INDEX_NAME + "*", PRIMARY_INDEX_NAME, "Test system index", null, SETTINGS, INDEX_NAME, 0, "version", "stack", + SINGLE_MAPPING_NAME, null, Type.INTERNAL, emptyList()); } @Override diff --git a/server/src/internalClusterTest/java/org/elasticsearch/snapshots/DedicatedClusterSnapshotRestoreIT.java b/server/src/internalClusterTest/java/org/elasticsearch/snapshots/DedicatedClusterSnapshotRestoreIT.java index a4ac96b1667f8..4f6d5927425b8 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/snapshots/DedicatedClusterSnapshotRestoreIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/snapshots/DedicatedClusterSnapshotRestoreIT.java @@ -33,12 +33,12 @@ import org.elasticsearch.common.network.CloseableChannel; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.SettingsFilter; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.env.Environment; import org.elasticsearch.index.seqno.RetentionLeaseActions; import org.elasticsearch.index.seqno.RetentionLeases; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.indices.recovery.PeerRecoveryTargetService; import org.elasticsearch.indices.recovery.RecoveryState; import org.elasticsearch.node.Node; @@ -588,7 +588,7 @@ public void testRestoreShrinkIndex() throws Exception { public void testSnapshotWithDateMath() { final String repo = "repo"; - final IndexNameExpressionResolver nameExpressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + final IndexNameExpressionResolver nameExpressionResolver = TestIndexNameExpressionResolver.newInstance(); final String snapshotName = ""; logger.info("--> creating repository"); diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesAction.java index 9d51151e65335..34fc97b779484 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesAction.java @@ -16,6 +16,7 @@ import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.inject.Inject; @@ -31,6 +32,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.function.Predicate; import java.util.stream.Collectors; public class TransportGetAliasesAction extends TransportMasterNodeReadAction { @@ -62,10 +64,12 @@ protected void masterOperation(GetAliasesRequest request, ClusterState state, Ac try (ThreadContext.StoredContext ignore = threadPool.getThreadContext().newStoredContext(false)) { concreteIndices = indexNameExpressionResolver.concreteIndexNames(state, request); } - final boolean systemIndexAccessAllowed = indexNameExpressionResolver.isSystemIndexAccessAllowed(); + final SystemIndexAccessLevel systemIndexAccessLevel = indexNameExpressionResolver.getSystemIndexAccessLevel(); + final String elasticProduct = + threadPool.getThreadContext().getHeader(IndexNameExpressionResolver.EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY); ImmutableOpenMap> aliases = state.metadata().findAliases(request, concreteIndices); listener.onResponse(new GetAliasesResponse(postProcess(request, concreteIndices, aliases, state, - systemIndexAccessAllowed, systemIndices))); + systemIndexAccessLevel, elasticProduct, systemIndices))); } /** @@ -73,8 +77,8 @@ protected void masterOperation(GetAliasesRequest request, ClusterState state, Ac */ static ImmutableOpenMap> postProcess(GetAliasesRequest request, String[] concreteIndices, ImmutableOpenMap> aliases, - ClusterState state, boolean systemIndexAccessAllowed, - SystemIndices systemIndices) { + ClusterState state, SystemIndexAccessLevel systemIndexAccessLevel, + String elasticProduct, SystemIndices systemIndices) { boolean noAliasesSpecified = request.getOriginalAliases() == null || request.getOriginalAliases().length == 0; ImmutableOpenMap.Builder> mapBuilder = ImmutableOpenMap.builder(aliases); for (String index : concreteIndices) { @@ -84,20 +88,32 @@ static ImmutableOpenMap> postProcess(GetAliasesReque } } final ImmutableOpenMap> finalResponse = mapBuilder.build(); - if (systemIndexAccessAllowed == false) { - checkSystemIndexAccess(request, systemIndices, state, finalResponse); + if (systemIndexAccessLevel != SystemIndexAccessLevel.ALL) { + checkSystemIndexAccess(request, systemIndices, state, finalResponse, systemIndexAccessLevel, elasticProduct); } return finalResponse; } private static void checkSystemIndexAccess(GetAliasesRequest request, SystemIndices systemIndices, ClusterState state, - ImmutableOpenMap> aliasesMap) { + ImmutableOpenMap> aliasesMap, + SystemIndexAccessLevel systemIndexAccessLevel, String elasticProduct) { + final Predicate systemIndexAccessAllowPredicate; + if (systemIndexAccessLevel == SystemIndexAccessLevel.NONE) { + systemIndexAccessAllowPredicate = indexMetadata -> false; + } else if (systemIndexAccessLevel == SystemIndexAccessLevel.RESTRICTED) { + systemIndexAccessAllowPredicate = systemIndices.getProductSystemIndexMetadataPredicate(elasticProduct); + } else { + throw new IllegalArgumentException("Unexpected system index access level: " + systemIndexAccessLevel); + } + List systemIndicesNames = new ArrayList<>(); for (Iterator it = aliasesMap.keysIt(); it.hasNext(); ) { String indexName = it.next(); IndexMetadata index = state.metadata().index(indexName); if (index != null && index.isSystem()) { - systemIndicesNames.add(indexName); + if (systemIndexAccessAllowPredicate.test(index) == false) { + systemIndicesNames.add(indexName); + } } } if (systemIndicesNames.isEmpty() == false) { @@ -105,13 +121,24 @@ private static void checkSystemIndexAccess(GetAliasesRequest request, SystemIndi "this request accesses system indices: {}, but in a future major version, direct access to system " + "indices will be prevented by default", systemIndicesNames); } else { - checkSystemAliasAccess(request, systemIndices); + checkSystemAliasAccess(request, systemIndices, systemIndexAccessLevel, elasticProduct); } } - private static void checkSystemAliasAccess(GetAliasesRequest request, SystemIndices systemIndices) { + private static void checkSystemAliasAccess(GetAliasesRequest request, SystemIndices systemIndices, + SystemIndexAccessLevel systemIndexAccessLevel, String elasticProduct) { + final Predicate systemIndexAccessAllowPredicate; + if (systemIndexAccessLevel == SystemIndexAccessLevel.NONE) { + systemIndexAccessAllowPredicate = name -> true; + } else if (systemIndexAccessLevel == SystemIndexAccessLevel.RESTRICTED) { + systemIndexAccessAllowPredicate = systemIndices.getProductSystemIndexNamePredicate(elasticProduct).negate(); + } else { + throw new IllegalArgumentException("Unexpected system index access level: " + systemIndexAccessLevel); + } + final List systemAliases = Arrays.stream(request.aliases()) - .filter(alias -> systemIndices.isSystemIndex(alias)) + .filter(systemIndices::isSystemIndex) + .filter(systemIndexAccessAllowPredicate) .collect(Collectors.toList()); if (systemAliases.isEmpty() == false) { deprecationLogger.deprecate(DeprecationCategory.API, "open_system_alias_access", diff --git a/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java b/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java index 976f26569d5b6..d3541369261a7 100644 --- a/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java +++ b/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java @@ -61,6 +61,7 @@ import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.gateway.GatewayAllocator; +import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.ingest.IngestMetadata; import org.elasticsearch.persistent.PersistentTasksCustomMetadata; import org.elasticsearch.persistent.PersistentTasksNodeService; @@ -103,13 +104,14 @@ public class ClusterModule extends AbstractModule { final ShardsAllocator shardsAllocator; public ClusterModule(Settings settings, ClusterService clusterService, List clusterPlugins, - ClusterInfoService clusterInfoService, SnapshotsInfoService snapshotsInfoService, ThreadContext threadContext) { + ClusterInfoService clusterInfoService, SnapshotsInfoService snapshotsInfoService, ThreadContext threadContext, + SystemIndices systemIndices) { this.clusterPlugins = clusterPlugins; this.deciderList = createAllocationDeciders(settings, clusterService.getClusterSettings(), clusterPlugins); this.allocationDeciders = new AllocationDeciders(deciderList); this.shardsAllocator = createShardsAllocator(settings, clusterService.getClusterSettings(), clusterPlugins); this.clusterService = clusterService; - this.indexNameExpressionResolver = new IndexNameExpressionResolver(threadContext); + this.indexNameExpressionResolver = new IndexNameExpressionResolver(threadContext, systemIndices); this.allocationService = new AllocationService(allocationDeciders, shardsAllocator, clusterInfoService, snapshotsInfoService); this.metadataDeleteIndexService = new MetadataDeleteIndexService(settings, clusterService, allocationService); } diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index 9af85c35382de..69e15b35609c2 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -30,6 +30,7 @@ import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.indices.IndexClosedException; import org.elasticsearch.indices.InvalidIndexNameException; +import org.elasticsearch.indices.SystemIndices; import java.time.Instant; import java.time.ZoneId; @@ -57,6 +58,7 @@ public class IndexNameExpressionResolver { public static final String EXCLUDED_DATA_STREAMS_KEY = "es.excluded_ds"; public static final String SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY = "_system_index_access_allowed"; + public static final String EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY = "_external_system_index_access_origin"; public static final Version SYSTEM_INDEX_ENFORCEMENT_VERSION = Version.V_7_10_0; private final DateMathExpressionResolver dateMathExpressionResolver = new DateMathExpressionResolver(); @@ -65,9 +67,11 @@ public class IndexNameExpressionResolver { org.elasticsearch.common.collect.List.of(dateMathExpressionResolver, wildcardExpressionResolver); private final ThreadContext threadContext; + private final SystemIndices systemIndices; - public IndexNameExpressionResolver(ThreadContext threadContext) { + public IndexNameExpressionResolver(ThreadContext threadContext, SystemIndices systemIndices) { this.threadContext = Objects.requireNonNull(threadContext, "Thread Context must not be null"); + this.systemIndices = Objects.requireNonNull(systemIndices, "System Indices must not be null"); } /** @@ -76,7 +80,7 @@ public IndexNameExpressionResolver(ThreadContext threadContext) { */ public String[] concreteIndexNames(ClusterState state, IndicesRequest request) { Context context = new Context(state, request.indicesOptions(), false, false, request.includeDataStreams(), - isSystemIndexAccessAllowed()); + getSystemIndexAccessLevel()); return concreteIndexNames(context, request.indices()); } @@ -84,7 +88,8 @@ public String[] concreteIndexNames(ClusterState state, IndicesRequest request) { * Same as {@link #concreteIndexNames(ClusterState, IndicesRequest)}, but access to system indices is always allowed. */ public String[] concreteIndexNamesWithSystemIndexAccess(ClusterState state, IndicesRequest request) { - Context context = new Context(state, request.indicesOptions(), false, false, request.includeDataStreams(), true); + Context context = new Context(state, request.indicesOptions(), false, false, request.includeDataStreams(), + SystemIndexAccessLevel.ALL); return concreteIndexNames(context, request.indices()); } @@ -94,7 +99,7 @@ public String[] concreteIndexNamesWithSystemIndexAccess(ClusterState state, Indi */ public Index[] concreteIndices(ClusterState state, IndicesRequest request) { Context context = new Context(state, request.indicesOptions(), false, false, request.includeDataStreams(), - isSystemIndexAccessAllowed()); + getSystemIndexAccessLevel()); return concreteIndices(context, request.indices()); } @@ -112,28 +117,28 @@ public Index[] concreteIndices(ClusterState state, IndicesRequest request) { * indices options in the context don't allow such a case. */ public String[] concreteIndexNames(ClusterState state, IndicesOptions options, String... indexExpressions) { - Context context = new Context(state, options, isSystemIndexAccessAllowed()); + Context context = new Context(state, options, getSystemIndexAccessLevel()); return concreteIndexNames(context, indexExpressions); } public String[] concreteIndexNames(ClusterState state, IndicesOptions options, boolean includeDataStreams, String... indexExpressions) { - Context context = new Context(state, options, false, false, includeDataStreams, isSystemIndexAccessAllowed()); + Context context = new Context(state, options, false, false, includeDataStreams, getSystemIndexAccessLevel()); return concreteIndexNames(context, indexExpressions); } public String[] concreteIndexNames(ClusterState state, IndicesOptions options, IndicesRequest request) { - Context context = new Context(state, options, false, false, request.includeDataStreams(), isSystemIndexAccessAllowed()); + Context context = new Context(state, options, false, false, request.includeDataStreams(), getSystemIndexAccessLevel()); return concreteIndexNames(context, request.indices()); } public String[] concreteIndexNamesWithSystemIndexAccess(ClusterState state, IndicesOptions options, String... indexExpressions) { - Context context = new Context(state, options, true); + Context context = new Context(state, options, SystemIndexAccessLevel.ALL); return concreteIndexNames(context, indexExpressions); } public List dataStreamNames(ClusterState state, IndicesOptions options, String... indexExpressions) { // Allow system index access - they'll be filtered out below as there's no such thing (yet) as system data streams - Context context = new Context(state, options, false, false, true, true, true); + Context context = new Context(state, options, false, false, true, true, SystemIndexAccessLevel.ALL); if (indexExpressions == null || indexExpressions.length == 0) { indexExpressions = new String[]{"*"}; } @@ -166,7 +171,7 @@ public Index[] concreteIndices(ClusterState state, IndicesOptions options, Strin public Index[] concreteIndices(ClusterState state, IndicesOptions options, boolean includeDataStreams, String... indexExpressions) { Context context = new Context(state, options, false, false, includeDataStreams, - isSystemIndexAccessAllowed()); + getSystemIndexAccessLevel()); return concreteIndices(context, indexExpressions); } @@ -184,7 +189,7 @@ public Index[] concreteIndices(ClusterState state, IndicesOptions options, boole */ public Index[] concreteIndices(ClusterState state, IndicesRequest request, long startTime) { Context context = new Context(state, request.indicesOptions(), startTime, false, false, request.includeDataStreams(), false, - isSystemIndexAccessAllowed()); + getSystemIndexAccessLevel()); return concreteIndices(context, request.indices()); } @@ -307,14 +312,26 @@ Index[] concreteIndices(Context context, String... indexExpressions) { throw infe; } checkSystemIndexAccess(context, metadata, concreteIndices, indexExpressions); - return concreteIndices.toArray(new Index[concreteIndices.size()]); + return concreteIndices.toArray(Index.EMPTY_ARRAY); } private void checkSystemIndexAccess(Context context, Metadata metadata, Set concreteIndices, String[] originalPatterns) { - if (context.isSystemIndexAccessAllowed() == false) { + final SystemIndexAccessLevel systemIndexAccessLevel = context.getSystemIndexAccessLevel(); + if (systemIndexAccessLevel != SystemIndexAccessLevel.ALL) { + final Predicate systemIndexAccessLevelPredicate; + if (systemIndexAccessLevel == SystemIndexAccessLevel.NONE) { + // everything should be included in the deprecation message + systemIndexAccessLevelPredicate = indexMetadata -> true; + } else { + // everything other than allowed should be included in the deprecation message + systemIndexAccessLevelPredicate = systemIndices + .getProductSystemIndexMetadataPredicate(threadContext.getHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY)) + .negate(); + } final List resolvedSystemIndices = concreteIndices.stream() .map(metadata::index) .filter(IndexMetadata::isSystem) + .filter(systemIndexAccessLevelPredicate) .map(i -> i.getIndex().getName()) .sorted() // reliable order for testing .collect(Collectors.toList()); @@ -410,7 +427,7 @@ public Index concreteWriteIndex(ClusterState state, IndicesOptions options, Stri options.allowAliasesToMultipleIndices(), options.forbidClosedIndices(), options.ignoreAliases(), options.ignoreThrottled()); - Context context = new Context(state, combinedOptions, false, true, includeDataStreams, isSystemIndexAccessAllowed()); + Context context = new Context(state, combinedOptions, false, true, includeDataStreams, getSystemIndexAccessLevel()); Index[] indices = concreteIndices(context, index); if (allowNoIndices && indices.length == 0) { return null; @@ -427,7 +444,7 @@ public Index concreteWriteIndex(ClusterState state, IndicesOptions options, Stri * If the data stream, index or alias contains date math then that is resolved too. */ public boolean hasIndexAbstraction(String indexAbstraction, ClusterState state) { - Context context = new Context(state, IndicesOptions.lenientExpandOpen(), false, false, true, isSystemIndexAccessAllowed()); + Context context = new Context(state, IndicesOptions.lenientExpandOpen(), false, false, true, getSystemIndexAccessLevel()); String resolvedAliasOrIndex = dateMathExpressionResolver.resolveExpression(indexAbstraction, context); return state.metadata().getIndicesLookup().containsKey(resolvedAliasOrIndex); } @@ -438,14 +455,14 @@ public boolean hasIndexAbstraction(String indexAbstraction, ClusterState state) public String resolveDateMathExpression(String dateExpression) { // The data math expression resolver doesn't rely on cluster state or indices options, because // it just resolves the date math to an actual date. - return dateMathExpressionResolver.resolveExpression(dateExpression, new Context(null, null, isSystemIndexAccessAllowed())); + return dateMathExpressionResolver.resolveExpression(dateExpression, new Context(null, null, getSystemIndexAccessLevel())); } /** * Resolve an array of expressions to the set of indices and aliases that these expressions match. */ public Set resolveExpressions(ClusterState state, String... expressions) { - Context context = new Context(state, IndicesOptions.lenientExpandOpen(), true, false, true, isSystemIndexAccessAllowed()); + Context context = new Context(state, IndicesOptions.lenientExpandOpen(), true, false, true, getSystemIndexAccessLevel()); List resolvedExpressions = Arrays.asList(expressions); for (ExpressionResolver expressionResolver : expressionResolvers) { resolvedExpressions = expressionResolver.resolve(context, resolvedExpressions); @@ -539,7 +556,7 @@ public String[] indexAliases(ClusterState state, String index, Predicate> resolveSearchRouting(ClusterState state, @Nullable String routing, String... expressions) { List resolvedExpressions = expressions != null ? Arrays.asList(expressions) : Collections.emptyList(); - Context context = new Context(state, IndicesOptions.lenientExpandOpen(), false, false, true, isSystemIndexAccessAllowed()); + Context context = new Context(state, IndicesOptions.lenientExpandOpen(), false, false, true, getSystemIndexAccessLevel()); for (ExpressionResolver expressionResolver : expressionResolvers) { resolvedExpressions = expressionResolver.resolve(context, resolvedExpressions); } @@ -691,12 +708,32 @@ boolean isPatternMatchingAllIndices(Metadata metadata, String[] indicesOrAliases } /** - * Determines whether or not system index access should be allowed in the current context. + * Determines what level of system index access should be allowed in the current context. * - * @return True if system index access should be allowed, false otherwise. + * @return {@link SystemIndexAccessLevel#ALL} if unrestricted system index access should be allowed, + * {@link SystemIndexAccessLevel#RESTRICTED} if a subset of system index access should be allowed, or + * {@link SystemIndexAccessLevel#NONE} if no system index access should be allowed. */ - public boolean isSystemIndexAccessAllowed() { - return Booleans.parseBoolean(threadContext.getHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY), true); + public SystemIndexAccessLevel getSystemIndexAccessLevel() { + final String headerValue = threadContext.getHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY); + final String productHeaderValue = threadContext.getHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY); + + final boolean allowed = Booleans.parseBoolean(headerValue, true); + if (allowed) { + if (productHeaderValue != null) { + return SystemIndexAccessLevel.RESTRICTED; + } else { + return SystemIndexAccessLevel.ALL; + } + } else { + return SystemIndexAccessLevel.NONE; + } + } + + public enum SystemIndexAccessLevel { + ALL, + NONE, + RESTRICTED } public static class Context { @@ -708,30 +745,30 @@ public static class Context { private final boolean resolveToWriteIndex; private final boolean includeDataStreams; private final boolean preserveDataStreams; - private final boolean isSystemIndexAccessAllowed; + private final SystemIndexAccessLevel systemIndexAccessLevel; - Context(ClusterState state, IndicesOptions options, boolean isSystemIndexAccessAllowed) { - this(state, options, System.currentTimeMillis(), isSystemIndexAccessAllowed); + Context(ClusterState state, IndicesOptions options, SystemIndexAccessLevel systemIndexAccessLevel) { + this(state, options, System.currentTimeMillis(), systemIndexAccessLevel); } Context(ClusterState state, IndicesOptions options, boolean preserveAliases, boolean resolveToWriteIndex, - boolean includeDataStreams, boolean isSystemIndexAccessAllowed) { + boolean includeDataStreams, SystemIndexAccessLevel systemIndexAccessLevel) { this(state, options, System.currentTimeMillis(), preserveAliases, resolveToWriteIndex, includeDataStreams, false, - isSystemIndexAccessAllowed); + systemIndexAccessLevel); } Context(ClusterState state, IndicesOptions options, boolean preserveAliases, boolean resolveToWriteIndex, - boolean includeDataStreams, boolean preserveDataStreams, boolean isSystemIndexAccessAllowed) { + boolean includeDataStreams, boolean preserveDataStreams, SystemIndexAccessLevel systemIndexAccessLevel) { this(state, options, System.currentTimeMillis(), preserveAliases, resolveToWriteIndex, includeDataStreams, preserveDataStreams, - isSystemIndexAccessAllowed); + systemIndexAccessLevel); } - Context(ClusterState state, IndicesOptions options, long startTime, boolean isSystemIndexAccessAllowed) { - this(state, options, startTime, false, false, false, false, isSystemIndexAccessAllowed); + Context(ClusterState state, IndicesOptions options, long startTime, SystemIndexAccessLevel systemIndexAccessLevel) { + this(state, options, startTime, false, false, false, false, systemIndexAccessLevel); } protected Context(ClusterState state, IndicesOptions options, long startTime, boolean preserveAliases, boolean resolveToWriteIndex, - boolean includeDataStreams, boolean preserveDataStreams, boolean isSystemIndexAccessAllowed) { + boolean includeDataStreams, boolean preserveDataStreams, SystemIndexAccessLevel systemIndexAccessLevel) { this.state = state; this.options = options; this.startTime = startTime; @@ -739,7 +776,7 @@ protected Context(ClusterState state, IndicesOptions options, long startTime, bo this.resolveToWriteIndex = resolveToWriteIndex; this.includeDataStreams = includeDataStreams; this.preserveDataStreams = preserveDataStreams; - this.isSystemIndexAccessAllowed = isSystemIndexAccessAllowed; + this.systemIndexAccessLevel = systemIndexAccessLevel; } public ClusterState getState() { @@ -780,10 +817,10 @@ public boolean isPreserveDataStreams() { } /** - * Used to determine if it is allowed to access system indices in this context (e.g. for this request). + * Used to determine system index access is allowed in this context (e.g. for this request). */ - public boolean isSystemIndexAccessAllowed() { - return isSystemIndexAccessAllowed; + public SystemIndexAccessLevel getSystemIndexAccessLevel() { + return systemIndexAccessLevel; } } diff --git a/server/src/main/java/org/elasticsearch/indices/SystemIndexDescriptor.java b/server/src/main/java/org/elasticsearch/indices/SystemIndexDescriptor.java index c99ebe0fb8308..72ee381ec1317 100644 --- a/server/src/main/java/org/elasticsearch/indices/SystemIndexDescriptor.java +++ b/server/src/main/java/org/elasticsearch/indices/SystemIndexDescriptor.java @@ -29,6 +29,8 @@ import java.util.Map; import java.util.Objects; +import static java.util.Collections.emptyList; + /** * A system index descriptor describes one or more system indices. It can match a number of indices using * a pattern. For system indices that are managed externally to Elasticsearch, this is enough. For system @@ -81,6 +83,12 @@ public class SystemIndexDescriptor { /** Whether there are dynamic fields in this descriptor's mappings */ private final boolean hasDynamicMappings; + /** The {@link Type} of system index this descriptor represents */ + private final Type type; + + /** A list of allowed product origins that may access an external system index */ + private final List allowedElasticProductOrigins; + /** * Creates a descriptor for system indices matching the supplied pattern. These indices will not be managed * by Elasticsearch internally. @@ -88,7 +96,22 @@ public class SystemIndexDescriptor { * @param description The name of the plugin responsible for this system index. */ public SystemIndexDescriptor(String indexPattern, String description) { - this(indexPattern, null, description, null, null, null, 0, null, null, MapperService.SINGLE_MAPPING_NAME, null); + this(indexPattern, null, description, null, null, null, 0, null, null, MapperService.SINGLE_MAPPING_NAME, null, Type.INTERNAL, + emptyList()); + } + + /** + * Creates a descriptor for system indices matching the supplied pattern. These indices will not be managed + * by Elasticsearch internally. + * @param indexPattern The pattern of index names that this descriptor will be used for. Must start with a '.' character. + * @param description The name of the plugin responsible for this system index. + * @param type The {@link Type} of system index + * @param allowedElasticProductOrigins A list of allowed origin values that should be allowed access in the case of external system + * indices + */ + public SystemIndexDescriptor(String indexPattern, String description, Type type, List allowedElasticProductOrigins) { + this(indexPattern, null, description, null, null, null, 0, null, null, MapperService.SINGLE_MAPPING_NAME, null, type, + allowedElasticProductOrigins); } /** @@ -107,6 +130,9 @@ public SystemIndexDescriptor(String indexPattern, String description) { * @param origin the client origin to use when creating this index. * @param indexType the index type. Should be {@link MapperService#SINGLE_MAPPING_NAME} for any new system indices. * @param minimumNodeVersion the minimum cluster node version required for this descriptor, or null if there is no restriction + * @param type The {@link Type} of system index + * @param allowedElasticProductOrigins A list of allowed origin values that should be allowed access in the case of external system + * indices */ SystemIndexDescriptor( String indexPattern, @@ -119,7 +145,9 @@ public SystemIndexDescriptor(String indexPattern, String description) { String versionMetaKey, String origin, String indexType, - Version minimumNodeVersion + Version minimumNodeVersion, + Type type, + List allowedElasticProductOrigins ) { Objects.requireNonNull(indexPattern, "system index pattern must not be null"); if (indexPattern.length() < 2) { @@ -166,6 +194,13 @@ public SystemIndexDescriptor(String indexPattern, String description) { Strings.requireNonEmpty(versionMetaKey, "Must supply versionMetaKey if mappings or settings are defined"); Strings.requireNonEmpty(origin, "Must supply origin if mappings or settings are defined"); } + Objects.requireNonNull(type, "type must not be null"); + Objects.requireNonNull(allowedElasticProductOrigins, "allowedProductOrigins must not be null"); + if (type.isInternal() && allowedElasticProductOrigins.isEmpty() == false) { + throw new IllegalArgumentException("Allowed origins are not valid for internal system indices"); + } else if (type.isExternal() && allowedElasticProductOrigins.isEmpty()) { + throw new IllegalArgumentException("External system indices without allowed products is not a valid combination"); + } this.indexPattern = indexPattern; this.primaryIndex = primaryIndex; @@ -182,7 +217,8 @@ public SystemIndexDescriptor(String indexPattern, String description) { this.origin = origin; this.indexType = indexType; this.minimumNodeVersion = minimumNodeVersion; - + this.type = type; + this.allowedElasticProductOrigins = allowedElasticProductOrigins; this.hasDynamicMappings = this.mappings != null && findDynamicMapping(XContentHelper.convertToMap(JsonXContent.jsonXContent, mappings, false)); } @@ -265,7 +301,8 @@ public String getVersionMetaKey() { } public boolean isAutomaticallyManaged() { - return this.mappings != null || this.settings != null; + // TODO remove mappings/settings check after all internal indices have been migrated + return type.isManaged() && (this.mappings != null || this.settings != null); } public String getOrigin() { @@ -280,6 +317,18 @@ public boolean hasDynamicMappings() { return this.hasDynamicMappings; } + public boolean isExternal() { + return type.isExternal(); + } + + public boolean isInternal() { + return type.isInternal(); + } + + public List getAllowedElasticProductOrigins() { + return allowedElasticProductOrigins; + } + /** * Checks that this descriptor can be used within this cluster e.g. the cluster supports all required * features, by comparing the supplied minimum node version to this descriptor's minimum version. @@ -303,13 +352,48 @@ public String checkMinimumNodeVersion(String cause, Version actualMinimumNodeVer return null; } - // TODO: getThreadpool() - // TODO: Upgrade handling (reindex script?) - public static Builder builder() { return new Builder(); } + /** + * The specific type of system index that this descriptor represents. System indices have three defined types, which is used to + * control behavior. Elasticsearch itself and plugins have system indices that are necessary for their features; + * these system indices are referred to as internal system indices. Internal system indices are always managed indices that + * Elasticsearch manages. + * + * System indices can also belong to features outside of Elasticsearch that may be part of other Elastic stack components. These are + * external system indices as the intent is for these to be accessed via normal APIs with a special value. Within external system + * indices, there are two sub-types. The first are those that are managed by Elasticsearch and will have mappings/settings changed as + * the cluster itself is upgraded. The second are those managed by the external application and for those Elasticsearch will not + * perform any updates. + */ + public enum Type { + INTERNAL(false, true), + EXTERNAL_MANAGED(true, true), + EXTERNAL_UNMANAGED(true, false); + + private final boolean external; + private final boolean managed; + + Type(boolean external, boolean managed) { + this.external = external; + this.managed = managed; + } + + public boolean isExternal() { + return external; + } + + public boolean isManaged() { + return managed; + } + + public boolean isInternal() { + return external == false; + } + } + /** * Provides a fluent API for building a {@link SystemIndexDescriptor}. Validation still happens in that class. */ @@ -325,6 +409,8 @@ public static class Builder { private String origin = null; private String indexType = MapperService.SINGLE_MAPPING_NAME; private Version minimumNodeVersion = null; + private Type type = Type.INTERNAL; + private List allowedElasticProductOrigins = emptyList(); private Builder() {} @@ -393,6 +479,16 @@ public Builder setMinimumNodeVersion(Version version) { return this; } + public Builder setType(Type type) { + this.type = type; + return this; + } + + public Builder setAllowedElasticProductOrigins(List allowedElasticProductOrigins) { + this.allowedElasticProductOrigins = allowedElasticProductOrigins; + return this; + } + /** * Builds a {@link SystemIndexDescriptor} using the fields supplied to this builder. * @return a populated descriptor. @@ -410,7 +506,9 @@ public SystemIndexDescriptor build() { versionMetaKey, origin, indexType, - minimumNodeVersion + minimumNodeVersion, + type, + allowedElasticProductOrigins ); } } diff --git a/server/src/main/java/org/elasticsearch/indices/SystemIndices.java b/server/src/main/java/org/elasticsearch/indices/SystemIndices.java index 0fbbd07a83e20..8b848c7e2057e 100644 --- a/server/src/main/java/org/elasticsearch/indices/SystemIndices.java +++ b/server/src/main/java/org/elasticsearch/indices/SystemIndices.java @@ -13,6 +13,7 @@ import org.apache.lucene.util.automaton.CharacterRunAutomaton; import org.apache.lucene.util.automaton.MinimizationOperations; import org.apache.lucene.util.automaton.Operations; +import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.index.Index; @@ -24,7 +25,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; +import java.util.function.Predicate; import java.util.stream.Collectors; import static java.util.Collections.singletonList; @@ -45,12 +48,14 @@ TASKS_FEATURE_NAME, new Feature("Manages task results", singletonList(TASKS_DESC private final CharacterRunAutomaton runAutomaton; private final Map featureDescriptors; + private final Map productToSystemIndicesMatcher; public SystemIndices(Map pluginAndModulesDescriptors) { featureDescriptors = buildSystemIndexDescriptorMap(pluginAndModulesDescriptors); checkForOverlappingPatterns(featureDescriptors); checkForDuplicateAliases(this.getSystemIndexDescriptors()); this.runAutomaton = buildCharacterRunAutomaton(featureDescriptors); + this.productToSystemIndicesMatcher = getProductToSystemIndicesMap(this.getSystemIndexDescriptors()); } private void checkForDuplicateAliases(Collection descriptors) { @@ -75,6 +80,20 @@ private void checkForDuplicateAliases(Collection descript } } + private static Map getProductToSystemIndicesMap(Collection descriptors) { + Map map = descriptors.stream() + .filter(SystemIndexDescriptor::isExternal) + .flatMap(descriptor -> descriptor.getAllowedElasticProductOrigins().stream().map(product -> new Tuple<>(product, descriptor))) + .collect(Collectors.toMap(Tuple::v1, tuple -> { + SystemIndexDescriptor descriptor = tuple.v2(); + return SystemIndexDescriptor.buildAutomaton(descriptor.getIndexPattern(), descriptor.getAliasName()); + }, Operations::union)); + + return Collections.unmodifiableMap(map.entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, entry -> + new CharacterRunAutomaton(MinimizationOperations.minimize(entry.getValue(), Integer.MAX_VALUE))))); + } + /** * Determines whether a given index is a system index by comparing its name to the collection of loaded {@link SystemIndexDescriptor}s * @param index the {@link Index} object to check against loaded {@link SystemIndexDescriptor}s @@ -124,6 +143,32 @@ public boolean isSystemIndex(String indexName) { } } + /** + * Builds a predicate that tests if a system index should be accessible based on the provided product name + * @param product the name of the product that is attempting to access an external system index + * @return Predicate to check external system index metadata with + */ + public Predicate getProductSystemIndexMetadataPredicate(String product) { + final CharacterRunAutomaton automaton = productToSystemIndicesMatcher.get(product); + if (automaton == null) { + return indexMetadata -> false; + } + return indexMetadata -> automaton.run(indexMetadata.getIndex().getName()); + } + + /** + * Builds a predicate that tests if a system index name should be accessible based on the provided product name + * @param product the name of the product that is attempting to access an external system index + * @return Predicate to check external system index names with + */ + public Predicate getProductSystemIndexNamePredicate(String product) { + final CharacterRunAutomaton automaton = productToSystemIndicesMatcher.get(product); + if (automaton == null) { + return name -> false; + } + return automaton::run; + } + public Map getFeatures() { return featureDescriptors; } diff --git a/server/src/main/java/org/elasticsearch/node/Node.java b/server/src/main/java/org/elasticsearch/node/Node.java index 925c62c0b8563..e6354cebe80c3 100644 --- a/server/src/main/java/org/elasticsearch/node/Node.java +++ b/server/src/main/java/org/elasticsearch/node/Node.java @@ -415,6 +415,21 @@ protected Node(final Environment initialEnvironment, final ClusterInfoService clusterInfoService = newClusterInfoService(settings, clusterService, threadPool, client); final UsageService usageService = new UsageService(); + final Map featuresMap = Collections.unmodifiableMap(pluginsService + .filterPlugins(SystemIndexPlugin.class) + .stream() + .peek(plugin -> SystemIndices.validateFeatureName(plugin.getFeatureName(), plugin.getClass().getCanonicalName())) + .collect(Collectors.toMap( + plugin -> plugin.getFeatureName(), + plugin -> new SystemIndices.Feature( + plugin.getFeatureDescription(), + plugin.getSystemIndexDescriptors(settings), + plugin.getAssociatedIndexPatterns() + )) + ) + ); + final SystemIndices systemIndices = new SystemIndices(featuresMap); + ModulesBuilder modules = new ModulesBuilder(); // plugin modules must be added here, before others or we can get crazy injection errors... for (Module pluginModule : pluginsService.createGuiceModules()) { @@ -427,7 +442,7 @@ protected Node(final Environment initialEnvironment, final InternalSnapshotsInfoService snapshotsInfoService = new InternalSnapshotsInfoService(settings, clusterService, repositoriesServiceReference::get, rerouteServiceReference::get); final ClusterModule clusterModule = new ClusterModule(settings, clusterService, clusterPlugins, clusterInfoService, - snapshotsInfoService, threadPool.getThreadContext()); + snapshotsInfoService, threadPool.getThreadContext(), systemIndices); modules.add(clusterModule); IndicesModule indicesModule = new IndicesModule(pluginsService.filterPlugins(MapperPlugin.class)); modules.add(indicesModule); @@ -509,20 +524,6 @@ protected Node(final Environment initialEnvironment, .flatMap(m -> m.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - final Map featuresMap = Collections.unmodifiableMap(pluginsService - .filterPlugins(SystemIndexPlugin.class) - .stream() - .peek(plugin -> SystemIndices.validateFeatureName(plugin.getFeatureName(), plugin.getClass().getCanonicalName())) - .collect(Collectors.toMap( - plugin -> plugin.getFeatureName(), - plugin -> new SystemIndices.Feature( - plugin.getFeatureDescription(), - plugin.getSystemIndexDescriptors(settings), - plugin.getAssociatedIndexPatterns() - )) - )); - final SystemIndices systemIndices = new SystemIndices(featuresMap); - final SystemIndexManager systemIndexManager = new SystemIndexManager(systemIndices, client); clusterService.addListener(systemIndexManager); diff --git a/server/src/main/java/org/elasticsearch/rest/RestController.java b/server/src/main/java/org/elasticsearch/rest/RestController.java index e75d1594f820f..727ca61503004 100644 --- a/server/src/main/java/org/elasticsearch/rest/RestController.java +++ b/server/src/main/java/org/elasticsearch/rest/RestController.java @@ -43,6 +43,7 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; +import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY; import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY; import static org.elasticsearch.rest.BytesRestResponse.TEXT_CONTENT_TYPE; import static org.elasticsearch.rest.RestStatus.BAD_REQUEST; @@ -237,11 +238,21 @@ private void dispatchRequest(RestRequest request, RestChannel channel, RestHandl if (handler.allowsUnsafeBuffers() == false) { request.ensureSafeBuffers(); } - if (handler.allowSystemIndexAccessByDefault() == false && request.header(ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER) == null) { - // The ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER indicates that the request is coming from an Elastic product with a plan - // to move away from direct access to system indices, and thus deprecation warnings should not be emitted. + + final ThreadContext threadContext = client.threadPool().getThreadContext(); + if (handler.allowSystemIndexAccessByDefault() == false) { + // The ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER indicates that the request is coming from an Elastic product and + // therefore we should allow a subset of external system index access. // This header is intended for internal use only. - client.threadPool().getThreadContext().putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.FALSE.toString()); + final String prodOriginValue = request.header(ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER); + if (prodOriginValue != null) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.TRUE.toString()); + threadContext.putHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, prodOriginValue); + } else { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.FALSE.toString()); + } + } else { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.TRUE.toString()); } handler.handleRequest(request, responseChannel, client); diff --git a/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java b/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java index 85209ab0837f8..26237734546f6 100644 --- a/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java +++ b/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java @@ -20,7 +20,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.SettingsFilter; import org.elasticsearch.common.settings.SettingsModule; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.plugins.ActionPlugin; import org.elasticsearch.plugins.ActionPlugin.ActionHandler; import org.elasticsearch.rest.RestChannel; @@ -100,8 +100,8 @@ public void testSetupRestHandlerContainsKnownBuiltin() { SettingsModule settings = new SettingsModule(Settings.EMPTY); UsageService usageService = new UsageService(); ActionModule actionModule = new ActionModule(false, settings.getSettings(), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), settings.getIndexScopedSettings(), - settings.getClusterSettings(), settings.getSettingsFilter(), null, emptyList(), null, + TestIndexNameExpressionResolver.newInstance(), + settings.getIndexScopedSettings(), settings.getClusterSettings(), settings.getSettingsFilter(), null, emptyList(), null, null, usageService, null); actionModule.initRestHandlers(null); // At this point the easiest way to confirm that a handler is loaded is to try to register another one on top of it and to fail @@ -140,9 +140,9 @@ public String getName() { try { UsageService usageService = new UsageService(); ActionModule actionModule = new ActionModule(false, settings.getSettings(), - new IndexNameExpressionResolver(threadPool.getThreadContext()), settings.getIndexScopedSettings(), - settings.getClusterSettings(), settings.getSettingsFilter(), threadPool, singletonList(dupsMainAction), - null, null, usageService, null); + TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext()), + settings.getIndexScopedSettings(), settings.getClusterSettings(), settings.getSettingsFilter(), threadPool, + singletonList(dupsMainAction), null, null, usageService, null); Exception e = expectThrows(IllegalArgumentException.class, () -> actionModule.initRestHandlers(null)); assertThat(e.getMessage(), startsWith("Cannot replace existing handler for [/] for method: GET")); } finally { @@ -175,9 +175,9 @@ public List getRestHandlers(Settings settings, RestController restC try { UsageService usageService = new UsageService(); ActionModule actionModule = new ActionModule(false, settings.getSettings(), - new IndexNameExpressionResolver(threadPool.getThreadContext()), settings.getIndexScopedSettings(), - settings.getClusterSettings(), settings.getSettingsFilter(), threadPool, singletonList(registersFakeHandler), - null, null, usageService, null); + TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext()), + settings.getIndexScopedSettings(), settings.getClusterSettings(), settings.getSettingsFilter(), threadPool, + singletonList(registersFakeHandler), null, null, usageService, null); actionModule.initRestHandlers(null); // At this point the easiest way to confirm that a handler is loaded is to try to register another one on top of it and to fail Exception e = expectThrows(IllegalArgumentException.class, () -> diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportAddVotingConfigExclusionsActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportAddVotingConfigExclusionsActionTests.java index ea40cc888e35d..cf6859988a645 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportAddVotingConfigExclusionsActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportAddVotingConfigExclusionsActionTests.java @@ -20,7 +20,6 @@ import org.elasticsearch.cluster.coordination.CoordinationMetadata; import org.elasticsearch.cluster.coordination.CoordinationMetadata.VotingConfigExclusion; import org.elasticsearch.cluster.coordination.CoordinationMetadata.VotingConfiguration; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodeRole; @@ -31,7 +30,7 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.transport.MockTransport; import org.elasticsearch.threadpool.TestThreadPool; @@ -121,7 +120,7 @@ public void setupForTest() { clusterSettings = new ClusterSettings(nodeSettings, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS); new TransportAddVotingConfigExclusionsAction(nodeSettings, clusterSettings, transportService, clusterService, threadPool, - new ActionFilters(emptySet()), new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); // registers action + new ActionFilters(emptySet()), TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext())); // registers action transportService.start(); transportService.acceptIncomingRequests(); diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportClearVotingConfigExclusionsActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportClearVotingConfigExclusionsActionTests.java index 59dd43a4107ff..2a092d5312d5b 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportClearVotingConfigExclusionsActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/configuration/TransportClearVotingConfigExclusionsActionTests.java @@ -16,7 +16,6 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.coordination.CoordinationMetadata; import org.elasticsearch.cluster.coordination.CoordinationMetadata.VotingConfigExclusion; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; @@ -25,7 +24,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.transport.MockTransport; import org.elasticsearch.threadpool.TestThreadPool; @@ -84,7 +83,7 @@ public void setupForTest() { TransportService.NOOP_TRANSPORT_INTERCEPTOR, boundTransportAddress -> localNode, null, emptySet()); new TransportClearVotingConfigExclusionsAction(transportService, clusterService, threadPool, new ActionFilters(emptySet()), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); // registers action + TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext())); // registers action transportService.start(); transportService.acceptIncomingRequests(); diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesActionTests.java index e85cafdca2fa0..83d847275d55e 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesActionTests.java @@ -11,8 +11,10 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.common.collect.ImmutableOpenMap; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.SystemIndexDescriptor; import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.test.ESTestCase; @@ -23,7 +25,6 @@ import static org.hamcrest.Matchers.equalTo; public class TransportGetAliasesActionTests extends ESTestCase { - private final SystemIndices EMPTY_SYSTEM_INDICES = new SystemIndices(Collections.emptyMap()); public void testPostProcess() { GetAliasesRequest request = new GetAliasesRequest(); @@ -31,8 +32,8 @@ public void testPostProcess() { .fPut("b", Collections.singletonList(new AliasMetadata.Builder("y").build())) .build(); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, new String[]{"a", "b", "c"}, aliases, ClusterState.EMPTY_STATE, false, - EMPTY_SYSTEM_INDICES); + TransportGetAliasesAction.postProcess(request, new String[]{"a", "b", "c"}, aliases, ClusterState.EMPTY_STATE, + SystemIndexAccessLevel.NONE, null, EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(3)); assertThat(result.get("a").size(), equalTo(0)); assertThat(result.get("b").size(), equalTo(1)); @@ -43,8 +44,8 @@ public void testPostProcess() { aliases = ImmutableOpenMap.>builder() .fPut("b", Collections.singletonList(new AliasMetadata.Builder("y").build())) .build(); - result = TransportGetAliasesAction.postProcess(request, new String[]{"a", "b", "c"}, aliases, ClusterState.EMPTY_STATE, false, - EMPTY_SYSTEM_INDICES); + result = TransportGetAliasesAction.postProcess(request, new String[]{"a", "b", "c"}, aliases, ClusterState.EMPTY_STATE, + SystemIndexAccessLevel.NONE, null, EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(3)); assertThat(result.get("a").size(), equalTo(0)); assertThat(result.get("b").size(), equalTo(1)); @@ -54,8 +55,8 @@ public void testPostProcess() { aliases = ImmutableOpenMap.>builder() .fPut("b", Collections.singletonList(new AliasMetadata.Builder("y").build())) .build(); - result = TransportGetAliasesAction.postProcess(request, new String[]{"a", "b", "c"}, aliases, ClusterState.EMPTY_STATE, false, - EMPTY_SYSTEM_INDICES); + result = TransportGetAliasesAction.postProcess(request, new String[]{"a", "b", "c"}, aliases, ClusterState.EMPTY_STATE, + SystemIndexAccessLevel.NONE, null, EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(1)); assertThat(result.get("b").size(), equalTo(1)); } @@ -71,7 +72,8 @@ public void testDeprecationWarningEmittedForTotalWildcard() { final String[] concreteIndices = {"a", ".b", "c"}; assertEquals(state.metadata().findAliases(request, concreteIndices), aliases); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, false, EMPTY_SYSTEM_INDICES); + TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, + SystemIndexAccessLevel.NONE, null, EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(3)); assertThat(result.get("a").size(), equalTo(0)); assertThat(result.get(".b").size(), equalTo(1)); @@ -91,7 +93,8 @@ public void testDeprecationWarningEmittedWhenSystemIndexIsRequested() { final String[] concreteIndices = {".b"}; assertEquals(state.metadata().findAliases(request, concreteIndices), aliases); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, false, EMPTY_SYSTEM_INDICES); + TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, + SystemIndexAccessLevel.NONE, null, EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(1)); assertThat(result.get(".b").size(), equalTo(1)); assertWarnings("this request accesses system indices: [.b], but in a future major version, direct access to system " + @@ -108,7 +111,8 @@ public void testDeprecationWarningEmittedWhenSystemIndexIsRequestedByAlias() { final String[] concreteIndices = {"a", ".b", "c"}; assertEquals(state.metadata().findAliases(request, concreteIndices), aliases); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, false, EMPTY_SYSTEM_INDICES); + TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, + SystemIndexAccessLevel.NONE, null, EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(1)); assertThat(result.get(".b").size(), equalTo(1)); assertWarnings("this request accesses system indices: [.b], but in a future major version, direct access to system " + @@ -125,7 +129,8 @@ public void testDeprecationWarningNotEmittedWhenSystemAccessAllowed() { final String[] concreteIndices = {"a", ".b", "c"}; assertEquals(state.metadata().findAliases(request, concreteIndices), aliases); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, true, EMPTY_SYSTEM_INDICES); + TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, + SystemIndexAccessLevel.ALL, "", EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(1)); assertThat(result.get(".b").size(), equalTo(1)); } @@ -144,7 +149,8 @@ public void testDeprecationWarningNotEmittedWhenOnlyNonsystemIndexRequested() { final String[] concreteIndices = {"c"}; assertEquals(state.metadata().findAliases(request, concreteIndices), aliases); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, false, EMPTY_SYSTEM_INDICES); + TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, + SystemIndexAccessLevel.NONE, "", EmptySystemIndices.INSTANCE); assertThat(result.size(), equalTo(1)); assertThat(result.get("c").size(), equalTo(1)); } @@ -162,7 +168,8 @@ public void testDeprecationWarningEmittedWhenRequestingNonExistingAliasInSystemP final String[] concreteIndices = {}; assertEquals(state.metadata().findAliases(request, concreteIndices), aliases); ImmutableOpenMap> result = - TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, false, systemIndices); + TransportGetAliasesAction.postProcess(request, concreteIndices, aliases, state, + SystemIndexAccessLevel.NONE, null, systemIndices); assertThat(result.size(), equalTo(0)); assertWarnings("this request accesses aliases with names reserved for system indices: [.y], but in a future major version, direct" + "access to system indices and their aliases will not be allowed"); diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexActionTests.java index 31cd1145d79e8..a3335c513c457 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexActionTests.java @@ -21,6 +21,7 @@ import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.test.ESSingleNodeTestCase; import org.elasticsearch.test.transport.CapturingTransport; @@ -112,7 +113,7 @@ protected void doMasterOperation(GetIndexRequest request, String[] concreteIndic static class Resolver extends IndexNameExpressionResolver { Resolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequestTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequestTests.java index 475376c3deda9..b153280c63c65 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/mapping/put/PutMappingRequestTests.java @@ -14,19 +14,17 @@ import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexAbstraction; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.collect.Tuple; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.Index; import org.elasticsearch.index.RandomCreateIndexGenerator; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import java.io.IOException; @@ -159,8 +157,7 @@ public void testResolveIndicesWithWriteIndexOnlyAndDataStreamsAndWriteAliases() tuple("alias2", org.elasticsearch.common.collect.List.of(tuple("index2", false), tuple("index3", true))) )); PutMappingRequest request = new PutMappingRequest().indices("foo", "alias1", "alias2").writeIndexOnly(true); - Index[] indices = TransportPutMappingAction.resolveIndices(cs, request, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + Index[] indices = TransportPutMappingAction.resolveIndices(cs, request, TestIndexNameExpressionResolver.newInstance()); List indexNames = Arrays.stream(indices).map(Index::getName).collect(Collectors.toList()); IndexAbstraction expectedDs = cs.metadata().getIndicesLookup().get("foo"); // should resolve the data stream and each alias to their respective write indices @@ -181,8 +178,7 @@ public void testResolveIndicesWithoutWriteIndexOnlyAndDataStreamsAndWriteAliases tuple("alias2", org.elasticsearch.common.collect.List.of(tuple("index2", false), tuple("index3", true))) )); PutMappingRequest request = new PutMappingRequest().indices("foo", "alias1", "alias2"); - Index[] indices = TransportPutMappingAction.resolveIndices(cs, request, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + Index[] indices = TransportPutMappingAction.resolveIndices(cs, request, TestIndexNameExpressionResolver.newInstance()); List indexNames = Arrays.stream(indices).map(Index::getName).collect(Collectors.toList()); IndexAbstraction expectedDs = cs.metadata().getIndicesLookup().get("foo"); List expectedIndices = expectedDs.getIndices().stream().map(im -> im.getIndex().getName()).collect(Collectors.toList()); @@ -205,8 +201,7 @@ public void testResolveIndicesWithWriteIndexOnlyAndDataStreamAndIndex() { tuple("alias2", org.elasticsearch.common.collect.List.of(tuple("index2", false), tuple("index3", true))) )); PutMappingRequest request = new PutMappingRequest().indices("foo", "index3").writeIndexOnly(true); - Index[] indices = TransportPutMappingAction.resolveIndices(cs, request, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + Index[] indices = TransportPutMappingAction.resolveIndices(cs, request, TestIndexNameExpressionResolver.newInstance()); List indexNames = Arrays.stream(indices).map(Index::getName).collect(Collectors.toList()); IndexAbstraction expectedDs = cs.metadata().getIndicesLookup().get("foo"); List expectedIndices = expectedDs.getIndices().stream().map(im -> im.getIndex().getName()).collect(Collectors.toList()); @@ -230,8 +225,7 @@ public void testResolveIndicesWithWriteIndexOnlyAndNoSingleWriteIndex() { )); PutMappingRequest request = new PutMappingRequest().indices("*").writeIndexOnly(true); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, - () -> TransportPutMappingAction.resolveIndices(cs2, request, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)))); + () -> TransportPutMappingAction.resolveIndices(cs2, request, TestIndexNameExpressionResolver.newInstance())); assertThat(e.getMessage(), containsString("The index expression [*] and options provided did not point to a single write-index")); } @@ -250,8 +244,7 @@ public void testResolveIndicesWithWriteIndexOnlyAndAliasWithoutWriteIndex() { )); PutMappingRequest request = new PutMappingRequest().indices("alias2").writeIndexOnly(true); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, - () -> TransportPutMappingAction.resolveIndices(cs2, request, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)))); + () -> TransportPutMappingAction.resolveIndices(cs2, request, TestIndexNameExpressionResolver.newInstance())); assertThat(e.getMessage(), containsString("no write index is defined for alias [alias2]")); } diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java index 48f3340150383..8430a7aaf9434 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java @@ -19,12 +19,11 @@ import org.elasticsearch.cluster.metadata.DataStream; import org.elasticsearch.cluster.metadata.IndexAbstractionResolver; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.time.DateFormatter; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.junit.Before; @@ -68,8 +67,7 @@ public class ResolveIndexTests extends ESTestCase { }; private Metadata metadata; - private IndexAbstractionResolver resolver = new IndexAbstractionResolver( - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + private final IndexAbstractionResolver resolver = new IndexAbstractionResolver(TestIndexNameExpressionResolver.newInstance()); private long epochMillis; private String dateString; diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java index 55fe09353ca56..cbda3f79ac79e 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java @@ -39,7 +39,6 @@ import org.elasticsearch.common.settings.IndexScopedSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.env.Environment; import org.elasticsearch.index.Index; @@ -54,10 +53,11 @@ import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.RoutingFieldMapper; import org.elasticsearch.index.shard.IndexEventListener; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.indices.InvalidIndexNameException; import org.elasticsearch.indices.ShardLimitValidator; -import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ClusterServiceUtils; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.TestThreadPool; @@ -71,7 +71,6 @@ import java.util.Locale; import java.util.Map; -import static java.util.Collections.emptyMap; import static org.elasticsearch.cluster.DataStreamTestHelper.generateMapping; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -285,7 +284,7 @@ public void testDataStreamValidation() throws IOException { public void testGenerateRolloverIndexName() { String invalidIndexName = randomAlphaOfLength(10) + "A"; - IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + IndexNameExpressionResolver indexNameExpressionResolver = TestIndexNameExpressionResolver.newInstance(); expectThrows(IllegalArgumentException.class, () -> MetadataRolloverService.generateRolloverIndexName(invalidIndexName, indexNameExpressionResolver)); int num = randomIntBetween(0, 100); @@ -480,7 +479,7 @@ public void testRolloverClusterState() throws Exception { ShardLimitValidator shardLimitValidator = new ShardLimitValidator(Settings.EMPTY, clusterService); MetadataCreateIndexService createIndexService = new MetadataCreateIndexService(Settings.EMPTY, clusterService, indicesService, allocationService, null, shardLimitValidator, env, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, new SystemIndices(emptyMap()), false); + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, EmptySystemIndices.INSTANCE, false); MetadataIndexAliasesService indexAliasesService = new MetadataIndexAliasesService(clusterService, indicesService, new AliasValidator(), null, xContentRegistry()); MetadataRolloverService rolloverService = new MetadataRolloverService(testThreadPool, createIndexService, indexAliasesService, @@ -581,7 +580,7 @@ protected String contentType() { ShardLimitValidator shardLimitValidator = new ShardLimitValidator(Settings.EMPTY, clusterService); MetadataCreateIndexService createIndexService = new MetadataCreateIndexService(Settings.EMPTY, clusterService, indicesService, allocationService, null, shardLimitValidator, env, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, new SystemIndices(emptyMap()), false); + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, EmptySystemIndices.INSTANCE, false); MetadataIndexAliasesService indexAliasesService = new MetadataIndexAliasesService(clusterService, indicesService, new AliasValidator(), null, xContentRegistry()); MetadataRolloverService rolloverService = new MetadataRolloverService(testThreadPool, createIndexService, indexAliasesService, @@ -686,8 +685,7 @@ protected String contentType() { ShardLimitValidator shardLimitValidator = new ShardLimitValidator(Settings.EMPTY, clusterService); MetadataCreateIndexService createIndexService = new MetadataCreateIndexService(Settings.EMPTY, clusterService, indicesService, allocationService, new AliasValidator(), shardLimitValidator, env, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, - new SystemIndices(org.elasticsearch.common.collect.Map.of()), false); + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, testThreadPool, null, EmptySystemIndices.INSTANCE, false); MetadataIndexAliasesService indexAliasesService = new MetadataIndexAliasesService(clusterService, indicesService, new AliasValidator(), null, xContentRegistry()); MetadataRolloverService rolloverService = new MetadataRolloverService(testThreadPool, createIndexService, indexAliasesService, @@ -800,7 +798,7 @@ public void testRolloverClusterStateForDataStreamNoTemplate() throws Exception { MetadataCreateIndexService createIndexService = new MetadataCreateIndexService(Settings.EMPTY, clusterService, indicesService, allocationService, null, null, env, - null, testThreadPool, null, new SystemIndices(emptyMap()), false); + null, testThreadPool, null, EmptySystemIndices.INSTANCE, false); MetadataIndexAliasesService indexAliasesService = new MetadataIndexAliasesService(clusterService, indicesService, new AliasValidator(), null, xContentRegistry()); MetadataRolloverService rolloverService = new MetadataRolloverService(testThreadPool, createIndexService, indexAliasesService, diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsActionTests.java index bb393936ecbb6..43adcc5476b6c 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsActionTests.java @@ -21,6 +21,7 @@ import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.transport.CapturingTransport; import org.elasticsearch.threadpool.TestThreadPool; @@ -120,7 +121,7 @@ public void testIncludeDefaultsWithFiltering() { static class Resolver extends IndexNameExpressionResolver { Resolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIndicesThatCannotBeCreatedTests.java b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIndicesThatCannotBeCreatedTests.java index 502f9bed8fc6b..95814f56bb1ac 100644 --- a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIndicesThatCannotBeCreatedTests.java +++ b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIndicesThatCannotBeCreatedTests.java @@ -29,14 +29,13 @@ import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.index.VersionType; -import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.tasks.Task; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.VersionUtils; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; -import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -114,16 +113,17 @@ private void indicesThatCannotBeCreatedTestCase(Set expected, final ExecutorService direct = EsExecutors.newDirectExecutorService(); when(threadPool.executor(anyString())).thenReturn(direct); - final IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) { - @Override - public boolean hasIndexAbstraction(String indexAbstraction, ClusterState state) { - return shouldAutoCreate.apply(indexAbstraction) == false; - } + final IndexNameExpressionResolver indexNameExpressionResolver = + new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE) { + @Override + public boolean hasIndexAbstraction(String indexAbstraction, ClusterState state) { + return shouldAutoCreate.apply(indexAbstraction) == false; + } }; TransportBulkAction action = new TransportBulkAction(threadPool, mock(TransportService.class), clusterService, null, null, null, mock(ActionFilters.class), indexNameExpressionResolver, - new IndexingPressure(Settings.EMPTY), new SystemIndices(Collections.emptyMap())) { + new IndexingPressure(Settings.EMPTY), EmptySystemIndices.INSTANCE) { @Override void executeBulk(Task task, BulkRequest bulkRequest, long startTimeNanos, ActionListener listener, AtomicArray responses, Map indicesThatCannotBeCreated) { diff --git a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIngestTests.java b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIngestTests.java index 1a28058febc27..dca1ea72d38bd 100644 --- a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIngestTests.java +++ b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionIngestTests.java @@ -25,7 +25,6 @@ import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.IndexTemplateMetadata; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.metadata.Template; @@ -39,11 +38,11 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.AtomicArray; import org.elasticsearch.common.util.concurrent.EsExecutors; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexingPressure; -import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.EmptySystemIndices; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.ingest.IngestService; import org.elasticsearch.tasks.Task; import org.elasticsearch.test.ESTestCase; @@ -133,8 +132,10 @@ class TestTransportBulkAction extends TransportBulkAction { TestTransportBulkAction() { super(threadPool, transportService, clusterService, ingestService, - null, null, new ActionFilters(Collections.emptySet()), new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - new IndexingPressure(SETTINGS), new SystemIndices(emptyMap()) + null, null, new ActionFilters(Collections.emptySet()), + TestIndexNameExpressionResolver.newInstance(), + new IndexingPressure(SETTINGS), + EmptySystemIndices.INSTANCE ); } diff --git a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTests.java b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTests.java index 6995b2a971bff..800795641d966 100644 --- a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTests.java @@ -36,6 +36,7 @@ import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.index.VersionType; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.SystemIndexDescriptor; import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.test.ESTestCase; @@ -78,7 +79,7 @@ class TestTransportBulkAction extends TransportBulkAction { TestTransportBulkAction() { super(TransportBulkActionTests.this.threadPool, transportService, clusterService, null, null, null, new ActionFilters(Collections.emptySet()), new Resolver(), - new IndexingPressure(Settings.EMPTY), new SystemIndices(emptyMap())); + new IndexingPressure(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTookTests.java b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTookTests.java index c7c9304828991..fc3d0e07ecf69 100644 --- a/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTookTests.java +++ b/server/src/test/java/org/elasticsearch/action/bulk/TransportBulkActionTookTests.java @@ -32,7 +32,7 @@ import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.rest.action.document.RestBulkAction; import org.elasticsearch.index.IndexingPressure; -import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.tasks.Task; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.VersionUtils; @@ -203,7 +203,7 @@ public void onFailure(Exception e) { static class Resolver extends IndexNameExpressionResolver { Resolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override @@ -233,7 +233,7 @@ static class TestTransportBulkAction extends TransportBulkAction { actionFilters, indexNameExpressionResolver, new IndexingPressure(Settings.EMPTY), - new SystemIndices(emptyMap()), + EmptySystemIndices.INSTANCE, relativeTimeProvider); } } diff --git a/server/src/test/java/org/elasticsearch/action/get/TransportMultiGetActionTests.java b/server/src/test/java/org/elasticsearch/action/get/TransportMultiGetActionTests.java index 52ca89936d529..9a8cd997d91c8 100644 --- a/server/src/test/java/org/elasticsearch/action/get/TransportMultiGetActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/get/TransportMultiGetActionTests.java @@ -32,6 +32,7 @@ import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.tasks.Task; import org.elasticsearch.tasks.TaskId; @@ -213,7 +214,7 @@ private static Task createTask() { static class Resolver extends IndexNameExpressionResolver { Resolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/resync/TransportResyncReplicationActionTests.java b/server/src/test/java/org/elasticsearch/action/resync/TransportResyncReplicationActionTests.java index 657628f468f8b..0d4d4714a430c 100644 --- a/server/src/test/java/org/elasticsearch/action/resync/TransportResyncReplicationActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/resync/TransportResyncReplicationActionTests.java @@ -9,8 +9,6 @@ import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.index.IndexSettings; -import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.PlainActionFuture; import org.elasticsearch.cluster.ClusterState; @@ -29,12 +27,14 @@ import org.elasticsearch.common.util.PageCacheRecycler; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexService; +import org.elasticsearch.index.IndexSettings; +import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.index.shard.ReplicationGroup; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.translog.Translog; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; import org.elasticsearch.tasks.Task; import org.elasticsearch.test.ESTestCase; @@ -52,7 +52,6 @@ import java.util.concurrent.atomic.AtomicInteger; import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; import static org.elasticsearch.action.support.replication.ClusterStateCreationUtils.state; import static org.elasticsearch.test.ClusterServiceUtils.createClusterService; import static org.elasticsearch.test.ClusterServiceUtils.setState; @@ -138,7 +137,7 @@ public void testResyncDoesNotBlockOnPrimaryAction() throws Exception { final TransportResyncReplicationAction action = new TransportResyncReplicationAction(Settings.EMPTY, transportService, clusterService, indexServices, threadPool, shardStateAction, new ActionFilters(new HashSet<>()), - new IndexingPressure(Settings.EMPTY), new SystemIndices(emptyMap())); + new IndexingPressure(Settings.EMPTY), EmptySystemIndices.INSTANCE); assertThat(action.globalBlockLevel(), nullValue()); assertThat(action.indexBlockLevel(), nullValue()); diff --git a/server/src/test/java/org/elasticsearch/action/search/MultiSearchActionTookTests.java b/server/src/test/java/org/elasticsearch/action/search/MultiSearchActionTookTests.java index 7d1a6f584c6d6..85205686b8db7 100644 --- a/server/src/test/java/org/elasticsearch/action/search/MultiSearchActionTookTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/MultiSearchActionTookTests.java @@ -9,19 +9,16 @@ package org.elasticsearch.action.search; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.IndicesRequest; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.Randomness; import org.elasticsearch.common.UUIDs; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.AtomicArray; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.search.internal.InternalSearchResponse; import org.elasticsearch.tasks.Task; import org.elasticsearch.tasks.TaskManager; @@ -179,15 +176,4 @@ void executeSearch(final Queue requests, final AtomicArray getResults() { } } - class MyResolver extends IndexNameExpressionResolver { + static class MyResolver extends IndexNameExpressionResolver { MyResolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/support/master/TransportMasterNodeActionTests.java b/server/src/test/java/org/elasticsearch/action/support/master/TransportMasterNodeActionTests.java index e213edcf0060f..89c4842890416 100644 --- a/server/src/test/java/org/elasticsearch/action/support/master/TransportMasterNodeActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/support/master/TransportMasterNodeActionTests.java @@ -24,17 +24,15 @@ import org.elasticsearch.cluster.block.ClusterBlockLevel; import org.elasticsearch.cluster.block.ClusterBlocks; import org.elasticsearch.cluster.coordination.FailedToCommitClusterStateException; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodeRole; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.discovery.MasterNotDiscoveredException; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.node.NodeClosedException; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.tasks.Task; @@ -162,8 +160,9 @@ class Action extends TransportMasterNodeAction { Action(String actionName, TransportService transportService, ClusterService clusterService, ThreadPool threadPool) { super(actionName, transportService, clusterService, threadPool, - new ActionFilters(new HashSet<>()), Request::new, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - Response::new, ThreadPool.Names.SAME); + new ActionFilters(new HashSet<>()), Request::new, + TestIndexNameExpressionResolver.newInstance(), Response::new, + ThreadPool.Names.SAME); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/support/replication/BroadcastReplicationTests.java b/server/src/test/java/org/elasticsearch/action/support/replication/BroadcastReplicationTests.java index ee09089887a39..7b044a385ea00 100644 --- a/server/src/test/java/org/elasticsearch/action/support/replication/BroadcastReplicationTests.java +++ b/server/src/test/java/org/elasticsearch/action/support/replication/BroadcastReplicationTests.java @@ -31,9 +31,9 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.PageCacheRecycler; import org.elasticsearch.common.util.concurrent.ConcurrentCollections; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.core.internal.io.IOUtils; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.indices.breaker.CircuitBreakerService; import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; import org.elasticsearch.rest.RestStatus; @@ -93,7 +93,7 @@ threadPool, new NetworkService(Collections.emptyList()), PageCacheRecycler.NON_R transportService.start(); transportService.acceptIncomingRequests(); broadcastReplicationAction = new TestBroadcastReplicationAction(clusterService, transportService, - new ActionFilters(new HashSet<>()), new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), null); + new ActionFilters(new HashSet<>()), TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext()), null); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTests.java b/server/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTests.java index 349097c4dc61f..56cfdac9197c2 100644 --- a/server/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTests.java @@ -10,7 +10,6 @@ import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.ActionTestUtils; import org.elasticsearch.action.support.PlainActionFuture; @@ -32,12 +31,13 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexService; +import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.ShardNotFoundException; import org.elasticsearch.index.translog.Translog; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.node.NodeClosedException; import org.elasticsearch.test.ClusterServiceUtils; import org.elasticsearch.test.ESTestCase; @@ -66,7 +66,6 @@ import java.util.function.Consumer; import java.util.stream.Collectors; -import static java.util.Collections.emptyMap; import static org.elasticsearch.test.ClusterServiceUtils.createClusterService; import static org.hamcrest.Matchers.arrayWithSize; import static org.hamcrest.Matchers.equalTo; @@ -358,7 +357,7 @@ protected TestAction(boolean withDocumentFailureOnPrimary, boolean withDocumentF new TransportService(Settings.EMPTY, mock(Transport.class), null, TransportService.NOOP_TRANSPORT_INTERCEPTOR, x -> null, null, Collections.emptySet()), TransportWriteActionTests.this.clusterService, null, null, null, new ActionFilters(new HashSet<>()), TestRequest::new, TestRequest::new, ignore -> ThreadPool.Names.SAME, false, - new IndexingPressure(Settings.EMPTY), new SystemIndices(emptyMap())); + new IndexingPressure(Settings.EMPTY), EmptySystemIndices.INSTANCE); this.withDocumentFailureOnPrimary = withDocumentFailureOnPrimary; this.withDocumentFailureOnReplica = withDocumentFailureOnReplica; } @@ -368,7 +367,7 @@ protected TestAction(Settings settings, String actionName, TransportService tran super(settings, actionName, transportService, clusterService, mockIndicesService(clusterService), threadPool, shardStateAction, new ActionFilters(new HashSet<>()), TestRequest::new, TestRequest::new, ignore -> ThreadPool.Names.SAME, false, - new IndexingPressure(settings), new SystemIndices(emptyMap())); + new IndexingPressure(settings), EmptySystemIndices.INSTANCE); this.withDocumentFailureOnPrimary = false; this.withDocumentFailureOnReplica = false; } diff --git a/server/src/test/java/org/elasticsearch/action/support/single/instance/TransportInstanceSingleOperationActionTests.java b/server/src/test/java/org/elasticsearch/action/support/single/instance/TransportInstanceSingleOperationActionTests.java index fd8f62428a71b..a673cdb15ebcf 100644 --- a/server/src/test/java/org/elasticsearch/action/support/single/instance/TransportInstanceSingleOperationActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/support/single/instance/TransportInstanceSingleOperationActionTests.java @@ -32,6 +32,7 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.transport.CapturingTransport; @@ -126,9 +127,9 @@ protected ShardIterator shards(ClusterState clusterState, Request request) { } } - class MyResolver extends IndexNameExpressionResolver { + static class MyResolver extends IndexNameExpressionResolver { MyResolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/termvectors/TransportMultiTermVectorsActionTests.java b/server/src/test/java/org/elasticsearch/action/termvectors/TransportMultiTermVectorsActionTests.java index f168b51719ba2..8ee71af61013e 100644 --- a/server/src/test/java/org/elasticsearch/action/termvectors/TransportMultiTermVectorsActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/termvectors/TransportMultiTermVectorsActionTests.java @@ -33,6 +33,7 @@ import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.tasks.Task; import org.elasticsearch.tasks.TaskId; @@ -214,7 +215,7 @@ private static Task createTask() { static class Resolver extends IndexNameExpressionResolver { Resolver() { - super(new ThreadContext(Settings.EMPTY)); + super(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); } @Override diff --git a/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java b/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java index ca58a360b855d..6b9cd2964e735 100644 --- a/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java @@ -42,6 +42,7 @@ import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.gateway.GatewayAllocator; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.plugins.ClusterPlugin; import org.elasticsearch.test.gateway.TestGatewayAllocator; @@ -53,6 +54,8 @@ import java.util.Map; import java.util.function.Supplier; +import static java.util.Collections.singletonList; + public class ClusterModuleTests extends ModuleTestCase { private ClusterInfoService clusterInfoService = EmptyClusterInfoService.INSTANCE; private ClusterService clusterService; @@ -124,33 +127,33 @@ public void testRegisterAllocationDeciderDuplicate() { Collections.singletonList(new ClusterPlugin() { @Override public Collection createAllocationDeciders(Settings settings, ClusterSettings clusterSettings) { - return Collections.singletonList(new EnableAllocationDecider(settings, clusterSettings)); + return singletonList(new EnableAllocationDecider(settings, clusterSettings)); } - }), clusterInfoService, null, threadContext)); + }), clusterInfoService, null, threadContext, EmptySystemIndices.INSTANCE)); assertEquals(e.getMessage(), "Cannot specify allocation decider [" + EnableAllocationDecider.class.getName() + "] twice"); } public void testRegisterAllocationDecider() { ClusterModule module = new ClusterModule(Settings.EMPTY, clusterService, - Collections.singletonList(new ClusterPlugin() { + singletonList(new ClusterPlugin() { @Override public Collection createAllocationDeciders(Settings settings, ClusterSettings clusterSettings) { - return Collections.singletonList(new FakeAllocationDecider()); + return singletonList(new FakeAllocationDecider()); } - }), clusterInfoService, null, threadContext); + }), clusterInfoService, null, threadContext, EmptySystemIndices.INSTANCE); assertTrue(module.deciderList.stream().anyMatch(d -> d.getClass().equals(FakeAllocationDecider.class))); } private ClusterModule newClusterModuleWithShardsAllocator(Settings settings, String name, Supplier supplier) { - return new ClusterModule(settings, clusterService, Collections.singletonList( + return new ClusterModule(settings, clusterService, singletonList( new ClusterPlugin() { @Override public Map> getShardsAllocators(Settings settings, ClusterSettings clusterSettings) { return Collections.singletonMap(name, supplier); } } - ), clusterInfoService, null, threadContext); + ), clusterInfoService, null, threadContext, EmptySystemIndices.INSTANCE); } public void testRegisterShardsAllocator() { @@ -168,7 +171,8 @@ public void testRegisterShardsAllocatorAlreadyRegistered() { public void testUnknownShardsAllocator() { Settings settings = Settings.builder().put(ClusterModule.SHARDS_ALLOCATOR_TYPE_SETTING.getKey(), "dne").build(); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> - new ClusterModule(settings, clusterService, Collections.emptyList(), clusterInfoService, null, threadContext)); + new ClusterModule(settings, clusterService, Collections.emptyList(), clusterInfoService, null, threadContext, + EmptySystemIndices.INSTANCE)); assertEquals("Unknown ShardsAllocator [dne]", e.getMessage()); } @@ -236,15 +240,15 @@ public void testPre63CustomsFiltering() { public void testRejectsReservedExistingShardsAllocatorName() { final ClusterModule clusterModule = new ClusterModule(Settings.EMPTY, clusterService, - Collections.singletonList(existingShardsAllocatorPlugin(GatewayAllocator.ALLOCATOR_NAME)), clusterInfoService, null, - threadContext); + singletonList(existingShardsAllocatorPlugin(GatewayAllocator.ALLOCATOR_NAME)), clusterInfoService, null, threadContext, + EmptySystemIndices.INSTANCE); expectThrows(IllegalArgumentException.class, () -> clusterModule.setExistingShardsAllocators(new TestGatewayAllocator())); } public void testRejectsDuplicateExistingShardsAllocatorName() { final ClusterModule clusterModule = new ClusterModule(Settings.EMPTY, clusterService, Arrays.asList(existingShardsAllocatorPlugin("duplicate"), existingShardsAllocatorPlugin("duplicate")), clusterInfoService, null, - threadContext); + threadContext, EmptySystemIndices.INSTANCE); expectThrows(IllegalArgumentException.class, () -> clusterModule.setExistingShardsAllocators(new TestGatewayAllocator())); } diff --git a/server/src/test/java/org/elasticsearch/cluster/health/ClusterStateHealthTests.java b/server/src/test/java/org/elasticsearch/cluster/health/ClusterStateHealthTests.java index 78c7fff3fc32d..19606590480c2 100644 --- a/server/src/test/java/org/elasticsearch/cluster/health/ClusterStateHealthTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/health/ClusterStateHealthTests.java @@ -36,8 +36,8 @@ import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.util.set.Sets; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.gateway.TestGatewayAllocator; import org.elasticsearch.test.transport.CapturingTransport; @@ -68,13 +68,11 @@ import static org.hamcrest.Matchers.lessThanOrEqualTo; public class ClusterStateHealthTests extends ESTestCase { - private final IndexNameExpressionResolver indexNameExpressionResolver = - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); - private static ThreadPool threadPool; private ClusterService clusterService; private TransportService transportService; + private IndexNameExpressionResolver indexNameExpressionResolver; @BeforeClass public static void setupThreadPool() { @@ -91,6 +89,7 @@ public void setUp() throws Exception { TransportService.NOOP_TRANSPORT_INTERCEPTOR, x -> clusterService.localNode(), null, Collections.emptySet()); transportService.start(); transportService.acceptIncomingRequests(); + indexNameExpressionResolver = TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext()); } @After diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java index 2deb367e6476c..09045500a877d 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java @@ -14,6 +14,7 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.Context; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.DateMathExpressionResolver; +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel; import org.elasticsearch.test.ESTestCase; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -24,6 +25,7 @@ import java.util.Collections; import java.util.List; +import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel.NONE; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.joda.time.DateTimeZone.UTC; @@ -33,7 +35,7 @@ public class DateMathExpressionResolverTests extends ESTestCase { private final DateMathExpressionResolver expressionResolver = new DateMathExpressionResolver(); private final Context context = new Context( ClusterState.builder(new ClusterName("_name")).build(), IndicesOptions.strictExpand(), - false + SystemIndexAccessLevel.NONE ); public void testNormal() throws Exception { @@ -136,7 +138,7 @@ public void testExpression_CustomTimeZoneInIndexName() throws Exception { // rounding to today 00:00 now = DateTime.now(UTC).withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0); } - Context context = new Context(this.context.getState(), this.context.getOptions(), now.getMillis(), false); + Context context = new Context(this.context.getState(), this.context.getOptions(), now.getMillis(), NONE); List results = expressionResolver.resolve(context, Arrays.asList("<.marvel-{now/d{yyyy.MM.dd|" + timeZone.getID() + "}}>")); assertThat(results.size(), equalTo(1)); logger.info("timezone: [{}], now [{}], name: [{}]", timeZone, now, results.get(0)); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverAliasIterationTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverAliasIterationTests.java index aee7b2979f07b..88412e364c9c5 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverAliasIterationTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverAliasIterationTests.java @@ -8,13 +8,14 @@ package org.elasticsearch.cluster.metadata; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.EmptySystemIndices; public class IndexNameExpressionResolverAliasIterationTests extends IndexNameExpressionResolverTests { - protected IndexNameExpressionResolver createIndexNameExpressionResolver() { - return new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) { + @Override + protected IndexNameExpressionResolver createIndexNameExpressionResolver(ThreadContext threadContext) { + return new IndexNameExpressionResolver(threadContext, EmptySystemIndices.INSTANCE) { @Override boolean iterateIndexAliases(int indexAliasesSize, int resolvedExpressionsSize) { return true; diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverExpressionsIterationTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverExpressionsIterationTests.java index fdfc78e863c98..398c00177454f 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverExpressionsIterationTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverExpressionsIterationTests.java @@ -8,13 +8,14 @@ package org.elasticsearch.cluster.metadata; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.EmptySystemIndices; public class IndexNameExpressionResolverExpressionsIterationTests extends IndexNameExpressionResolverTests { - protected IndexNameExpressionResolver createIndexNameExpressionResolver() { - return new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) { + @Override + protected IndexNameExpressionResolver createIndexNameExpressionResolver(ThreadContext threadContext) { + return new IndexNameExpressionResolver(threadContext, EmptySystemIndices.INSTANCE) { @Override boolean iterateIndexAliases(int indexAliasesSize, int resolvedExpressionsSize) { return false; diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 0e67e94965098..d734c39d4e3fc 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -29,6 +29,11 @@ import org.elasticsearch.index.IndexSettings; import org.elasticsearch.indices.IndexClosedException; import org.elasticsearch.indices.InvalidIndexNameException; +import org.elasticsearch.indices.SystemIndexDescriptor; +import org.elasticsearch.indices.SystemIndexDescriptor.Type; +import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.SystemIndices.Feature; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import java.util.Arrays; @@ -44,11 +49,14 @@ import static org.elasticsearch.cluster.DataStreamTestHelper.createBackingIndex; import static org.elasticsearch.cluster.DataStreamTestHelper.createTimestampField; import static org.elasticsearch.cluster.metadata.IndexMetadata.INDEX_HIDDEN_SETTING; +import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY; import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY; +import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel.NONE; import static org.elasticsearch.common.util.set.Sets.newHashSet; import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.arrayContainingInAnyOrder; import static org.hamcrest.Matchers.arrayWithSize; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; @@ -68,7 +76,7 @@ private ThreadContext createThreadContext() { } protected IndexNameExpressionResolver createIndexNameExpressionResolver(ThreadContext threadContext) { - return new IndexNameExpressionResolver(threadContext); + return TestIndexNameExpressionResolver.newInstance(threadContext); } @Override @@ -90,7 +98,7 @@ public void testIndexOptionsStrict() { IndicesOptions[] indicesOptions = new IndicesOptions[]{ IndicesOptions.strictExpandOpen(), IndicesOptions.strictExpand()}; for (IndicesOptions options : indicesOptions) { - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "foo"); assertEquals(1, results.length); assertEquals("foo", results[0]); @@ -140,26 +148,26 @@ public void testIndexOptionsStrict() { } IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(3, results.length); results = indexNameExpressionResolver.concreteIndexNames(context, (String[])null); assertEquals(3, results.length); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpand(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpand(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(4, results.length); results = indexNameExpressionResolver.concreteIndexNames(context, (String[])null); assertEquals(4, results.length); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foofoo*"); assertEquals(3, results.length); assertThat(results, arrayContainingInAnyOrder("foo", "foobar", "foofoo")); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpand(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpand(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foofoo*"); assertEquals(4, results.length); assertThat(results, arrayContainingInAnyOrder("foo", "foobar", "foofoo", "foofoo-closed")); @@ -175,7 +183,7 @@ public void testIndexOptionsLenient() { IndicesOptions[] indicesOptions = new IndicesOptions[]{IndicesOptions.lenientExpandOpen(), IndicesOptions.lenientExpand()}; for (IndicesOptions options : indicesOptions) { - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "foo"); assertEquals(1, results.length); assertEquals("foo", results[0]); @@ -213,20 +221,20 @@ public void testIndexOptionsLenient() { } IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(3, results.length); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpand(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpand(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(Arrays.toString(results), 4, results.length); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foofoo*"); assertEquals(3, results.length); assertThat(results, arrayContainingInAnyOrder("foo", "foobar", "foofoo")); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpand(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpand(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foofoo*"); assertEquals(4, results.length); assertThat(results, arrayContainingInAnyOrder("foo", "foobar", "foofoo", "foofoo-closed")); @@ -245,7 +253,7 @@ public void testIndexOptionsAllowUnavailableDisallowEmpty() { IndicesOptions[] indicesOptions = new IndicesOptions[]{expandOpen, expand}; for (IndicesOptions options : indicesOptions) { - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "foo"); assertEquals(1, results.length); assertEquals("foo", results[0]); @@ -267,11 +275,11 @@ public void testIndexOptionsAllowUnavailableDisallowEmpty() { } } - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, expandOpen, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, expandOpen, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(3, results.length); - context = new IndexNameExpressionResolver.Context(state, expand, false); + context = new IndexNameExpressionResolver.Context(state, expand, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(4, results.length); } @@ -289,7 +297,7 @@ public void testIndexOptionsWildcardExpansion() { // Only closed IndicesOptions options = IndicesOptions.fromOptions(false, true, false, true, false); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(1, results.length); assertEquals("foo", results[0]); @@ -314,7 +322,7 @@ public void testIndexOptionsWildcardExpansion() { // Only open options = IndicesOptions.fromOptions(false, true, true, false, false); - context = new IndexNameExpressionResolver.Context(state, options, false); + context = new IndexNameExpressionResolver.Context(state, options, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(2, results.length); assertThat(results, arrayContainingInAnyOrder("bar", "foobar")); @@ -338,7 +346,7 @@ public void testIndexOptionsWildcardExpansion() { // Open and closed options = IndicesOptions.fromOptions(false, true, true, true, false); - context = new IndexNameExpressionResolver.Context(state, options, false); + context = new IndexNameExpressionResolver.Context(state, options, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(3, results.length); assertThat(results, arrayContainingInAnyOrder("bar", "foobar", "foo")); @@ -377,7 +385,7 @@ public void testIndexOptionsWildcardExpansion() { // open closed and hidden options = IndicesOptions.fromOptions(false, true, true, true, true); - context = new IndexNameExpressionResolver.Context(state, options, false); + context = new IndexNameExpressionResolver.Context(state, options, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(7, results.length); assertThat(results, arrayContainingInAnyOrder("bar", "foobar", "foo", "hidden", "hidden-closed", ".hidden", ".hidden-closed")); @@ -419,7 +427,7 @@ public void testIndexOptionsWildcardExpansion() { // open and hidden options = IndicesOptions.fromOptions(false, true, true, false, true); - context = new IndexNameExpressionResolver.Context(state, options, false); + context = new IndexNameExpressionResolver.Context(state, options, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(4, results.length); assertThat(results, arrayContainingInAnyOrder("bar", "foobar", "hidden", ".hidden")); @@ -438,7 +446,7 @@ public void testIndexOptionsWildcardExpansion() { // closed and hidden options = IndicesOptions.fromOptions(false, true, false, true, true); - context = new IndexNameExpressionResolver.Context(state, options, false); + context = new IndexNameExpressionResolver.Context(state, options, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertEquals(3, results.length); assertThat(results, arrayContainingInAnyOrder("foo", "hidden-closed", ".hidden-closed")); @@ -457,7 +465,7 @@ public void testIndexOptionsWildcardExpansion() { // only hidden options = IndicesOptions.fromOptions(false, true, false, false, true); - context = new IndexNameExpressionResolver.Context(state, options, false); + context = new IndexNameExpressionResolver.Context(state, options, NONE); results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertThat(results, emptyArray()); @@ -471,7 +479,7 @@ public void testIndexOptionsWildcardExpansion() { assertThat(results, arrayContainingInAnyOrder("hidden-closed")); options = IndicesOptions.fromOptions(false, false, true, true, true); - IndexNameExpressionResolver.Context context2 = new IndexNameExpressionResolver.Context(state, options, false); + IndexNameExpressionResolver.Context context2 = new IndexNameExpressionResolver.Context(state, options, NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context2, "-*")); assertThat(infe.getResourceId().toString(), equalTo("[-*]")); @@ -488,7 +496,7 @@ public void testIndexOptionsNoExpandWildcards() { //ignore unavailable and allow no indices { IndicesOptions noExpandLenient = IndicesOptions.fromOptions(true, true, false, false, randomBoolean()); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandLenient, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandLenient, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "baz*"); assertThat(results, emptyArray()); @@ -510,7 +518,7 @@ public void testIndexOptionsNoExpandWildcards() { //ignore unavailable but don't allow no indices { IndicesOptions noExpandDisallowEmpty = IndicesOptions.fromOptions(true, false, false, false, randomBoolean()); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandDisallowEmpty, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandDisallowEmpty, NONE); { IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, @@ -535,7 +543,7 @@ public void testIndexOptionsNoExpandWildcards() { //error on unavailable but allow no indices { IndicesOptions noExpandErrorUnavailable = IndicesOptions.fromOptions(false, true, false, false, randomBoolean()); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandErrorUnavailable, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandErrorUnavailable, NONE); { String[] results = indexNameExpressionResolver.concreteIndexNames(context, "baz*"); assertThat(results, emptyArray()); @@ -561,7 +569,7 @@ public void testIndexOptionsNoExpandWildcards() { //error on both unavailable and no indices { IndicesOptions noExpandStrict = IndicesOptions.fromOptions(false, false, false, false, randomBoolean()); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandStrict, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, noExpandStrict, NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "baz*")); assertThat(infe.getIndex().getName(), equalTo("baz*")); @@ -588,7 +596,7 @@ public void testIndexOptionsSingleIndexNoExpandWildcards() { { IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "baz*")); assertThat(infe.getIndex().getName(), equalTo("baz*")); @@ -596,7 +604,7 @@ public void testIndexOptionsSingleIndexNoExpandWildcards() { { IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "foo", "baz*")); assertThat(infe.getIndex().getName(), equalTo("baz*")); @@ -604,7 +612,7 @@ public void testIndexOptionsSingleIndexNoExpandWildcards() { { IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), NONE); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "foofoobar")); assertThat(e.getMessage(), containsString("alias [foofoobar] has more than one index associated with it")); @@ -612,7 +620,7 @@ public void testIndexOptionsSingleIndexNoExpandWildcards() { { IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), NONE); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "foo", "foofoobar")); assertThat(e.getMessage(), containsString("alias [foofoobar] has more than one index associated with it")); @@ -620,7 +628,7 @@ public void testIndexOptionsSingleIndexNoExpandWildcards() { { IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), NONE); IndexClosedException ince = expectThrows(IndexClosedException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "foofoo-closed", "foofoobar")); assertThat(ince.getMessage(), equalTo("closed")); @@ -628,7 +636,7 @@ public void testIndexOptionsSingleIndexNoExpandWildcards() { } IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictSingleIndexNoExpandForbidClosed(), NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "foo", "barbaz"); assertEquals(2, results.length); assertThat(results, arrayContainingInAnyOrder("foo", "foofoo")); @@ -638,7 +646,7 @@ public void testIndexOptionsEmptyCluster() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(Metadata.builder().build()).build(); IndicesOptions options = IndicesOptions.strictExpandOpen(); - final IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, false); + final IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, Strings.EMPTY_ARRAY); assertThat(results, emptyArray()); @@ -659,7 +667,7 @@ public void testIndexOptionsEmptyCluster() { final IndexNameExpressionResolver.Context context2 = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context2, Strings.EMPTY_ARRAY); assertThat(results, emptyArray()); results = indexNameExpressionResolver.concreteIndexNames(context2, "foo"); @@ -670,7 +678,7 @@ public void testIndexOptionsEmptyCluster() { assertThat(results, emptyArray()); final IndexNameExpressionResolver.Context context3 = - new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, false, true, false), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, false, true, false), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context3, Strings.EMPTY_ARRAY)); assertThat(infe.getResourceId().toString(), equalTo("[_all]")); @@ -696,7 +704,7 @@ public void testConcreteIndicesIgnoreIndicesOneMissingIndex() { .put(indexBuilder("kuku")); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "testZZZ")); @@ -709,7 +717,7 @@ public void testConcreteIndicesIgnoreIndicesOneMissingIndexOtherFound() { .put(indexBuilder("kuku")); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, "testXXX", "testZZZ")), equalTo(newHashSet("testXXX"))); @@ -721,7 +729,7 @@ public void testConcreteIndicesIgnoreIndicesAllMissing() { .put(indexBuilder("kuku")); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "testMo", "testMahdy")); @@ -734,7 +742,7 @@ public void testConcreteIndicesIgnoreIndicesEmptyRequest() { .put(indexBuilder("kuku")); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, new String[]{})), equalTo(newHashSet("kuku", "testXXX"))); } @@ -742,7 +750,7 @@ public void testConcreteIndicesNoIndicesErrorMessage() { Metadata.Builder mdBuilder = Metadata.builder(); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, - IndicesOptions.fromOptions(false, false, true, true), false); + IndicesOptions.fromOptions(false, false, true, true), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndices(context, new String[]{})); assertThat(infe.getMessage(), is("no such index [null] and no indices exist")); @@ -752,7 +760,7 @@ public void testConcreteIndicesNoIndicesErrorMessageNoExpand() { Metadata.Builder mdBuilder = Metadata.builder(); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, - IndicesOptions.fromOptions(false, false, false, false), false); + IndicesOptions.fromOptions(false, false, false, false), NONE); IndexNotFoundException infe = expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndices(context, new String[]{})); assertThat(infe.getMessage(), is("no such index [_all] and no indices exist")); @@ -768,16 +776,16 @@ public void testConcreteIndicesWildcardExpansion() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, false, false), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, false, false), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, "testX*")), equalTo(new HashSet())); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, true, false), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, true, false), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, "testX*")), equalTo(newHashSet("testXXX", "testXXY"))); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, false, true), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, false, true), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, "testX*")), equalTo(newHashSet("testXYY"))); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, true, true), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, true, true), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, "testX*")), equalTo(newHashSet("testXXX", "testXXY", "testXYY"))); } @@ -795,7 +803,7 @@ public void testConcreteIndicesWildcardWithNegation() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, - IndicesOptions.fromOptions(true, true, true, true), false); + IndicesOptions.fromOptions(true, true, true, true), NONE); assertThat(newHashSet(indexNameExpressionResolver.concreteIndexNames(context, "testX*")), equalTo(newHashSet("testXXX", "testXXY", "testXYY"))); @@ -1083,7 +1091,7 @@ public void testConcreteIndicesAllPatternRandom() { { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(Metadata.builder().build()).build(); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, indicesOptions, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, indicesOptions, NONE); // with no indices, asking for all indices should return empty list or exception, depending on indices options if (indicesOptions.allowNoIndices()) { @@ -1102,7 +1110,7 @@ public void testConcreteIndicesAllPatternRandom() { .put(indexBuilder("bbb").state(State.OPEN).putAlias(AliasMetadata.builder("bbb_alias1"))) .put(indexBuilder("ccc").state(State.CLOSE).putAlias(AliasMetadata.builder("ccc_alias1"))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, indicesOptions, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, indicesOptions, NONE); if (indicesOptions.expandWildcardsOpen() || indicesOptions.expandWildcardsClosed() || indicesOptions.allowNoIndices()) { String[] concreteIndices = indexNameExpressionResolver.concreteIndexNames(context, allIndices); assertThat(concreteIndices, notNullValue()); @@ -1132,7 +1140,7 @@ public void testConcreteIndicesWildcardNoMatch() { .put(indexBuilder("bbb").state(State.OPEN).putAlias(AliasMetadata.builder("bbb_alias1"))) .put(indexBuilder("ccc").state(State.CLOSE).putAlias(AliasMetadata.builder("ccc_alias1"))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, indicesOptions, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, indicesOptions, NONE); // asking for non existing wildcard pattern should return empty list or exception if (indicesOptions.allowNoIndices()) { @@ -1261,20 +1269,20 @@ public void testIndexOptionsFailClosedIndicesAndAliases() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context contextICE = - new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpenAndForbidClosed(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpenAndForbidClosed(), NONE); expectThrows(IndexClosedException.class, () -> indexNameExpressionResolver.concreteIndexNames(contextICE, "foo1-closed")); expectThrows(IndexClosedException.class, () -> indexNameExpressionResolver.concreteIndexNames(contextICE, "foobar1-closed")); IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, contextICE.getOptions().allowNoIndices(), contextICE.getOptions().expandWildcardsOpen(), - contextICE.getOptions().expandWildcardsClosed(), contextICE.getOptions()), false); + contextICE.getOptions().expandWildcardsClosed(), contextICE.getOptions()), NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "foo1-closed"); assertThat(results, emptyArray()); results = indexNameExpressionResolver.concreteIndexNames(context, "foobar1-closed"); assertThat(results, emptyArray()); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foo1-closed"); assertThat(results, arrayWithSize(1)); assertThat(results, arrayContaining("foo1-closed")); @@ -1284,7 +1292,7 @@ public void testIndexOptionsFailClosedIndicesAndAliases() { assertThat(results, arrayContaining("foo1-closed")); // testing an alias pointing to three indices: - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpenAndForbidClosed(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpenAndForbidClosed(), NONE); try { indexNameExpressionResolver.concreteIndexNames(context, "foobar2-closed"); fail("foo2-closed should be closed, but it is open"); @@ -1294,12 +1302,12 @@ public void testIndexOptionsFailClosedIndicesAndAliases() { context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, context.getOptions().allowNoIndices(), context.getOptions().expandWildcardsOpen(), - context.getOptions().expandWildcardsClosed(), context.getOptions()), false); + context.getOptions().expandWildcardsClosed(), context.getOptions()), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foobar2-closed"); assertThat(results, arrayWithSize(1)); assertThat(results, arrayContaining("foo3")); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); results = indexNameExpressionResolver.concreteIndexNames(context, "foobar2-closed"); assertThat(results, arrayWithSize(3)); assertThat(results, arrayContainingInAnyOrder("foo1-closed", "foo2-closed", "foo3")); @@ -1312,7 +1320,7 @@ public void testDedupConcreteIndices() { IndicesOptions[] indicesOptions = new IndicesOptions[]{ IndicesOptions.strictExpandOpen(), IndicesOptions.strictExpand(), IndicesOptions.lenientExpandOpen(), IndicesOptions.strictExpandOpenAndForbidClosed()}; for (IndicesOptions options : indicesOptions) { - IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, false); + IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, options, NONE); String[] results = indexNameExpressionResolver.concreteIndexNames(context, "index1", "index1", "alias1"); assertThat(results, equalTo(new String[]{"index1"})); } @@ -1333,11 +1341,11 @@ public void testFilterClosedIndicesOnAliases() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); String[] strings = indexNameExpressionResolver.concreteIndexNames(context, "alias-*"); assertArrayEquals(new String[] {"test-0"}, strings); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.strictExpandOpen(), NONE); strings = indexNameExpressionResolver.concreteIndexNames(context, "alias-*"); assertArrayEquals(new String[] {"test-0"}, strings); @@ -1749,7 +1757,7 @@ public void testInvalidIndex() { Metadata.Builder mdBuilder = Metadata.builder().put(indexBuilder("test")); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); InvalidIndexNameException iine = expectThrows(InvalidIndexNameException.class, () -> indexNameExpressionResolver.concreteIndexNames(context, "_foo")); @@ -1900,6 +1908,108 @@ public void testWildcardSystemIndexResolutionMultipleMatchesDeprecated() { } + public void testExternalSystemIndexAccess() { + final ClusterState prev = systemIndexTestClusterState(); + ClusterState state = ClusterState.builder(prev) + .metadata(Metadata.builder(prev.metadata()) + .put(indexBuilder(".external-sys-idx", Settings.EMPTY).state(State.OPEN).system(true))) + .build(); + SystemIndices systemIndices = new SystemIndices( + org.elasticsearch.common.collect.Map.of( + "ml", + new Feature( + "ml indices", + org.elasticsearch.common.collect.List.of( + new SystemIndexDescriptor(".ml-meta", "ml meta"), new SystemIndexDescriptor(".ml-stuff", "other ml")) + ), + "watcher", + new Feature("watcher indices", + org.elasticsearch.common.collect.List.of(new SystemIndexDescriptor(".watches", "watches index"))), + "stack-component", + new Feature("stack component", + org.elasticsearch.common.collect.List.of( + new SystemIndexDescriptor( + ".external-sys-idx", + "external", + Type.EXTERNAL_UNMANAGED, + org.elasticsearch.common.collect.List.of("stack-component", "other") + ) + ) + ) + ) + ); + indexNameExpressionResolver = new IndexNameExpressionResolver(threadContext, systemIndices); + + { + try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.FALSE.toString()); + SearchRequest request = new SearchRequest(".external-*"); + + List indexNames = resolveConcreteIndexNameList(state, request); + assertThat(indexNames, contains(".external-sys-idx")); + assertWarnings("this request accesses system indices: [.external-sys-idx], but in a future major version, direct access " + + "to system indices will be prevented by default"); + } + } + { + try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.FALSE.toString()); + SearchRequest request = new SearchRequest(".external-sys-idx"); + + List indexNames = resolveConcreteIndexNameList(state, request); + assertThat(indexNames, contains(".external-sys-idx")); + assertWarnings("this request accesses system indices: [.external-sys-idx], but in a future major version, direct access " + + "to system indices will be prevented by default"); + } + } + // product origin = stack-component + { + try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.TRUE.toString()); + threadContext.putHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, "stack-component"); + SearchRequest request = new SearchRequest(".external-*"); + + List indexNames = resolveConcreteIndexNameList(state, request); + assertThat(indexNames, contains(".external-sys-idx")); + assertWarnings(); + } + } + { + try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.TRUE.toString()); + threadContext.putHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, "stack-component"); + SearchRequest request = new SearchRequest(".external-sys-idx"); + + List indexNames = resolveConcreteIndexNameList(state, request); + assertThat(indexNames, contains(".external-sys-idx")); + assertWarnings(); + } + } + // product origin = other + { + try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.TRUE.toString()); + threadContext.putHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, "other"); + SearchRequest request = new SearchRequest(".external-*"); + + List indexNames = resolveConcreteIndexNameList(state, request); + assertThat(indexNames, contains(".external-sys-idx")); + assertWarnings(); + } + } + { + try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { + threadContext.putHeader(SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, Boolean.TRUE.toString()); + threadContext.putHeader(EXTERNAL_SYSTEM_INDEX_ACCESS_CONTROL_HEADER_KEY, "other"); + SearchRequest request = new SearchRequest(".external-sys-idx"); + + List indexNames = resolveConcreteIndexNameList(state, request); + assertThat(indexNames, contains(".external-sys-idx")); + assertWarnings(); + } + } + } + public void testConcreteIndicesPreservesOrdering() { epochMillis = 1582761600L; // set to a date known to fail without #65027 final String dataStreamName = "my-data-stream"; @@ -2193,13 +2303,25 @@ private ClusterState systemIndexTestClusterState() { .put(indexBuilder(".watches", settings).state(State.OPEN).system(true)) .put(indexBuilder(".ml-stuff", settings).state(State.OPEN).system(true)) .put(indexBuilder("some-other-index").state(State.OPEN)); + SystemIndices systemIndices = new SystemIndices( + org.elasticsearch.common.collect.Map.of("ml", + new Feature("ml indices", + org.elasticsearch.common.collect.List.of( + new SystemIndexDescriptor(".ml-meta", "ml meta"), new SystemIndexDescriptor(".ml-stuff", "other ml")) + ), + "watcher", + new Feature("watcher indices", + org.elasticsearch.common.collect.List.of(new SystemIndexDescriptor(".watches", "watches index"))) + ) + ); + indexNameExpressionResolver = new IndexNameExpressionResolver(threadContext, systemIndices); return ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); } private List resolveConcreteIndexNameList(ClusterState state, SearchRequest request) { return Arrays .stream(indexNameExpressionResolver.concreteIndices(state, request)) - .map(i -> i.getName()) + .map(Index::getName) .collect(Collectors.toList()); } } diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java index e907461bc8190..a9cd5c8692725 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java @@ -43,6 +43,7 @@ import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.SearchExecutionContext; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.InvalidAliasNameException; import org.elasticsearch.indices.InvalidIndexNameException; import org.elasticsearch.indices.ShardLimitValidator; @@ -465,7 +466,7 @@ public void testValidateIndexName() throws Exception { null, threadPool, null, - new SystemIndices(Collections.emptyMap()), + EmptySystemIndices.INSTANCE, false ); validateIndexName(checkerService, "index?name", "must not contain the following characters " + Strings.INVALID_FILENAME_CHARS); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java index 7aff6dcac41c4..cb55bd2678ce4 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java @@ -37,10 +37,10 @@ import org.elasticsearch.index.mapper.TextSearchInfo; import org.elasticsearch.index.mapper.ValueFetcher; import org.elasticsearch.index.query.SearchExecutionContext; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndexTemplateMissingException; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.indices.InvalidIndexTemplateException; -import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.plugins.MapperPlugin; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESSingleNodeTestCase; @@ -1502,7 +1502,7 @@ private static List putTemplate(NamedXContentRegistry xContentRegistr IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, null, xContentRegistry, - new SystemIndices(Collections.emptyMap()), + EmptySystemIndices.INSTANCE, true ); MetadataIndexTemplateService service = new MetadataIndexTemplateService(null, createIndexService, @@ -1559,7 +1559,7 @@ private MetadataIndexTemplateService getMetadataIndexTemplateService() { IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, null, xContentRegistry(), - new SystemIndices(Collections.emptyMap()), + EmptySystemIndices.INSTANCE, true ); return new MetadataIndexTemplateService( diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/WildcardExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/WildcardExpressionResolverTests.java index dee31adefb859..31b071b5f8174 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/WildcardExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/WildcardExpressionResolverTests.java @@ -23,6 +23,7 @@ import static org.elasticsearch.cluster.DataStreamTestHelper.createBackingIndex; import static org.elasticsearch.cluster.DataStreamTestHelper.createTimestampField; +import static org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel.NONE; import static org.elasticsearch.common.util.set.Sets.newHashSet; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; @@ -38,7 +39,7 @@ public void testConvertWildcardsJustIndicesTests() { IndexNameExpressionResolver.WildcardExpressionResolver resolver = new IndexNameExpressionResolver.WildcardExpressionResolver(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("testXXX"))), equalTo(newHashSet("testXXX"))); assertThat(newHashSet(resolver.resolve(context, Arrays.asList("testXXX", "testYYY"))), equalTo(newHashSet("testXXX", "testYYY"))); assertThat(newHashSet(resolver.resolve(context, Arrays.asList("testXXX", "ku*"))), equalTo(newHashSet("testXXX", "kuku"))); @@ -67,7 +68,7 @@ public void testConvertWildcardsTests() { IndexNameExpressionResolver.WildcardExpressionResolver resolver = new IndexNameExpressionResolver.WildcardExpressionResolver(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); assertThat(newHashSet(resolver.resolve(context, Arrays.asList("testYY*", "alias*"))), equalTo(newHashSet("testXXX", "testXYY", "testYYY"))); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("-kuku"))), equalTo(newHashSet("-kuku"))); @@ -90,12 +91,12 @@ public void testConvertWildcardsOpenClosedIndicesTests() { IndexNameExpressionResolver.WildcardExpressionResolver resolver = new IndexNameExpressionResolver.WildcardExpressionResolver(); IndexNameExpressionResolver.Context context = new IndexNameExpressionResolver.Context(state, - IndicesOptions.fromOptions(true, true, true, true), false); + IndicesOptions.fromOptions(true, true, true, true), NONE); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("testX*"))), equalTo(newHashSet("testXXX", "testXXY", "testXYY"))); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, false, true), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, false, true), NONE); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("testX*"))), equalTo(newHashSet("testXYY"))); - context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, true, false), false); + context = new IndexNameExpressionResolver.Context(state, IndicesOptions.fromOptions(true, true, true, false), NONE); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("testX*"))), equalTo(newHashSet("testXXX", "testXXY"))); } @@ -113,7 +114,7 @@ public void testMultipleWildcards() { IndexNameExpressionResolver.WildcardExpressionResolver resolver = new IndexNameExpressionResolver.WildcardExpressionResolver(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("test*X*"))), equalTo(newHashSet("testXXX", "testXXY", "testXYY"))); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("test*X*Y"))), equalTo(newHashSet("testXXY", "testXYY"))); @@ -133,7 +134,7 @@ public void testAll() { IndexNameExpressionResolver.WildcardExpressionResolver resolver = new IndexNameExpressionResolver.WildcardExpressionResolver(); IndexNameExpressionResolver.Context context = - new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), false); + new IndexNameExpressionResolver.Context(state, IndicesOptions.lenientExpandOpen(), NONE); assertThat(newHashSet(resolver.resolve(context, Collections.singletonList("_all"))), equalTo(newHashSet("testXXX", "testXYY", "testYYY"))); } @@ -151,15 +152,15 @@ public void testResolveAliases() { IndicesOptions indicesAndAliasesOptions = IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), true, false, true, false, false, false); IndexNameExpressionResolver.Context indicesAndAliasesContext = - new IndexNameExpressionResolver.Context(state, indicesAndAliasesOptions, false); + new IndexNameExpressionResolver.Context(state, indicesAndAliasesOptions, NONE); // ignoreAliases option is set, WildcardExpressionResolver throws error when IndicesOptions skipAliasesIndicesOptions = IndicesOptions.fromOptions(true, true, true, false, true, false, true, false); IndexNameExpressionResolver.Context skipAliasesLenientContext = - new IndexNameExpressionResolver.Context(state, skipAliasesIndicesOptions, false); + new IndexNameExpressionResolver.Context(state, skipAliasesIndicesOptions, NONE); // ignoreAliases option is set, WildcardExpressionResolver resolves the provided expressions only against the defined indices IndicesOptions errorOnAliasIndicesOptions = IndicesOptions.fromOptions(false, false, true, false, true, false, true, false); IndexNameExpressionResolver.Context skipAliasesStrictContext = - new IndexNameExpressionResolver.Context(state, errorOnAliasIndicesOptions, false); + new IndexNameExpressionResolver.Context(state, errorOnAliasIndicesOptions, NONE); { List indices = resolver.resolve(indicesAndAliasesContext, Collections.singletonList("foo_a*")); @@ -226,7 +227,7 @@ public void testResolveDataStreams() { IndicesOptions indicesAndAliasesOptions = IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), true, false, true, false, false, false); IndexNameExpressionResolver.Context indicesAndAliasesContext = - new IndexNameExpressionResolver.Context(state, indicesAndAliasesOptions, false); + new IndexNameExpressionResolver.Context(state, indicesAndAliasesOptions, NONE); // data streams are not included but expression matches the data stream List indices = resolver.resolve(indicesAndAliasesContext, Collections.singletonList("foo_*")); @@ -241,7 +242,7 @@ public void testResolveDataStreams() { IndicesOptions indicesAndAliasesOptions = IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), true, false, true, false, false, false); IndexNameExpressionResolver.Context indicesAliasesAndDataStreamsContext = new IndexNameExpressionResolver.Context(state, - indicesAndAliasesOptions, false, false, true, false); + indicesAndAliasesOptions, false, false, true, NONE); // data stream's corresponding backing indices are resolved List indices = resolver.resolve(indicesAliasesAndDataStreamsContext, Collections.singletonList("foo_*")); @@ -260,7 +261,7 @@ public void testResolveDataStreams() { IndicesOptions indicesAliasesAndExpandHiddenOptions = IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), true, false, true, true, false, false, false); IndexNameExpressionResolver.Context indicesAliasesDataStreamsAndHiddenIndices = new IndexNameExpressionResolver.Context(state, - indicesAliasesAndExpandHiddenOptions, false, false, true, false); + indicesAliasesAndExpandHiddenOptions, false, false, true, NONE); // data stream's corresponding backing indices are resolved List indices = resolver.resolve(indicesAliasesDataStreamsAndHiddenIndices, Collections.singletonList("foo_*")); @@ -288,12 +289,12 @@ public void testMatchesConcreteIndicesWildcardAndAliases() { // expressions against the defined indices and aliases IndicesOptions indicesAndAliasesOptions = IndicesOptions.fromOptions(false, false, true, false, true, false, false, false); IndexNameExpressionResolver.Context indicesAndAliasesContext = - new IndexNameExpressionResolver.Context(state, indicesAndAliasesOptions, false); + new IndexNameExpressionResolver.Context(state, indicesAndAliasesOptions, NONE); // ignoreAliases option is set, WildcardExpressionResolver resolves the provided expressions // only against the defined indices IndicesOptions onlyIndicesOptions = IndicesOptions.fromOptions(false, false, true, false, true, false, true, false); - IndexNameExpressionResolver.Context onlyIndicesContext = new IndexNameExpressionResolver.Context(state, onlyIndicesOptions, false); + IndexNameExpressionResolver.Context onlyIndicesContext = new IndexNameExpressionResolver.Context(state, onlyIndicesOptions, NONE); { Set matches = IndexNameExpressionResolver.WildcardExpressionResolver.matches(indicesAndAliasesContext, diff --git a/server/src/test/java/org/elasticsearch/index/IndexModuleTests.java b/server/src/test/java/org/elasticsearch/index/IndexModuleTests.java index fde339ee6d2cc..a04088b4150f6 100644 --- a/server/src/test/java/org/elasticsearch/index/IndexModuleTests.java +++ b/server/src/test/java/org/elasticsearch/index/IndexModuleTests.java @@ -37,7 +37,6 @@ import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.common.util.PageCacheRecycler; import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.core.internal.io.IOUtils; import org.elasticsearch.env.Environment; import org.elasticsearch.env.NodeEnvironment; @@ -65,6 +64,7 @@ import org.elasticsearch.index.store.FsDirectoryFactory; import org.elasticsearch.indices.IndicesModule; import org.elasticsearch.indices.IndicesQueryCache; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.indices.analysis.AnalysisModule; import org.elasticsearch.indices.breaker.CircuitBreakerService; import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; @@ -137,6 +137,7 @@ public void beforeShardFoldersDeleted(ShardId shardId, IndexSettings indexSettin private BigArrays bigArrays; private ScriptService scriptService; private ClusterService clusterService; + private IndexNameExpressionResolver indexNameExpressionResolver; @Override public void setUp() throws Exception { @@ -157,6 +158,7 @@ public void setUp() throws Exception { clusterService = ClusterServiceUtils.createClusterService(threadPool); nodeEnvironment = new NodeEnvironment(settings, environment); mapperRegistry = new IndicesModule(Collections.emptyList()).getMapperRegistry(); + indexNameExpressionResolver = TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext()); } @Override @@ -181,7 +183,7 @@ public void testWrapperIsBound() throws IOException { engineFactory, Collections.emptyMap(), () -> true, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, Collections.emptyMap()); module.setReaderWrapper(s -> new Wrapper()); @@ -203,7 +205,7 @@ public void testRegisterIndexStore() throws IOException { final Map indexStoreFactories = singletonMap( "foo_store", new FooFunction()); final IndexModule module = new IndexModule(indexSettings, emptyAnalysisRegistry, new InternalEngineFactory(), indexStoreFactories, - () -> true, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), Collections.emptyMap()); + () -> true, indexNameExpressionResolver, Collections.emptyMap()); final IndexService indexService = newIndexService(module); assertThat(indexService.getDirectoryFactory(), instanceOf(FooFunction.class)); @@ -220,7 +222,7 @@ public void beforeIndexRemoved(IndexService indexService, IndexRemovalReason rea } }; IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(index, settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); module.addIndexEventListener(eventListener); IndexService indexService = newIndexService(module); IndexSettings x = indexService.getIndexSettings(); @@ -235,7 +237,7 @@ public void beforeIndexRemoved(IndexService indexService, IndexRemovalReason rea public void testListener() throws IOException { Setting booleanSetting = Setting.boolSetting("index.foo.bar", false, Property.Dynamic, Property.IndexScope); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(index, settings, booleanSetting); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); Setting booleanSetting2 = Setting.boolSetting("index.foo.bar.baz", false, Property.Dynamic, Property.IndexScope); AtomicBoolean atomicBoolean = new AtomicBoolean(false); module.addSettingsUpdateConsumer(booleanSetting, atomicBoolean::set); @@ -255,7 +257,7 @@ public void testListener() throws IOException { public void testAddIndexOperationListener() throws IOException { final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(index, settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); AtomicBoolean executed = new AtomicBoolean(false); IndexingOperationListener listener = new IndexingOperationListener() { @Override @@ -286,7 +288,7 @@ public Engine.Index preIndex(ShardId shardId, Engine.Index operation) { public void testAddSearchOperationListener() throws IOException { final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(index, settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); AtomicBoolean executed = new AtomicBoolean(false); SearchOperationListener listener = new SearchOperationListener() { @Override @@ -319,7 +321,7 @@ public void testAddSimilarity() throws IOException { .build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); IndexModule module = - createIndexModule(indexSettings, emptyAnalysisRegistry); + createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); module.addSimilarity("test_similarity", (providerSettings, indexCreatedVersion, scriptService) -> new TestSimilarity(providerSettings.get("key"))); @@ -339,7 +341,7 @@ public void testAddSimilarity() throws IOException { public void testFrozen() { final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(index, settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); module.freeze(); String msg = "Can't modify IndexModule once the index service has been created"; assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.addSearchOperationListener(null)).getMessage()); @@ -358,7 +360,7 @@ public void testSetupUnknownSimilarity() { .build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); IndexModule module = - createIndexModule(indexSettings, emptyAnalysisRegistry); + createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); Exception ex = expectThrows(IllegalArgumentException.class, () -> newIndexService(module)); assertEquals("Unknown Similarity type [test_similarity] for [my_similarity]", ex.getMessage()); } @@ -370,7 +372,7 @@ public void testSetupWithoutType() { .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT) .build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); Exception ex = expectThrows(IllegalArgumentException.class, () -> newIndexService(module)); assertEquals("Similarity [my_similarity] must have an associated type", ex.getMessage()); } @@ -380,7 +382,7 @@ public void testForceCustomQueryCache() throws IOException { .put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString()) .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT).build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); final Set liveQueryCaches = new HashSet<>(); module.forceQueryCacheProvider((a, b) -> { final CustomQueryCache customQueryCache = new CustomQueryCache(liveQueryCaches); @@ -401,7 +403,7 @@ public void testDefaultQueryCacheImplIsSelected() throws IOException { .put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString()) .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT).build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); IndexService indexService = newIndexService(module); assertTrue(indexService.cache().query() instanceof IndexQueryCache); indexService.close("simon says", false); @@ -413,7 +415,7 @@ public void testDisableQueryCacheHasPrecedenceOverForceQueryCache() throws IOExc .put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString()) .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT).build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); module.forceQueryCacheProvider((a, b) -> new CustomQueryCache(null)); IndexService indexService = newIndexService(module); assertTrue(indexService.cache().query() instanceof DisabledQueryCache); @@ -425,7 +427,7 @@ public void testCustomQueryCacheCleanedUpIfIndexServiceCreationFails() { .put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString()) .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT).build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings); - IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry); + IndexModule module = createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); final Set liveQueryCaches = new HashSet<>(); module.forceQueryCacheProvider((a, b) -> { final CustomQueryCache customQueryCache = new CustomQueryCache(liveQueryCaches); @@ -475,7 +477,7 @@ public void close() { }; final AnalysisRegistry analysisRegistry = new AnalysisRegistry(environment, emptyMap(), emptyMap(), emptyMap(), singletonMap("test", analysisProvider), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap()); - IndexModule module = createIndexModule(indexSettings, analysisRegistry); + IndexModule module = createIndexModule(indexSettings, analysisRegistry, indexNameExpressionResolver); threadPool.shutdown(); // causes index service creation to fail expectThrows(EsRejectedExecutionException.class, () -> newIndexService(module)); assertThat(openAnalyzers, empty()); @@ -492,7 +494,7 @@ public void testMmapNotAllowed() { .build(); final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(new Index("foo", "_na_"), settings, nodeSettings); final IndexModule module = - createIndexModule(indexSettings, emptyAnalysisRegistry); + createIndexModule(indexSettings, emptyAnalysisRegistry, indexNameExpressionResolver); final IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> newIndexService(module)); assertThat(e, hasToString(containsString("store type [" + storeType + "] is not allowed"))); } @@ -516,7 +518,7 @@ public void testRegisterCustomRecoveryStateFactory() throws IOException { new InternalEngineFactory(), Collections.emptyMap(), () -> true, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, recoveryStateFactories); final IndexService indexService = newIndexService(module); @@ -535,9 +537,10 @@ private ShardRouting createInitializedShardRouting() { return shard; } - private static IndexModule createIndexModule(IndexSettings indexSettings, AnalysisRegistry emptyAnalysisRegistry) { + private static IndexModule createIndexModule(IndexSettings indexSettings, AnalysisRegistry emptyAnalysisRegistry, + IndexNameExpressionResolver indexNameExpressionResolver) { return new IndexModule(indexSettings, emptyAnalysisRegistry, new InternalEngineFactory(), Collections.emptyMap(), () -> true, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), Collections.emptyMap()); + indexNameExpressionResolver, Collections.emptyMap()); } class CustomQueryCache implements QueryCache { diff --git a/server/src/test/java/org/elasticsearch/index/query/SearchIndexNameMatcherTests.java b/server/src/test/java/org/elasticsearch/index/query/SearchIndexNameMatcherTests.java index 352f71e57b11a..3074394de9ce9 100644 --- a/server/src/test/java/org/elasticsearch/index/query/SearchIndexNameMatcherTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/SearchIndexNameMatcherTests.java @@ -13,11 +13,10 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.junit.Before; @@ -39,10 +38,8 @@ public void setUpMatchers() { ClusterService clusterService = mock(ClusterService.class); when(clusterService.state()).thenReturn(state); - matcher = new SearchIndexNameMatcher("index1", "", clusterService, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); - remoteMatcher = new SearchIndexNameMatcher("index1", "cluster", clusterService, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + matcher = new SearchIndexNameMatcher("index1", "", clusterService, TestIndexNameExpressionResolver.newInstance()); + remoteMatcher = new SearchIndexNameMatcher("index1", "cluster", clusterService, TestIndexNameExpressionResolver.newInstance()); } private static IndexMetadata.Builder indexBuilder(String index) { diff --git a/server/src/test/java/org/elasticsearch/index/seqno/RetentionLeaseSyncActionTests.java b/server/src/test/java/org/elasticsearch/index/seqno/RetentionLeaseSyncActionTests.java index 0eb075d2d4761..2fad1e05e5d7b 100644 --- a/server/src/test/java/org/elasticsearch/index/seqno/RetentionLeaseSyncActionTests.java +++ b/server/src/test/java/org/elasticsearch/index/seqno/RetentionLeaseSyncActionTests.java @@ -9,7 +9,6 @@ package org.elasticsearch.index.seqno; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.ActionTestUtils; import org.elasticsearch.action.support.PlainActionFuture; @@ -20,10 +19,11 @@ import org.elasticsearch.core.internal.io.IOUtils; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexService; +import org.elasticsearch.index.IndexingPressure; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.indices.SystemIndices; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.transport.CapturingTransport; import org.elasticsearch.threadpool.TestThreadPool; @@ -33,7 +33,6 @@ import java.util.Collections; import java.util.concurrent.atomic.AtomicBoolean; -import static java.util.Collections.emptyMap; import static org.elasticsearch.mock.orig.Mockito.when; import static org.elasticsearch.test.ClusterServiceUtils.createClusterService; import static org.hamcrest.Matchers.sameInstance; @@ -97,7 +96,7 @@ public void testRetentionLeaseSyncActionOnPrimary() { shardStateAction, new ActionFilters(Collections.emptySet()), new IndexingPressure(Settings.EMPTY), - new SystemIndices(emptyMap())); + EmptySystemIndices.INSTANCE); final RetentionLeases retentionLeases = mock(RetentionLeases.class); final RetentionLeaseSyncAction.Request request = new RetentionLeaseSyncAction.Request(indexShard.shardId(), retentionLeases); action.dispatchedShardOperationOnPrimary(request, indexShard, @@ -135,7 +134,7 @@ public void testRetentionLeaseSyncActionOnReplica() throws Exception { shardStateAction, new ActionFilters(Collections.emptySet()), new IndexingPressure(Settings.EMPTY), - new SystemIndices(emptyMap())); + EmptySystemIndices.INSTANCE); final RetentionLeases retentionLeases = mock(RetentionLeases.class); final RetentionLeaseSyncAction.Request request = new RetentionLeaseSyncAction.Request(indexShard.shardId(), retentionLeases); @@ -176,7 +175,7 @@ public void testBlocks() { shardStateAction, new ActionFilters(Collections.emptySet()), new IndexingPressure(Settings.EMPTY), - new SystemIndices(emptyMap())); + EmptySystemIndices.INSTANCE); assertNull(action.indexBlockLevel()); } diff --git a/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java b/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java index 9ff119e16b67f..92800fccbc700 100644 --- a/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java +++ b/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java @@ -47,12 +47,12 @@ import org.elasticsearch.cluster.coordination.NodeRemovalClusterStateTaskExecutor; import org.elasticsearch.cluster.metadata.AliasValidator; import org.elasticsearch.cluster.metadata.IndexMetadata; +import org.elasticsearch.cluster.metadata.IndexMetadataVerifier; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.MetadataCreateIndexService; import org.elasticsearch.cluster.metadata.MetadataDeleteIndexService; import org.elasticsearch.cluster.metadata.MetadataIndexStateService; import org.elasticsearch.cluster.metadata.MetadataIndexStateServiceUtils; -import org.elasticsearch.cluster.metadata.IndexMetadataVerifier; import org.elasticsearch.cluster.metadata.MetadataUpdateSettingsService; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.routing.ShardRouting; @@ -70,7 +70,6 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.IndexScopedSettings; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.env.Environment; import org.elasticsearch.env.TestEnvironment; @@ -79,9 +78,10 @@ import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.shard.IndexEventListener; import org.elasticsearch.index.shard.ShardLongFieldRange; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.indices.ShardLimitValidator; -import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.snapshots.EmptySnapshotsInfoService; import org.elasticsearch.test.gateway.TestGatewayAllocator; import org.elasticsearch.threadpool.ThreadPool; @@ -99,7 +99,6 @@ import java.util.stream.Collectors; import static com.carrotsearch.randomizedtesting.RandomizedTest.getRandom; -import static java.util.Collections.emptyMap; import static org.elasticsearch.env.Environment.PATH_HOME_SETTING; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; @@ -144,8 +143,7 @@ public ClusterStateChanges(NamedXContentRegistry xContentRegistry, ThreadPool th shardStartedClusterStateTaskExecutor = new ShardStateAction.ShardStartedClusterStateTaskExecutor(allocationService, null, () -> Priority.NORMAL, logger); ActionFilters actionFilters = new ActionFilters(Collections.emptySet()); - IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); - SystemIndices systemIndices = new SystemIndices(emptyMap()); + IndexNameExpressionResolver indexNameExpressionResolver = TestIndexNameExpressionResolver.newInstance(); DestructiveOperations destructiveOperations = new DestructiveOperations(SETTINGS, clusterSettings); Environment environment = TestEnvironment.newEnvironment(SETTINGS); Transport transport = mock(Transport.class); // it's not used @@ -211,7 +209,7 @@ public IndexMetadata verifyIndexMetadata(IndexMetadata indexMetadata, Version mi allocationService, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, indicesService, shardLimitValidator, threadPool); MetadataCreateIndexService createIndexService = new MetadataCreateIndexService(SETTINGS, clusterService, indicesService, allocationService, new AliasValidator(), shardLimitValidator, environment, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, threadPool, xContentRegistry, new SystemIndices(emptyMap()), true); + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, threadPool, xContentRegistry, EmptySystemIndices.INSTANCE, true); transportCloseIndexAction = new TransportCloseIndexAction(SETTINGS, transportService, clusterService, threadPool, indexStateService, clusterSettings, actionFilters, indexNameExpressionResolver, destructiveOperations); @@ -221,11 +219,12 @@ allocationService, new AliasValidator(), shardLimitValidator, environment, clusterService, threadPool, deleteIndexService, actionFilters, indexNameExpressionResolver, destructiveOperations); transportUpdateSettingsAction = new TransportUpdateSettingsAction( transportService, clusterService, threadPool, metadataUpdateSettingsService, actionFilters, indexNameExpressionResolver, - systemIndices); + EmptySystemIndices.INSTANCE); transportClusterRerouteAction = new TransportClusterRerouteAction( transportService, clusterService, threadPool, allocationService, actionFilters, indexNameExpressionResolver); transportCreateIndexAction = new TransportCreateIndexAction( - transportService, clusterService, threadPool, createIndexService, actionFilters, indexNameExpressionResolver, systemIndices); + transportService, clusterService, threadPool, createIndexService, actionFilters, indexNameExpressionResolver, + EmptySystemIndices.INSTANCE); nodeRemovalExecutor = new NodeRemovalClusterStateTaskExecutor(allocationService, logger); joinTaskExecutor = new JoinTaskExecutor(Settings.EMPTY, allocationService, logger, (s, p, r) -> {}); diff --git a/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java b/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java index a8cfba424542e..f9ec753b3c094 100644 --- a/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java +++ b/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java @@ -131,7 +131,6 @@ import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.common.util.PageCacheRecycler; import org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.env.Environment; import org.elasticsearch.env.NodeEnvironment; @@ -144,10 +143,11 @@ import org.elasticsearch.index.seqno.GlobalCheckpointSyncAction; import org.elasticsearch.index.seqno.RetentionLeaseSyncer; import org.elasticsearch.index.shard.PrimaryReplicaSyncer; +import org.elasticsearch.indices.EmptySystemIndices; import org.elasticsearch.indices.IndicesModule; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.indices.ShardLimitValidator; -import org.elasticsearch.indices.SystemIndices; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.indices.analysis.AnalysisModule; import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; import org.elasticsearch.indices.cluster.IndicesClusterStateService; @@ -1444,8 +1444,7 @@ protected NamedWriteableRegistry writeableRegistry() { }; transportService = mockTransport.createTransportService(settings, threadPool, TransportService.NOOP_TRANSPORT_INTERCEPTOR, a -> node, null, emptySet()); - final IndexNameExpressionResolver indexNameExpressionResolver = - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + final IndexNameExpressionResolver indexNameExpressionResolver = TestIndexNameExpressionResolver.newInstance(); repositoriesService = new RepositoriesService( settings, clusterService, transportService, Collections.singletonMap(FsRepository.TYPE, getRepoFactory(environment)), emptyMap(), threadPool @@ -1501,9 +1500,6 @@ protected NamedWriteableRegistry writeableRegistry() { new NodeConnectionsService(clusterService.getSettings(), threadPool, transportService); final MetadataMappingService metadataMappingService = new MetadataMappingService(clusterService, indicesService); peerRecoverySourceService = new PeerRecoverySourceService(transportService, indicesService, recoverySettings); - - final SystemIndices systemIndices = new SystemIndices(emptyMap()); - indicesClusterStateService = new IndicesClusterStateService( settings, indicesService, @@ -1527,7 +1523,7 @@ protected NamedWriteableRegistry writeableRegistry() { shardStateAction, actionFilters, new IndexingPressure(settings), - systemIndices)), + EmptySystemIndices.INSTANCE)), new GlobalCheckpointSyncAction( settings, transportService, @@ -1542,18 +1538,18 @@ protected NamedWriteableRegistry writeableRegistry() { final MetadataCreateIndexService metadataCreateIndexService = new MetadataCreateIndexService(settings, clusterService, indicesService, allocationService, new AliasValidator(), shardLimitValidator, environment, indexScopedSettings, - threadPool, namedXContentRegistry, systemIndices, false); + threadPool, namedXContentRegistry, EmptySystemIndices.INSTANCE, false); actions.put(CreateIndexAction.INSTANCE, new TransportCreateIndexAction( transportService, clusterService, threadPool, metadataCreateIndexService, - actionFilters, indexNameExpressionResolver, systemIndices + actionFilters, indexNameExpressionResolver, EmptySystemIndices.INSTANCE )); final MappingUpdatedAction mappingUpdatedAction = new MappingUpdatedAction(settings, clusterSettings, clusterService); mappingUpdatedAction.setClient(client); final TransportShardBulkAction transportShardBulkAction = new TransportShardBulkAction(settings, transportService, clusterService, indicesService, threadPool, shardStateAction, mappingUpdatedAction, new UpdateHelper(scriptService), - actionFilters, new IndexingPressure(settings), new SystemIndices(emptyMap())); + actionFilters, new IndexingPressure(settings), EmptySystemIndices.INSTANCE); actions.put(BulkAction.INSTANCE, new TransportBulkAction(threadPool, transportService, clusterService, new IngestService( @@ -1562,7 +1558,7 @@ clusterService, indicesService, threadPool, shardStateAction, mappingUpdatedActi Collections.emptyList(), client), transportShardBulkAction, client, actionFilters, indexNameExpressionResolver, new IndexingPressure(settings), - systemIndices + EmptySystemIndices.INSTANCE )); final RestoreService restoreService = new RestoreService( clusterService, repositoriesService, allocationService, @@ -1574,14 +1570,14 @@ clusterService, indicesService, threadPool, shardStateAction, mappingUpdatedActi indexScopedSettings, null), shardLimitValidator, - systemIndices); + EmptySystemIndices.INSTANCE); actions.put(PutMappingAction.INSTANCE, new TransportPutMappingAction(transportService, clusterService, threadPool, metadataMappingService, actionFilters, indexNameExpressionResolver, new RequestValidators<>(Collections.emptyList()), - systemIndices)); + EmptySystemIndices.INSTANCE)); actions.put(AutoPutMappingAction.INSTANCE, new TransportAutoPutMappingAction(transportService, clusterService, threadPool, metadataMappingService, - actionFilters, indexNameExpressionResolver, systemIndices)); + actionFilters, indexNameExpressionResolver, EmptySystemIndices.INSTANCE)); final ResponseCollectorService responseCollectorService = new ResponseCollectorService(clusterService); final SearchTransportService searchTransportService = new SearchTransportService(transportService, client, SearchExecutionStatsCollector.makeWrapper(responseCollectorService)); diff --git a/test/framework/src/main/java/org/elasticsearch/indices/EmptySystemIndices.java b/test/framework/src/main/java/org/elasticsearch/indices/EmptySystemIndices.java new file mode 100644 index 0000000000000..40520b22eba12 --- /dev/null +++ b/test/framework/src/main/java/org/elasticsearch/indices/EmptySystemIndices.java @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +package org.elasticsearch.indices; + +import java.util.Collections; + + +/** + * A test class which contains a singleton instance of the {@link SystemIndices} class that has been created with no + * non-standard system indices defined except for those defined within the class itself. + */ +public class EmptySystemIndices extends SystemIndices { + + public static final SystemIndices INSTANCE = new EmptySystemIndices(); + + private EmptySystemIndices() { + super(Collections.emptyMap()); + } +} diff --git a/test/framework/src/main/java/org/elasticsearch/indices/TestIndexNameExpressionResolver.java b/test/framework/src/main/java/org/elasticsearch/indices/TestIndexNameExpressionResolver.java new file mode 100644 index 0000000000000..4626d554e1880 --- /dev/null +++ b/test/framework/src/main/java/org/elasticsearch/indices/TestIndexNameExpressionResolver.java @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +package org.elasticsearch.indices; + +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.util.concurrent.ThreadContext; + +/** + * A utility class that simplifies the creation of {@link IndexNameExpressionResolver} instances in tests to avoid repetition of + * creating the constructor arguments for a default instance. + */ +public class TestIndexNameExpressionResolver { + + private TestIndexNameExpressionResolver() {} + + /** + * @return a new instance of a {@link IndexNameExpressionResolver} that has been created with a new {@link ThreadContext} and the + * default {@link SystemIndices} instance + */ + public static IndexNameExpressionResolver newInstance() { + return new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY), EmptySystemIndices.INSTANCE); + } + + /** + * @return a new instance of a {@link IndexNameExpressionResolver} that has been created with the provided {@link ThreadContext} and + * the default {@link SystemIndices} instance + */ + public static IndexNameExpressionResolver newInstance(ThreadContext threadContext) { + return new IndexNameExpressionResolver(threadContext, EmptySystemIndices.INSTANCE); + } + + /** + * @return a new instance of a {@link IndexNameExpressionResolver} that has been created with a new {@link ThreadContext} and + * the provided {@link SystemIndices} instance + */ + public static IndexNameExpressionResolver newInstance(SystemIndices systemIndices) { + return new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY), systemIndices); + } +} diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java index e4ea11d579dc9..bbc02fa255f63 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -492,7 +492,9 @@ protected final void assertWarnings(boolean stripXContentPosition, String... exp } try { final List actualWarnings = threadContext.getResponseHeaders().get("Warning"); - if (actualWarnings != null && enableJodaDeprecationWarningsCheck() == false) { + if ((expectedWarnings == null || expectedWarnings.length == 0)) { + assertNull("expected 0 warnings, actual: " + actualWarnings, actualWarnings); + } else if (actualWarnings != null && enableJodaDeprecationWarningsCheck() == false) { List filteredWarnings = filterJodaDeprecationWarnings(actualWarnings); assertWarnings(stripXContentPosition, filteredWarnings, expectedWarnings); } else { diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/GenerateSnapshotNameStep.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/GenerateSnapshotNameStep.java index 0a3bd45c49174..f3641af4f3c84 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/GenerateSnapshotNameStep.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/GenerateSnapshotNameStep.java @@ -13,6 +13,7 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.SystemIndexAccessLevel; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; @@ -134,7 +135,7 @@ public ResolverContext() { } public ResolverContext(long startTime) { - super(null, null, startTime, false, false, false, false, false); + super(null, null, startTime, false, false, false, false, SystemIndexAccessLevel.NONE); } @Override diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/common/validation/SourceDestValidatorTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/common/validation/SourceDestValidatorTests.java index 71aedca51a08a..2c21f6af4fc69 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/common/validation/SourceDestValidatorTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/common/validation/SourceDestValidatorTests.java @@ -23,7 +23,7 @@ import org.elasticsearch.common.CheckedConsumer; import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.IngestService; import org.elasticsearch.ingest.Pipeline; @@ -103,9 +103,11 @@ public class SourceDestValidatorTests extends ESTestCase { private final TransportService transportService = MockTransportService.createNewService(Settings.EMPTY, Version.CURRENT, threadPool); private final RemoteClusterService remoteClusterService = transportService.getRemoteClusterService(); private final IngestService ingestService = mock(IngestService.class); + private final IndexNameExpressionResolver indexNameExpressionResolver = + TestIndexNameExpressionResolver.newInstance(threadPool.getThreadContext()); private final SourceDestValidator simpleNonRemoteValidator = new SourceDestValidator( - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, null, ingestService, @@ -655,7 +657,7 @@ public void testRemoteSourceBasic() throws InterruptedException { Context context = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, remoteClusterLicenseCheckerBasic, ingestService, @@ -681,7 +683,7 @@ public void testRemoteSourcePlatinum() throws InterruptedException { final Context context = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, new RemoteClusterLicenseChecker(clientWithBasicLicense, operationMode -> XPackLicenseState.isAllowedByOperationMode(operationMode, License.OperationMode.PLATINUM)), @@ -713,7 +715,7 @@ public void testRemoteSourcePlatinum() throws InterruptedException { final Context context2 = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, new RemoteClusterLicenseChecker(clientWithPlatinumLicense, operationMode -> XPackLicenseState.isAllowedByOperationMode(operationMode, License.OperationMode.PLATINUM)), @@ -736,7 +738,7 @@ public void testRemoteSourcePlatinum() throws InterruptedException { final Context context3 = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, new RemoteClusterLicenseChecker(clientWithPlatinumLicense, operationMode -> XPackLicenseState.isAllowedByOperationMode(operationMode, License.OperationMode.PLATINUM)), @@ -760,7 +762,7 @@ public void testRemoteSourcePlatinum() throws InterruptedException { final Context context4 = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, new RemoteClusterLicenseChecker(clientWithTrialLicense, operationMode -> XPackLicenseState.isAllowedByOperationMode(operationMode, License.OperationMode.PLATINUM)), @@ -786,7 +788,7 @@ public void testRemoteSourceLicenseInActive() throws InterruptedException { final Context context = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, new RemoteClusterLicenseChecker(clientWithExpiredBasicLicense, operationMode -> XPackLicenseState.isAllowedByOperationMode(operationMode, License.OperationMode.PLATINUM)), @@ -815,7 +817,7 @@ public void testRemoteSourceDoesNotExist() throws InterruptedException { Context context = spy( new SourceDestValidator.Context( CLUSTER_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + indexNameExpressionResolver, remoteClusterService, new RemoteClusterLicenseChecker(clientWithExpiredBasicLicense, operationMode -> XPackLicenseState.isAllowedByOperationMode(operationMode, License.OperationMode.PLATINUM)), diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/deprecation/DeprecationInfoActionResponseTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/deprecation/DeprecationInfoActionResponseTests.java index fb807186008d5..d18de0663c121 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/deprecation/DeprecationInfoActionResponseTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/deprecation/DeprecationInfoActionResponseTests.java @@ -19,9 +19,9 @@ import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig; import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfigTests; @@ -87,7 +87,7 @@ public void testFrom() throws IOException { new TransportAddress(TransportAddress.META_ADDRESS, 9300), "test"); ClusterState state = ClusterState.builder(ClusterName.DEFAULT).metadata(metadata).build(); List datafeeds = Collections.singletonList(DatafeedConfigTests.createRandomizedDatafeedConfig("foo")); - IndexNameExpressionResolver resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); IndicesOptions indicesOptions = IndicesOptions.fromOptions(false, false, true, true); boolean clusterIssueFound = randomBoolean(); diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java index 65cfe3209b8d8..b52b901a325ff 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java @@ -28,7 +28,6 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.IndexTemplateMetadata; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; @@ -37,6 +36,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ml.inference.persistence.InferenceIndexConstants; @@ -286,7 +286,7 @@ public void testIndexNameComparator() { private void createIndexAndAliasIfNecessary(ClusterState clusterState) { MlIndexAndAlias.createIndexAndAliasIfNecessary( - client, clusterState, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + client, clusterState, TestIndexNameExpressionResolver.newInstance(), TEST_INDEX_PREFIX, TEST_INDEX_ALIAS, listener); } diff --git a/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/DeleteDataStreamTransportActionTests.java b/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/DeleteDataStreamTransportActionTests.java index ca2619a0a5869..de7d6193f1e69 100644 --- a/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/DeleteDataStreamTransportActionTests.java +++ b/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/DeleteDataStreamTransportActionTests.java @@ -17,9 +17,8 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.collect.Tuple; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.snapshots.Snapshot; import org.elasticsearch.snapshots.SnapshotId; import org.elasticsearch.snapshots.SnapshotInProgressException; @@ -41,7 +40,7 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase { - private final IndexNameExpressionResolver iner = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + private final IndexNameExpressionResolver iner = TestIndexNameExpressionResolver.newInstance(); public void testDeleteDataStream() { final String dataStreamName = "my-data-stream"; diff --git a/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/GetDataStreamsTransportActionTests.java b/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/GetDataStreamsTransportActionTests.java index 5ee9ede411d93..a67825dd65ddd 100644 --- a/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/GetDataStreamsTransportActionTests.java +++ b/x-pack/plugin/data-streams/src/test/java/org/elasticsearch/xpack/datastreams/action/GetDataStreamsTransportActionTests.java @@ -12,9 +12,8 @@ import org.elasticsearch.cluster.metadata.DataStream; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.collect.Tuple; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.IndexNotFoundException; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.action.GetDataStreamAction; @@ -28,6 +27,8 @@ public class GetDataStreamsTransportActionTests extends ESTestCase { + private final IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); + public void testGetDataStream() { final String dataStreamName = "my-data-stream"; ClusterState cs = getClusterStateWithDataStreams( @@ -35,11 +36,7 @@ public void testGetDataStream() { Collections.emptyList() ); GetDataStreamAction.Request req = new GetDataStreamAction.Request(new String[] { dataStreamName }); - List dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + List dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(1)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamName)); } @@ -52,40 +49,24 @@ public void testGetDataStreamsWithWildcards() { ); GetDataStreamAction.Request req = new GetDataStreamAction.Request(new String[] { dataStreamNames[1].substring(0, 5) + "*" }); - List dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + List dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(1)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1])); req = new GetDataStreamAction.Request(new String[] { "*" }); - dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(2)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1])); assertThat(dataStreams.get(1).getName(), equalTo(dataStreamNames[0])); req = new GetDataStreamAction.Request((String[]) null); - dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(2)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1])); assertThat(dataStreams.get(1).getName(), equalTo(dataStreamNames[0])); req = new GetDataStreamAction.Request(new String[] { "matches-none*" }); - dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(0)); } @@ -97,37 +78,25 @@ public void testGetDataStreamsWithoutWildcards() { ); GetDataStreamAction.Request req = new GetDataStreamAction.Request(new String[] { dataStreamNames[0], dataStreamNames[1] }); - List dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + List dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(2)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1])); assertThat(dataStreams.get(1).getName(), equalTo(dataStreamNames[0])); req = new GetDataStreamAction.Request(new String[] { dataStreamNames[1] }); - dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(1)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1])); req = new GetDataStreamAction.Request(new String[] { dataStreamNames[0] }); - dataStreams = GetDataStreamsTransportAction.getDataStreams( - cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - req - ); + dataStreams = GetDataStreamsTransportAction.getDataStreams(cs, resolver, req); assertThat(dataStreams.size(), equalTo(1)); assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[0])); GetDataStreamAction.Request req2 = new GetDataStreamAction.Request(new String[] { "foo" }); IndexNotFoundException e = expectThrows( IndexNotFoundException.class, - () -> GetDataStreamsTransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req2) + () -> GetDataStreamsTransportAction.getDataStreams(cs, resolver, req2) ); assertThat(e.getMessage(), containsString("no such index [foo]")); } @@ -138,7 +107,7 @@ public void testGetNonexistentDataStream() { GetDataStreamAction.Request req = new GetDataStreamAction.Request(new String[] { dataStreamName }); IndexNotFoundException e = expectThrows( IndexNotFoundException.class, - () -> GetDataStreamsTransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req) + () -> GetDataStreamsTransportAction.getDataStreams(cs, resolver, req) ); assertThat(e.getMessage(), containsString("no such index [" + dataStreamName + "]")); } diff --git a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/AbstractEnrichTestCase.java b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/AbstractEnrichTestCase.java index c7c1c7c0140b3..f472837405837 100644 --- a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/AbstractEnrichTestCase.java +++ b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/AbstractEnrichTestCase.java @@ -12,8 +12,7 @@ import org.elasticsearch.client.Client; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.service.ClusterService; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESSingleNodeTestCase; import org.elasticsearch.xpack.core.enrich.EnrichPolicy; @@ -35,7 +34,7 @@ protected AtomicReference saveEnrichPolicy(String name, EnrichPolicy if (policy != null) { createSourceIndices(policy); } - IndexNameExpressionResolver resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); CountDownLatch latch = new CountDownLatch(1); AtomicReference error = new AtomicReference<>(); EnrichStore.putPolicy(name, policy, clusterService, resolver, e -> { diff --git a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyExecutorTests.java b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyExecutorTests.java index 966c86aaa5575..8bb4d5eb48b0e 100644 --- a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyExecutorTests.java +++ b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyExecutorTests.java @@ -7,11 +7,6 @@ package org.elasticsearch.xpack.enrich; -import java.util.Collections; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.function.LongSupplier; - import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.LatchedActionListener; import org.elasticsearch.client.Client; @@ -19,7 +14,7 @@ import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.TestThreadPool; @@ -30,6 +25,11 @@ import org.junit.AfterClass; import org.junit.BeforeClass; +import java.util.Collections; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.function.LongSupplier; + import static org.hamcrest.CoreMatchers.containsString; public class EnrichPolicyExecutorTests extends ESTestCase { @@ -148,7 +148,7 @@ public void testNonConcurrentPolicyExecution() throws InterruptedException { null, testTaskManager, testThreadPool, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + TestIndexNameExpressionResolver.newInstance(testThreadPool.getThreadContext()), ESTestCase::randomNonNegativeLong ); @@ -211,7 +211,7 @@ public void testMaximumPolicyExecutionLimit() throws InterruptedException { null, testTaskManager, testThreadPool, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), + TestIndexNameExpressionResolver.newInstance(testThreadPool.getThreadContext()), ESTestCase::randomNonNegativeLong ); diff --git a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyMaintenanceServiceTests.java b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyMaintenanceServiceTests.java index b62408ebae205..9e74b16b3daa6 100644 --- a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyMaintenanceServiceTests.java +++ b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/EnrichPolicyMaintenanceServiceTests.java @@ -29,10 +29,10 @@ import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESSingleNodeTestCase; import org.elasticsearch.threadpool.ThreadPool; @@ -125,7 +125,7 @@ private EnrichPolicy randomPolicy() { } private void addPolicy(String policyName, EnrichPolicy policy) throws InterruptedException { - IndexNameExpressionResolver resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); createSourceIndices(client(), policy); doSyncronously( (clusterService, exceptionConsumer) -> EnrichStore.putPolicy(policyName, policy, clusterService, resolver, exceptionConsumer) diff --git a/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/Fleet.java b/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/Fleet.java index b28fd76abdd86..2650d6b8e3939 100644 --- a/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/Fleet.java +++ b/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/Fleet.java @@ -9,10 +9,13 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.indices.SystemIndexDescriptor; +import org.elasticsearch.indices.SystemIndexDescriptor.Type; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.SystemIndexPlugin; +import java.util.Arrays; import java.util.Collection; +import java.util.List; /** * A plugin to manage and provide access to the system indices used by Fleet. @@ -21,13 +24,15 @@ */ public class Fleet extends Plugin implements SystemIndexPlugin { + private static final List ALLOWED_PRODUCTS = Arrays.asList("kibana", "fleet-server"); + @Override public Collection getSystemIndexDescriptors(Settings settings) { return org.elasticsearch.common.collect.List.of( - new SystemIndexDescriptor(".fleet-servers*", "Configuration of fleet servers"), - new SystemIndexDescriptor(".fleet-policies*", "Policies and enrollment keys"), - new SystemIndexDescriptor(".fleet-agents*", "Agents and agent checkins"), - new SystemIndexDescriptor(".fleet-actions*", "Fleet actions") + new SystemIndexDescriptor(".fleet-servers*", "Configuration of fleet servers", Type.EXTERNAL_UNMANAGED, ALLOWED_PRODUCTS), + new SystemIndexDescriptor(".fleet-policies*", "Policies and enrollment keys", Type.EXTERNAL_UNMANAGED, ALLOWED_PRODUCTS), + new SystemIndexDescriptor(".fleet-agents*", "Agents and agent checkins", Type.EXTERNAL_UNMANAGED, ALLOWED_PRODUCTS), + new SystemIndexDescriptor(".fleet-actions*", "Fleet actions", Type.EXTERNAL_UNMANAGED, ALLOWED_PRODUCTS) ); } diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/ModelSnapshotRetentionIT.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/ModelSnapshotRetentionIT.java index 74281712795aa..5b98849ece97a 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/ModelSnapshotRetentionIT.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/ModelSnapshotRetentionIT.java @@ -20,15 +20,13 @@ import org.elasticsearch.action.support.PlainActionFuture; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.xpack.core.ml.action.PutJobAction; @@ -70,8 +68,7 @@ public class ModelSnapshotRetentionIT extends MlNativeAutodetectIntegTestCase { @Before public void addMlState() { PlainActionFuture future = new PlainActionFuture<>(); - createStateIndexAndAliasIfNecessary(client(), ClusterState.EMPTY_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), future); + createStateIndexAndAliasIfNecessary(client(), ClusterState.EMPTY_STATE, TestIndexNameExpressionResolver.newInstance(), future); future.actionGet(); } diff --git a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/AutodetectResultProcessorIT.java b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/AutodetectResultProcessorIT.java index ff4139eef284a..26549eb824ac1 100644 --- a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/AutodetectResultProcessorIT.java +++ b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/AutodetectResultProcessorIT.java @@ -14,7 +14,6 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.client.OriginSettingClient; import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.routing.OperationRouting; import org.elasticsearch.cluster.routing.UnassignedInfo; import org.elasticsearch.cluster.routing.allocation.decider.AwarenessAllocationDecider; @@ -26,10 +25,10 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.reindex.ReindexPlugin; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.ingest.common.IngestCommonPlugin; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.SearchHit; @@ -143,8 +142,7 @@ public void createComponents() throws Exception { Settings.Builder builder = Settings.builder() .put(UnassignedInfo.INDEX_DELAYED_NODE_LEFT_TIMEOUT_SETTING.getKey(), TimeValue.timeValueSeconds(1)); AnomalyDetectionAuditor auditor = new AnomalyDetectionAuditor(client(), getInstanceFromNode(ClusterService.class)); - jobResultsProvider = new JobResultsProvider(client(), builder.build(), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + jobResultsProvider = new JobResultsProvider(client(), builder.build(), TestIndexNameExpressionResolver.newInstance()); renormalizer = mock(Renormalizer.class); process = mock(AutodetectProcess.class); capturedUpdateModelSnapshotOnJobRequests = new ArrayList<>(); @@ -184,8 +182,7 @@ protected void updateModelSnapshotOnJob(ModelSnapshot modelSnapshot) { // A a result they must create the index as part of the test setup. Do not // copy this setup to tests that run jobs in the way they are run in production. PlainActionFuture future = new PlainActionFuture<>(); - createStateIndexAndAliasIfNecessary(client(), ClusterState.EMPTY_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), future); + createStateIndexAndAliasIfNecessary(client(), ClusterState.EMPTY_STATE, TestIndexNameExpressionResolver.newInstance(), future); future.get(); } diff --git a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/EstablishedMemUsageIT.java b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/EstablishedMemUsageIT.java index f0f179388b0b8..a750a5958f119 100644 --- a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/EstablishedMemUsageIT.java +++ b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/EstablishedMemUsageIT.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.ml.integration; import org.elasticsearch.client.OriginSettingClient; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.routing.OperationRouting; import org.elasticsearch.cluster.routing.allocation.decider.AwarenessAllocationDecider; import org.elasticsearch.cluster.service.ClusterApplierService; @@ -15,7 +14,7 @@ import org.elasticsearch.cluster.service.MasterService; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ClientHelper; import org.elasticsearch.xpack.core.ml.action.PutJobAction; @@ -24,8 +23,8 @@ import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSizeStats; import org.elasticsearch.xpack.core.ml.job.results.Bucket; import org.elasticsearch.xpack.ml.inference.ingest.InferenceProcessor; -import org.elasticsearch.xpack.ml.job.persistence.JobResultsProvider; import org.elasticsearch.xpack.ml.job.persistence.JobResultsPersister; +import org.elasticsearch.xpack.ml.job.persistence.JobResultsProvider; import org.elasticsearch.xpack.ml.notifications.AnomalyDetectionAuditor; import org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase; import org.elasticsearch.xpack.ml.utils.persistence.ResultsPersisterService; @@ -62,7 +61,7 @@ public void createComponents() { OriginSettingClient originSettingClient = new OriginSettingClient(client(), ClientHelper.ML_ORIGIN); ResultsPersisterService resultsPersisterService = new ResultsPersisterService(tp, originSettingClient, clusterService, settings); - jobResultsProvider = new JobResultsProvider(client(), settings, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + jobResultsProvider = new JobResultsProvider(client(), settings, TestIndexNameExpressionResolver.newInstance()); jobResultsPersister = new JobResultsPersister( originSettingClient, resultsPersisterService, new AnomalyDetectionAuditor(client(), clusterService)); } diff --git a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java index 67fe2edce8e7a..ad6578e67a28d 100644 --- a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java +++ b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java @@ -22,7 +22,6 @@ import org.elasticsearch.client.OriginSettingClient; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.routing.OperationRouting; import org.elasticsearch.cluster.routing.UnassignedInfo; @@ -35,12 +34,12 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ClientHelper; import org.elasticsearch.xpack.core.action.util.PageParams; @@ -116,7 +115,7 @@ public class JobResultsProviderIT extends MlSingleNodeTestCase { public void createComponents() throws Exception { Settings.Builder builder = Settings.builder() .put(UnassignedInfo.INDEX_DELAYED_NODE_LEFT_TIMEOUT_SETTING.getKey(), TimeValue.timeValueSeconds(1)); - jobProvider = new JobResultsProvider(client(), builder.build(), new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + jobProvider = new JobResultsProvider(client(), builder.build(), TestIndexNameExpressionResolver.newInstance()); ThreadPool tp = mockThreadPool(); ClusterSettings clusterSettings = new ClusterSettings(builder.build(), new HashSet<>(Arrays.asList(InferenceProcessor.MAX_INFERENCE_PROCESSORS, @@ -955,8 +954,7 @@ private void indexModelSnapshot(ModelSnapshot snapshot) { private void indexQuantiles(Quantiles quantiles) { PlainActionFuture future = new PlainActionFuture<>(); - createStateIndexAndAliasIfNecessary(client(), ClusterState.EMPTY_STATE, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), future); + createStateIndexAndAliasIfNecessary(client(), ClusterState.EMPTY_STATE, TestIndexNameExpressionResolver.newInstance(), future); future.actionGet(); JobResultsPersister persister = new JobResultsPersister(new OriginSettingClient(client(), ClientHelper.ML_ORIGIN), resultsPersisterService, auditor); diff --git a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobStorageDeletionTaskIT.java b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobStorageDeletionTaskIT.java index 8418c943ae710..fc32a3ad46002 100644 --- a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobStorageDeletionTaskIT.java +++ b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/JobStorageDeletionTaskIT.java @@ -10,7 +10,6 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.OriginSettingClient; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.routing.OperationRouting; import org.elasticsearch.cluster.routing.allocation.decider.AwarenessAllocationDecider; import org.elasticsearch.cluster.service.ClusterApplierService; @@ -19,8 +18,8 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ClientHelper; @@ -76,7 +75,7 @@ public void createComponents() { ClusterService clusterService = new ClusterService(settings, clusterSettings, tp); OriginSettingClient originSettingClient = new OriginSettingClient(client(), ClientHelper.ML_ORIGIN); ResultsPersisterService resultsPersisterService = new ResultsPersisterService(tp, originSettingClient, clusterService, settings); - jobResultsProvider = new JobResultsProvider(client(), settings, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + jobResultsProvider = new JobResultsProvider(client(), settings, TestIndexNameExpressionResolver.newInstance()); jobResultsPersister = new JobResultsPersister( originSettingClient, resultsPersisterService, new AnomalyDetectionAuditor(client(), clusterService)); } diff --git a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/MlConfigMigratorIT.java b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/MlConfigMigratorIT.java index e6c9326ed06d4..c051dc946d80c 100644 --- a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/MlConfigMigratorIT.java +++ b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/MlConfigMigratorIT.java @@ -30,7 +30,6 @@ import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; @@ -38,6 +37,7 @@ import org.elasticsearch.index.Index; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.xpack.core.ml.MlConfigIndex; import org.elasticsearch.xpack.core.ml.MlMetadata; import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig; @@ -76,7 +76,7 @@ public class MlConfigMigratorIT extends MlSingleNodeTestCase { - private final IndexNameExpressionResolver expressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + private final IndexNameExpressionResolver expressionResolver = TestIndexNameExpressionResolver.newInstance(); private ClusterService clusterService; @Before diff --git a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/UnusedStatsRemoverIT.java b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/UnusedStatsRemoverIT.java index 01fa9c3bdde7c..7af6c3377ab23 100644 --- a/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/UnusedStatsRemoverIT.java +++ b/x-pack/plugin/ml/src/internalClusterTest/java/org/elasticsearch/xpack/ml/integration/UnusedStatsRemoverIT.java @@ -10,13 +10,13 @@ import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.support.PlainActionFuture; import org.elasticsearch.client.OriginSettingClient; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.tasks.TaskId; import org.elasticsearch.xpack.core.ClientHelper; import org.elasticsearch.xpack.core.ml.MlStatsIndex; @@ -55,7 +55,7 @@ public void createComponents() { client = new OriginSettingClient(client(), ClientHelper.ML_ORIGIN); PlainActionFuture future = new PlainActionFuture<>(); MlStatsIndex.createStatsIndexAndAliasIfNecessary(client(), clusterService().state(), - new IndexNameExpressionResolver(client.threadPool().getThreadContext()), future); + TestIndexNameExpressionResolver.newInstance(client().threadPool().getThreadContext()), future); future.actionGet(); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportStartDataFrameAnalyticsActionTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportStartDataFrameAnalyticsActionTests.java index d1eae12868230..02fc120058cba 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportStartDataFrameAnalyticsActionTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportStartDataFrameAnalyticsActionTests.java @@ -10,7 +10,6 @@ import org.elasticsearch.client.Client; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; @@ -18,8 +17,8 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.util.set.Sets; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.persistent.PersistentTasksCustomMetadata.Assignment; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.ml.MlMetadata; @@ -166,7 +165,7 @@ private static TaskExecutor createTaskExecutor() { mock(DataFrameAnalyticsManager.class), mock(DataFrameAnalyticsAuditor.class), mock(MlMemoryTracker.class), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + TestIndexNameExpressionResolver.newInstance()); } private static DiscoveryNode createNode(int i, boolean isMlNode, Version nodeVersion) { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedNodeSelectorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedNodeSelectorTests.java index 8622521296b16..8a8962faf290b 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedNodeSelectorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedNodeSelectorTests.java @@ -26,11 +26,10 @@ import org.elasticsearch.cluster.routing.TestShardRouting; import org.elasticsearch.cluster.routing.UnassignedInfo; import org.elasticsearch.common.collect.Tuple; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.persistent.PersistentTasksCustomMetadata; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.ml.MlMetadata; @@ -67,7 +66,7 @@ public class DatafeedNodeSelectorTests extends ESTestCase { @Before public void init() { - resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + resolver = TestIndexNameExpressionResolver.newInstance(); nodes = DiscoveryNodes.builder() .add(new DiscoveryNode("node_name", "node_id", new TransportAddress(InetAddress.getLoopbackAddress(), 9300), Collections.emptyMap(), Collections.emptySet(), Version.CURRENT)) diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/TrainedModelStatsServiceTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/TrainedModelStatsServiceTests.java index 58e1baae55e6b..f163f8a6ecd14 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/TrainedModelStatsServiceTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/TrainedModelStatsServiceTests.java @@ -25,9 +25,9 @@ import org.elasticsearch.cluster.routing.UnassignedInfo; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ml.MlMetadata; @@ -49,7 +49,7 @@ public class TrainedModelStatsServiceTests extends ESTestCase { public void testVerifyIndicesExistAndPrimaryShardsAreActive() { String aliasName = MlStatsIndex.writeAlias(); String concreteIndex = ".ml-stats-000001"; - IndexNameExpressionResolver resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); { Metadata.Builder metadata = Metadata.builder(); @@ -138,7 +138,7 @@ public void testVerifyIndicesExistAndPrimaryShardsAreActive() { public void testUpdateStatsUpgradeMode() { String aliasName = MlStatsIndex.writeAlias(); String concreteIndex = ".ml-stats-000001"; - IndexNameExpressionResolver resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); // create a valid index routing so persistence will occur RoutingTable.Builder routingTableBuilder = RoutingTable.builder(); diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java index f71c2d872a61f..b2cfdaee2cbb0 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java @@ -21,7 +21,6 @@ import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.document.DocumentField; @@ -33,6 +32,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.test.ESTestCase; @@ -884,7 +884,7 @@ public void testCreateTermFieldsMapping() throws IOException { } private JobResultsProvider createProvider(Client client) { - return new JobResultsProvider(client, Settings.EMPTY, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + return new JobResultsProvider(client, Settings.EMPTY, TestIndexNameExpressionResolver.newInstance()); } private static SearchResponse createSearchResponse(List> source) throws IOException { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/AutodetectProcessManagerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/AutodetectProcessManagerTests.java index 137c9f547f762..27899fe6eeb16 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/AutodetectProcessManagerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/AutodetectProcessManagerTests.java @@ -13,7 +13,6 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.cluster.service.ClusterService; @@ -29,6 +28,7 @@ import org.elasticsearch.env.Environment; import org.elasticsearch.env.TestEnvironment; import org.elasticsearch.index.analysis.AnalysisRegistry; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ml.annotations.AnnotationIndex; @@ -727,7 +727,7 @@ private AutodetectProcessManager createManager(Settings settings) { return new AutodetectProcessManager(settings, client, threadPool, new NamedXContentRegistry(Collections.emptyList()), auditor, clusterService, jobManager, jobResultsProvider, jobResultsPersister, jobDataCountsPersister, annotationPersister, autodetectFactory, normalizerFactory, nativeStorageProvider, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + TestIndexNameExpressionResolver.newInstance()); } private AutodetectProcessManager createSpyManagerAndCallProcessData(String jobId) { AutodetectProcessManager manager = createSpyManager(); diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/task/OpenJobPersistentTasksExecutorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/task/OpenJobPersistentTasksExecutorTests.java index a0fc40b7a2bf4..54f9b6cfde13d 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/task/OpenJobPersistentTasksExecutorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/task/OpenJobPersistentTasksExecutorTests.java @@ -15,7 +15,6 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.routing.IndexRoutingTable; import org.elasticsearch.cluster.routing.IndexShardRoutingTable; @@ -31,9 +30,9 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.EsExecutors; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.persistent.PersistentTasksCustomMetadata; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.test.ESTestCase; @@ -249,6 +248,6 @@ public static Job jobWithRules(String jobId) { private OpenJobPersistentTasksExecutor createExecutor(Settings settings) { return new OpenJobPersistentTasksExecutor( settings, clusterService, autodetectProcessManager, datafeedConfigProvider, mlMemoryTracker, client, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + TestIndexNameExpressionResolver.newInstance()); } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/task/AbstractJobPersistentTasksExecutorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/task/AbstractJobPersistentTasksExecutorTests.java index 7e51292376959..dfecf00676514 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/task/AbstractJobPersistentTasksExecutorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/task/AbstractJobPersistentTasksExecutorTests.java @@ -22,9 +22,9 @@ import org.elasticsearch.cluster.routing.ShardRouting; import org.elasticsearch.cluster.routing.UnassignedInfo; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.ml.MlConfigIndex; import org.elasticsearch.xpack.core.ml.MlMetaIndex; @@ -40,7 +40,7 @@ public class AbstractJobPersistentTasksExecutorTests extends ESTestCase { public void testVerifyIndicesPrimaryShardsAreActive() { - final IndexNameExpressionResolver resolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + final IndexNameExpressionResolver resolver = TestIndexNameExpressionResolver.newInstance(); Metadata.Builder metadata = Metadata.builder(); RoutingTable.Builder routingTable = RoutingTable.builder(); addIndices(metadata, routingTable); @@ -57,8 +57,7 @@ public void testVerifyIndicesPrimaryShardsAreActive() { metadata = new Metadata.Builder(cs.metadata()); routingTable = new RoutingTable.Builder(cs.routingTable()); - IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); - String indexToRemove = randomFrom(indexNameExpressionResolver.concreteIndexNames(cs, IndicesOptions.lenientExpandOpen(), + String indexToRemove = randomFrom(resolver.concreteIndexNames(cs, IndicesOptions.lenientExpandOpen(), ".ml-anomalies-shared", AnomalyDetectorsIndex.jobStateIndexPattern(), MlMetaIndex.indexName(), diff --git a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsCollectorTests.java b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsCollectorTests.java index cdc160c530e12..fe149d1240611 100644 --- a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsCollectorTests.java +++ b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsCollectorTests.java @@ -22,9 +22,9 @@ import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNotFoundException; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.license.License; import org.elasticsearch.license.LicenseService; import org.elasticsearch.protocol.xpack.XPackUsageRequest; @@ -72,7 +72,7 @@ public void setUp() throws Exception { public void testShouldCollectReturnsFalseIfNotMaster() { final ClusterStatsCollector collector = new ClusterStatsCollector(Settings.EMPTY, clusterService, licenseState, client, licenseService, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + TestIndexNameExpressionResolver.newInstance()); assertThat(collector.shouldCollect(false), is(false)); } @@ -80,7 +80,7 @@ public void testShouldCollectReturnsFalseIfNotMaster() { public void testShouldCollectReturnsTrue() { final ClusterStatsCollector collector = new ClusterStatsCollector(Settings.EMPTY, clusterService, licenseState, client, licenseService, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + TestIndexNameExpressionResolver.newInstance()); assertThat(collector.shouldCollect(true), is(true)); } diff --git a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DateMathExpressionIntegTests.java b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DateMathExpressionIntegTests.java index ac532b09b5ea8..ea899b14b3680 100644 --- a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DateMathExpressionIntegTests.java +++ b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DateMathExpressionIntegTests.java @@ -17,11 +17,9 @@ import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.settings.SecureString; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.SecurityIntegTestCase; import org.elasticsearch.test.SecuritySettingsSourceField; @@ -63,8 +61,7 @@ protected String configRoles() { public void testDateMathExpressionsCanBeAuthorized() throws Exception { final String expression = ""; - final String expectedIndexName = - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)).resolveDateMathExpression(expression); + final String expectedIndexName = TestIndexNameExpressionResolver.newInstance().resolveDateMathExpression(expression); final boolean refeshOnOperation = randomBoolean(); Client client = client().filterWithHeader(Collections.singletonMap("Authorization", basicAuthHeaderValue("user1", USERS_PASSWD))); diff --git a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/SecurityTests.java b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/SecurityTests.java index 915e126a71620..72beec28488ad 100644 --- a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/SecurityTests.java +++ b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/SecurityTests.java @@ -12,7 +12,6 @@ import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; @@ -26,6 +25,7 @@ import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.env.Environment; import org.elasticsearch.env.TestEnvironment; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.license.License; import org.elasticsearch.license.TestUtils; import org.elasticsearch.license.XPackLicenseState; @@ -128,7 +128,7 @@ protected SSLService getSslService() { when(client.threadPool()).thenReturn(threadPool); when(client.settings()).thenReturn(settings); return security.createComponents(client, threadPool, clusterService, mock(ResourceWatcherService.class), mock(ScriptService.class), - xContentRegistry(), env, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + xContentRegistry(), env, TestIndexNameExpressionResolver.newInstance(threadContext)); } private Collection createComponentsWithSecurityNotExplicitlyEnabled(Settings testSettings, SecurityExtension... extensions) diff --git a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/AuthorizationServiceTests.java b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/AuthorizationServiceTests.java index 548bee8bdd85f..a5ce22c1c57c3 100644 --- a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/AuthorizationServiceTests.java +++ b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/AuthorizationServiceTests.java @@ -81,7 +81,6 @@ import org.elasticsearch.cluster.metadata.AliasMetadata; import org.elasticsearch.cluster.metadata.IndexAbstraction; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.service.ClusterService; @@ -99,6 +98,7 @@ import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.license.XPackLicenseState; import org.elasticsearch.license.XPackLicenseState.Feature; import org.elasticsearch.script.ScriptService; @@ -283,8 +283,7 @@ public void setup() { operatorPrivilegesService = mock(OperatorPrivileges.OperatorPrivilegesService.class); authorizationService = new AuthorizationService(settings, rolesStore, clusterService, auditTrailService, new DefaultAuthenticationFailureHandler(Collections.emptyMap()), threadPool, new AnonymousUser(settings), - null, Collections.emptySet(), licenseState, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), - operatorPrivilegesService); + null, Collections.emptySet(), licenseState, TestIndexNameExpressionResolver.newInstance(), operatorPrivilegesService); } private void authorize(Authentication authentication, String action, TransportRequest request) { @@ -1044,8 +1043,7 @@ public void testDenialForAnonymousUser() throws IOException { final AnonymousUser anonymousUser = new AnonymousUser(settings); authorizationService = new AuthorizationService(settings, rolesStore, clusterService, auditTrailService, new DefaultAuthenticationFailureHandler(Collections.emptyMap()), threadPool, anonymousUser, null, Collections.emptySet(), - new XPackLicenseState(settings, () -> 0), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), operatorPrivilegesService); + new XPackLicenseState(settings, () -> 0), TestIndexNameExpressionResolver.newInstance(), operatorPrivilegesService); RoleDescriptor role = new RoleDescriptor("a_all", null, new IndicesPrivileges[]{IndicesPrivileges.builder().indices("a").privileges("all").build()}, null); @@ -1073,8 +1071,8 @@ public void testDenialForAnonymousUserAuthorizationExceptionDisabled() throws IO final Authentication authentication = createAuthentication(new AnonymousUser(settings)); authorizationService = new AuthorizationService(settings, rolesStore, clusterService, auditTrailService, new DefaultAuthenticationFailureHandler(Collections.emptyMap()), threadPool, new AnonymousUser(settings), null, - Collections.emptySet(), new XPackLicenseState(settings, () -> 0), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), operatorPrivilegesService); + Collections.emptySet(), new XPackLicenseState(settings, () -> 0), TestIndexNameExpressionResolver.newInstance(), + operatorPrivilegesService); RoleDescriptor role = new RoleDescriptor("a_all", null, new IndicesPrivileges[]{IndicesPrivileges.builder().indices("a").privileges("all").build()}, null); @@ -1818,7 +1816,7 @@ public void getUserPrivileges(Authentication authentication, AuthorizationInfo a authorizationService = new AuthorizationService(Settings.EMPTY, rolesStore, clusterService, auditTrailService, new DefaultAuthenticationFailureHandler(Collections.emptyMap()), threadPool, new AnonymousUser(Settings.EMPTY), engine, Collections.emptySet(), licenseState, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), operatorPrivilegesService); + TestIndexNameExpressionResolver.newInstance(), operatorPrivilegesService); Authentication authentication; try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { authentication = createAuthentication(new User("test user", "a_all")); diff --git a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/IndicesAndAliasesResolverTests.java b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/IndicesAndAliasesResolverTests.java index 69c5e99c3fc8e..a4f95fb26a97d 100644 --- a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/IndicesAndAliasesResolverTests.java +++ b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/IndicesAndAliasesResolverTests.java @@ -49,9 +49,9 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.time.DateFormatter; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNotFoundException; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.protocol.xpack.graph.GraphExploreRequest; import org.elasticsearch.search.internal.ShardSearchRequest; import org.elasticsearch.test.ESTestCase; @@ -132,7 +132,7 @@ public void setup() { .put("cluster.remote.other_remote.seeds", "127.0.0.1:" + randomIntBetween(9351, 9399)) .build(); - indexNameExpressionResolver = new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)); + indexNameExpressionResolver = TestIndexNameExpressionResolver.newInstance(); DateFormatter dateFormatter = DateFormatter.forPattern("uuuu.MM.dd"); Instant now = Instant.now(Clock.systemUTC()); @@ -287,7 +287,7 @@ public void setup() { ClusterService clusterService = mock(ClusterService.class); when(clusterService.getClusterSettings()).thenReturn(new ClusterSettings(settings, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS)); defaultIndicesResolver = - new IndicesAndAliasesResolver(settings, clusterService, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))); + new IndicesAndAliasesResolver(settings, clusterService, indexNameExpressionResolver); } public void testDashIndicesAreAllowedInShardLevelRequests() { diff --git a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/TransformPersistentTasksExecutorTests.java b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/TransformPersistentTasksExecutorTests.java index b054ddebf00e5..ece792e009c4a 100644 --- a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/TransformPersistentTasksExecutorTests.java +++ b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/TransformPersistentTasksExecutorTests.java @@ -12,7 +12,6 @@ import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetadata; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodeRole; @@ -26,9 +25,9 @@ import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.index.Index; import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.persistent.PersistentTasksCustomMetadata; import org.elasticsearch.persistent.PersistentTasksCustomMetadata.Assignment; import org.elasticsearch.test.ESTestCase; @@ -252,7 +251,7 @@ public void testDoNotSelectOldNodes() { mock(ThreadPool.class), clusterService, Settings.EMPTY, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) + TestIndexNameExpressionResolver.newInstance() ); // old-data-node-1 prevents assignment @@ -297,8 +296,7 @@ public void testVerifyIndicesPrimaryShardsAreActive() { ClusterState cs = csBuilder.build(); assertEquals(0, - TransformPersistentTasksExecutor.verifyIndicesPrimaryShardsAreActive(cs, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))).size()); + TransformPersistentTasksExecutor.verifyIndicesPrimaryShardsAreActive(cs, TestIndexNameExpressionResolver.newInstance()).size()); metadata = new Metadata.Builder(cs.metadata()); routingTable = new RoutingTable.Builder(cs.routingTable()); @@ -325,7 +323,7 @@ public void testVerifyIndicesPrimaryShardsAreActive() { csBuilder.metadata(metadata); List result = TransformPersistentTasksExecutor.verifyIndicesPrimaryShardsAreActive( csBuilder.build(), - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) + TestIndexNameExpressionResolver.newInstance() ); assertEquals(1, result.size()); assertEquals(indexToRemove, result.get(0)); @@ -513,7 +511,7 @@ public TransformPersistentTasksExecutor buildTaskExecutor() { mock(ThreadPool.class), clusterService, Settings.EMPTY, - new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)) + TestIndexNameExpressionResolver.newInstance() ); } } diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherPluginTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherPluginTests.java index 6b8cde1020b25..db2fe62845763 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherPluginTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherPluginTests.java @@ -6,15 +6,14 @@ */ package org.elasticsearch.xpack.watcher; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.env.TestEnvironment; import org.elasticsearch.index.IndexModule; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.analysis.AnalysisRegistry; import org.elasticsearch.index.engine.InternalEngineFactory; +import org.elasticsearch.indices.TestIndexNameExpressionResolver; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.IndexSettingsModule; import org.elasticsearch.threadpool.ExecutorBuilder; @@ -53,7 +52,7 @@ public void testWatcherDisabledTests() throws Exception { AnalysisRegistry registry = new AnalysisRegistry(TestEnvironment.newEnvironment(settings), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap()); IndexModule indexModule = new IndexModule(indexSettings, registry, new InternalEngineFactory(), Collections.emptyMap(), - () -> true, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), Collections.emptyMap()); + () -> true, TestIndexNameExpressionResolver.newInstance(), Collections.emptyMap()); // this will trip an assertion if the watcher indexing operation listener is null (which it is) but we try to add it watcher.onIndexModule(indexModule); From 24d651b7a515e7c4ced18db3acbf2a2a8c5347ed Mon Sep 17 00:00:00 2001 From: jaymode Date: Mon, 1 Mar 2021 14:01:20 -0700 Subject: [PATCH 2/2] fix mapping --- .../elasticsearch/http/SystemIndexRestIT.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java b/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java index 2583f7bcaa47d..11d2f05a22d5d 100644 --- a/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java +++ b/qa/smoke-test-http/src/test/java/org/elasticsearch/http/SystemIndexRestIT.java @@ -43,6 +43,7 @@ import java.util.function.Supplier; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; +import static org.elasticsearch.index.mapper.MapperService.SINGLE_MAPPING_NAME; import static org.elasticsearch.test.rest.ESRestTestCase.entityAsMap; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasKey; @@ -142,15 +143,19 @@ public Collection getSystemIndexDescriptors(Settings sett try (XContentBuilder builder = jsonBuilder()) { builder.startObject(); { - builder.startObject("_meta"); - builder.field("version", Version.CURRENT.toString()); - builder.endObject(); - - builder.field("dynamic", "strict"); - builder.startObject("properties"); + builder.startObject(SINGLE_MAPPING_NAME); { - builder.startObject("some_field"); - builder.field("type", "keyword"); + builder.startObject("_meta"); + builder.field("version", Version.CURRENT.toString()); + builder.endObject(); + + builder.field("dynamic", "strict"); + builder.startObject("properties"); + { + builder.startObject("some_field"); + builder.field("type", "keyword"); + builder.endObject(); + } builder.endObject(); } builder.endObject();