diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java index 0801bc404bccb..29ebab3401451 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustachePlugin.java @@ -56,8 +56,8 @@ public List getRestHandlers( ) { Settings settings = restHandlersServices.settings(); return Arrays.asList( - new RestSearchTemplateAction(clusterSupportsFeature, settings), - new RestMultiSearchTemplateAction(settings), + new RestSearchTemplateAction(clusterSupportsFeature, restHandlersServices.crossProjectModeDecider()), + new RestMultiSearchTemplateAction(settings, restHandlersServices.crossProjectModeDecider()), new RestRenderSearchTemplateAction() ); } diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestMultiSearchTemplateAction.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestMultiSearchTemplateAction.java index 8c480df47ad09..ec4bc76ae4496 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestMultiSearchTemplateAction.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestMultiSearchTemplateAction.java @@ -40,9 +40,9 @@ public class RestMultiSearchTemplateAction extends BaseRestHandler { private final boolean allowExplicitIndex; private final CrossProjectModeDecider crossProjectModeDecider; - public RestMultiSearchTemplateAction(Settings settings) { + public RestMultiSearchTemplateAction(Settings settings, CrossProjectModeDecider crossProjectModeDecider) { this.allowExplicitIndex = MULTI_ALLOW_EXPLICIT_INDEX.get(settings); - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java index 0b4e6069c7acf..5f0cefea690f0 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java @@ -11,7 +11,6 @@ import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.client.internal.node.NodeClient; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.features.NodeFeature; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; @@ -41,9 +40,9 @@ public class RestSearchTemplateAction extends BaseRestHandler { private final Predicate clusterSupportsFeature; private final CrossProjectModeDecider crossProjectModeDecider; - public RestSearchTemplateAction(Predicate clusterSupportsFeature, Settings settings) { + public RestSearchTemplateAction(Predicate clusterSupportsFeature, CrossProjectModeDecider crossProjectModeDecider) { this.clusterSupportsFeature = clusterSupportsFeature; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequestTests.java b/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequestTests.java index 183989785bf55..3a204e5cf4813 100644 --- a/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequestTests.java +++ b/modules/lang-mustache/src/test/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequestTests.java @@ -15,6 +15,7 @@ import org.elasticsearch.rest.RestRequest; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.StreamsUtils; import org.elasticsearch.test.rest.FakeRestRequest; @@ -36,7 +37,10 @@ public void testParseRequest() throws Exception { RestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry()).withContent(new BytesArray(data), XContentType.JSON) .build(); - MultiSearchTemplateRequest request = new RestMultiSearchTemplateAction(Settings.EMPTY).parseRequest(restRequest, true); + MultiSearchTemplateRequest request = new RestMultiSearchTemplateAction(Settings.EMPTY, CrossProjectModeDecider.NOOP).parseRequest( + restRequest, + true + ); assertThat(request.requests().size(), equalTo(3)); assertThat(request.requests().get(0).getRequest().indices()[0], equalTo("test0")); @@ -74,7 +78,10 @@ public void testParseWithCarriageReturn() throws Exception { RestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry()).withContent(new BytesArray(content), XContentType.JSON) .build(); - MultiSearchTemplateRequest request = new RestMultiSearchTemplateAction(Settings.EMPTY).parseRequest(restRequest, true); + MultiSearchTemplateRequest request = new RestMultiSearchTemplateAction(Settings.EMPTY, CrossProjectModeDecider.NOOP).parseRequest( + restRequest, + true + ); assertThat(request.requests().size(), equalTo(1)); assertThat(request.requests().get(0).getRequest().indices()[0], equalTo("test0")); @@ -126,7 +133,10 @@ public void testMultiSearchTemplateToJson() throws Exception { // Deserialize the request RestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry()).withContent(new BytesArray(serialized), XContentType.JSON) .build(); - MultiSearchTemplateRequest deser = new RestMultiSearchTemplateAction(Settings.EMPTY).parseRequest(restRequest, true); + MultiSearchTemplateRequest deser = new RestMultiSearchTemplateAction(Settings.EMPTY, CrossProjectModeDecider.NOOP).parseRequest( + restRequest, + true + ); // For object equality purposes need to set the search requests' source to non-null for (SearchTemplateRequest str : deser.requests()) { diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java index b9a18774d1dbf..a580c9a642ffa 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessPlugin.java @@ -170,7 +170,7 @@ public List getRestHandlers( Predicate clusterSupportsFeature ) { List handlers = new ArrayList<>(); - handlers.add(new PainlessExecuteAction.RestAction(restHandlersServices.settings())); + handlers.add(new PainlessExecuteAction.RestAction(restHandlersServices.crossProjectModeDecider())); handlers.add(new PainlessContextAction.RestAction()); return handlers; } diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessExecuteAction.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessExecuteAction.java index 347759615b2b7..4215108944428 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessExecuteAction.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessExecuteAction.java @@ -47,7 +47,6 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.network.NetworkAddress; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.XContentHelper; @@ -896,8 +895,8 @@ private static Response prepareRamIndex( public static class RestAction extends BaseRestHandler { private final CrossProjectModeDecider crossProjectModeDecider; - public RestAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/modules/reindex/src/main/java/org/elasticsearch/reindex/ReindexPlugin.java b/modules/reindex/src/main/java/org/elasticsearch/reindex/ReindexPlugin.java index f5aaeaecb7a4e..e070394f91e62 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/reindex/ReindexPlugin.java +++ b/modules/reindex/src/main/java/org/elasticsearch/reindex/ReindexPlugin.java @@ -95,7 +95,7 @@ public List getRestHandlers( ) { Settings settings = restHandlersServices.settings(); return Arrays.asList( - new RestReindexAction(clusterSupportsFeature, settings), + new RestReindexAction(clusterSupportsFeature, restHandlersServices.crossProjectModeDecider()), new RestUpdateByQueryAction(clusterSupportsFeature), new RestDeleteByQueryAction(clusterSupportsFeature), new RestUpdateAndDeleteByQueryRethrottleAction(nodesInCluster), diff --git a/modules/reindex/src/main/java/org/elasticsearch/reindex/RestReindexAction.java b/modules/reindex/src/main/java/org/elasticsearch/reindex/RestReindexAction.java index ba5d4a1814392..93b95816885f8 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/reindex/RestReindexAction.java +++ b/modules/reindex/src/main/java/org/elasticsearch/reindex/RestReindexAction.java @@ -13,7 +13,6 @@ import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.internal.node.NodeClient; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.features.NodeFeature; import org.elasticsearch.index.reindex.ReindexAction; import org.elasticsearch.index.reindex.ReindexRequest; @@ -44,10 +43,10 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler clusterSupportsFeature; private final CrossProjectModeDecider crossProjectModeDecider; - public RestReindexAction(Predicate clusterSupportsFeature, Settings settings) { + public RestReindexAction(Predicate clusterSupportsFeature, CrossProjectModeDecider crossProjectModeDecider) { super(ReindexAction.INSTANCE); this.clusterSupportsFeature = clusterSupportsFeature; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/modules/reindex/src/test/java/org/elasticsearch/reindex/RestReindexActionTests.java b/modules/reindex/src/test/java/org/elasticsearch/reindex/RestReindexActionTests.java index bc731a3a94b6d..a6344f59ee896 100644 --- a/modules/reindex/src/test/java/org/elasticsearch/reindex/RestReindexActionTests.java +++ b/modules/reindex/src/test/java/org/elasticsearch/reindex/RestReindexActionTests.java @@ -11,11 +11,11 @@ import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.index.reindex.AbstractBulkByScrollRequest; import org.elasticsearch.index.reindex.ReindexRequest; import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.rest.FakeRestRequest; import org.elasticsearch.test.rest.RestActionTestCase; import org.elasticsearch.xcontent.XContentBuilder; @@ -45,7 +45,7 @@ public class RestReindexActionTests extends RestActionTestCase { public void setUpAction() { action = new RestReindexAction( nf -> nf.equals(ReindexPlugin.RELOCATE_ON_SHUTDOWN_NODE_FEATURE) && relocateOnShutdownFeatureEnabled, - Settings.EMPTY + CrossProjectModeDecider.NOOP ); controller().registerHandler(action); } diff --git a/server/src/main/java/org/elasticsearch/action/ActionModule.java b/server/src/main/java/org/elasticsearch/action/ActionModule.java index 0f1d6162d6427..3810b1c3e2dab 100644 --- a/server/src/main/java/org/elasticsearch/action/ActionModule.java +++ b/server/src/main/java/org/elasticsearch/action/ActionModule.java @@ -408,6 +408,7 @@ import org.elasticsearch.rest.action.synonyms.RestGetSynonymsSetsAction; import org.elasticsearch.rest.action.synonyms.RestPutSynonymRuleAction; import org.elasticsearch.rest.action.synonyms.RestPutSynonymsAction; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.snapshots.TransportUpdateSnapshotStatusAction; import org.elasticsearch.tasks.Task; import org.elasticsearch.telemetry.TelemetryProvider; @@ -450,6 +451,7 @@ public class ActionModule extends AbstractModule { private final ActionFilters actionFilters; private final IncrementalBulkService bulkService; private final ProjectResolver projectResolver; + private final CrossProjectModeDecider crossProjectModeDecider; private final AutoCreateIndex autoCreateIndex; private final DestructiveOperations destructiveOperations; private final RestController restController; @@ -479,6 +481,7 @@ public ActionModule( List> reservedProjectStateHandlers, RestExtension restExtension, IncrementalBulkService bulkService, + CrossProjectModeDecider crossProjectModeDecider, ProjectResolver projectResolver ) { this.settings = env.settings(); @@ -489,6 +492,7 @@ public ActionModule( actionFilters = setupActionFilters(actionPlugins); this.bulkService = bulkService; this.projectResolver = projectResolver; + this.crossProjectModeDecider = crossProjectModeDecider; autoCreateIndex = new AutoCreateIndex(settings, clusterSettings, indexNameExpressionResolver, systemIndices); destructiveOperations = new DestructiveOperations(settings, clusterSettings); Set headers = Stream.concat( @@ -927,7 +931,7 @@ public void initRestHandlers(Supplier nodesInCluster, Predicate< registerHandler.accept(new RestForceMergeAction()); registerHandler.accept(new RestClearIndicesCacheAction()); registerHandler.accept(new RestResolveClusterAction()); - registerHandler.accept(new RestResolveIndexAction(settings)); + registerHandler.accept(new RestResolveIndexAction(crossProjectModeDecider)); registerHandler.accept(new RestIndexAction(clusterService, projectResolver)); registerHandler.accept(new CreateHandler(clusterService, projectResolver)); @@ -936,18 +940,22 @@ public void initRestHandlers(Supplier nodesInCluster, Predicate< registerHandler.accept(new RestGetSourceAction()); registerHandler.accept(new RestMultiGetAction(settings)); registerHandler.accept(new RestDeleteAction()); - registerHandler.accept(new RestCountAction(settings)); + registerHandler.accept(new RestCountAction(crossProjectModeDecider)); registerHandler.accept(new RestTermVectorsAction()); registerHandler.accept(new RestMultiTermVectorsAction()); registerHandler.accept(new RestBulkAction(settings, clusterSettings, bulkService)); registerHandler.accept(new RestUpdateAction()); - registerHandler.accept(new RestSearchAction(restController.getSearchUsageHolder(), clusterSupportsFeature, settings)); + registerHandler.accept( + new RestSearchAction(restController.getSearchUsageHolder(), clusterSupportsFeature, crossProjectModeDecider) + ); registerHandler.accept(new RestSearchScrollAction()); registerHandler.accept(new RestClearScrollAction()); - registerHandler.accept(new RestOpenPointInTimeAction(settings)); + registerHandler.accept(new RestOpenPointInTimeAction(crossProjectModeDecider)); registerHandler.accept(new RestClosePointInTimeAction()); - registerHandler.accept(new RestMultiSearchAction(settings, restController.getSearchUsageHolder(), clusterSupportsFeature)); + registerHandler.accept( + new RestMultiSearchAction(settings, restController.getSearchUsageHolder(), clusterSupportsFeature, crossProjectModeDecider) + ); registerHandler.accept(new RestKnnSearchAction()); registerHandler.accept(new RestValidateQueryAction()); @@ -965,7 +973,7 @@ public void initRestHandlers(Supplier nodesInCluster, Predicate< registerHandler.accept(new RestGetScriptContextAction()); registerHandler.accept(new RestGetScriptLanguageAction()); - registerHandler.accept(new RestFieldCapabilitiesAction(settings)); + registerHandler.accept(new RestFieldCapabilitiesAction(crossProjectModeDecider)); // Tasks API registerHandler.accept(new RestListTasksAction(nodesInCluster)); @@ -993,7 +1001,7 @@ public void initRestHandlers(Supplier nodesInCluster, Predicate< registerHandler.accept(new RestIndicesAction(projectResolver)); registerHandler.accept(new RestSegmentsAction()); // Fully qualified to prevent interference with rest.action.count.RestCountAction - registerHandler.accept(new org.elasticsearch.rest.action.cat.RestCountAction(settings)); + registerHandler.accept(new org.elasticsearch.rest.action.cat.RestCountAction(crossProjectModeDecider)); // Fully qualified to prevent interference with rest.action.indices.RestRecoveryAction registerHandler.accept(new RestCatRecoveryAction()); registerHandler.accept(new RestHealthAction()); @@ -1019,7 +1027,8 @@ public void initRestHandlers(Supplier nodesInCluster, Predicate< ActionPlugin.RestHandlersServices restHandlersServices = new ActionPlugin.RestHandlersServices( settings, restController, - projectResolver + projectResolver, + crossProjectModeDecider ); for (ActionPlugin plugin : actionPlugins) { diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java index 53299e80f65b7..5d089819f3385 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java @@ -39,7 +39,6 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.regex.Regex; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.CountDown; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.core.Nullable; @@ -597,15 +596,15 @@ public TransportAction( ClusterService clusterService, ActionFilters actionFilters, ProjectResolver projectResolver, - Settings settings, - IndexNameExpressionResolver indexNameExpressionResolver + IndexNameExpressionResolver indexNameExpressionResolver, + CrossProjectModeDecider crossProjectModeDecider ) { super(NAME, transportService, actionFilters, Request::new, EsExecutors.DIRECT_EXECUTOR_SERVICE); this.clusterService = clusterService; this.remoteClusterService = transportService.getRemoteClusterService(); this.projectResolver = projectResolver; this.indexNameExpressionResolver = indexNameExpressionResolver; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; this.ccsCheckCompatibility = SearchService.CCS_VERSION_CHECK_SETTING.get(clusterService.getSettings()); } diff --git a/server/src/main/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesAction.java b/server/src/main/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesAction.java index dd4b381757328..f3f901219ed63 100644 --- a/server/src/main/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesAction.java +++ b/server/src/main/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesAction.java @@ -123,7 +123,8 @@ public TransportFieldCapabilitiesAction( ActionFilters actionFilters, IndicesService indicesService, ProjectResolver projectResolver, - IndexNameExpressionResolver indexNameExpressionResolver + IndexNameExpressionResolver indexNameExpressionResolver, + CrossProjectModeDecider crossProjectModeDecider ) { // TODO replace DIRECT_EXECUTOR_SERVICE when removing workaround for https://github.com/elastic/elasticsearch/issues/97916 super(NAME, transportService, actionFilters, FieldCapabilitiesRequest::new, EsExecutors.DIRECT_EXECUTOR_SERVICE); @@ -142,7 +143,7 @@ public TransportFieldCapabilitiesAction( this.ccsCheckCompatibility = SearchService.CCS_VERSION_CHECK_SETTING.get(clusterService.getSettings()); this.threadPool = threadPool; this.forceConnectTimeoutSecs = clusterService.getSettings().getAsTime("search.ccs.force_connect_timeout", null); - this.crossProjectModeDecider = new CrossProjectModeDecider(clusterService.getSettings()); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/action/search/RestOpenPointInTimeAction.java b/server/src/main/java/org/elasticsearch/action/search/RestOpenPointInTimeAction.java index 6d6b2666e0ad2..eaf304c1f64f3 100644 --- a/server/src/main/java/org/elasticsearch/action/search/RestOpenPointInTimeAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/RestOpenPointInTimeAction.java @@ -12,7 +12,6 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.TimeValue; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; @@ -34,8 +33,8 @@ public class RestOpenPointInTimeAction extends BaseRestHandler { private final CrossProjectModeDecider crossProjectModeDecider; - public RestOpenPointInTimeAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestOpenPointInTimeAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java index 11a5d784c1001..e8e97e98f38e3 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java @@ -83,7 +83,6 @@ public class TransportOpenPointInTimeAction extends HandledTransportAction( clusterService.getClusterSettings(), new SearchLogProducer(clusterService.getClusterSettings(), indexNameExpressionResolver.getSystemNamePredicate()), diff --git a/server/src/main/java/org/elasticsearch/node/NodeConstruction.java b/server/src/main/java/org/elasticsearch/node/NodeConstruction.java index cc0097aef11b1..e629b5c7d3945 100644 --- a/server/src/main/java/org/elasticsearch/node/NodeConstruction.java +++ b/server/src/main/java/org/elasticsearch/node/NodeConstruction.java @@ -219,6 +219,7 @@ import org.elasticsearch.search.SearchService; import org.elasticsearch.search.SearchUtils; import org.elasticsearch.search.aggregations.support.AggregationUsageService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.crossproject.ProjectRoutingResolver; import org.elasticsearch.shutdown.PluginShutdownService; import org.elasticsearch.snapshots.CachingSnapshotAndShardByStateMetricsService; @@ -1019,6 +1020,8 @@ public void sendRequest( } }; + final CrossProjectModeDecider crossProjectModeDecider = new CrossProjectModeDecider(settings); + PluginServiceInstances pluginServices = new PluginServiceInstances( client, clusterService, @@ -1046,7 +1049,8 @@ public void sendRequest( indexingLimits, linkedProjectConfigService, projectRoutingResolver, - remoteTransportClient + remoteTransportClient, + crossProjectModeDecider ); Collection pluginComponents = pluginsService.flatMap(plugin -> { @@ -1087,6 +1091,7 @@ public void sendRequest( final ResponseCollectorService responseCollectorService = new ResponseCollectorService(clusterService); modules.bindToInstance(ResponseCollectorService.class, responseCollectorService); + modules.bindToInstance(CrossProjectModeDecider.class, crossProjectModeDecider); var reservedStateHandlerProviders = pluginsService.loadServiceProviders(ReservedStateHandlerProvider.class); @@ -1108,6 +1113,7 @@ public void sendRequest( buildReservedProjectStateHandlers(reservedStateHandlerProviders, metadataIndexTemplateService), pluginsService.loadSingletonServiceProvider(RestExtension.class, RestExtension::allowAll), incrementalBulkService, + crossProjectModeDecider, projectResolver ); modules.add(actionModule); @@ -1166,6 +1172,7 @@ public void sendRequest( telemetryProvider, nodeEnvironment.nodeId(), linkedProjectConfigService, + crossProjectModeDecider, projectResolver ); transportServiceRef.set(transportService); diff --git a/server/src/main/java/org/elasticsearch/node/NodeServiceProvider.java b/server/src/main/java/org/elasticsearch/node/NodeServiceProvider.java index 64ad26691acd6..0bebb3bb413ed 100644 --- a/server/src/main/java/org/elasticsearch/node/NodeServiceProvider.java +++ b/server/src/main/java/org/elasticsearch/node/NodeServiceProvider.java @@ -39,6 +39,7 @@ import org.elasticsearch.script.ScriptEngine; import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.SearchService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.fetch.FetchPhase; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.TelemetryProvider; @@ -139,6 +140,7 @@ TransportService newTransportService( TelemetryProvider telemetryProvider, String nodeId, LinkedProjectConfigService linkedProjectConfigService, + CrossProjectModeDecider crossProjectModeDecider, ProjectResolver projectResolver ) { return new TransportService( @@ -152,6 +154,7 @@ TransportService newTransportService( taskManager, linkedProjectConfigService, telemetryProvider, + crossProjectModeDecider, projectResolver ); } diff --git a/server/src/main/java/org/elasticsearch/node/PluginServiceInstances.java b/server/src/main/java/org/elasticsearch/node/PluginServiceInstances.java index d3f019d0d6260..7b8657dc19deb 100644 --- a/server/src/main/java/org/elasticsearch/node/PluginServiceInstances.java +++ b/server/src/main/java/org/elasticsearch/node/PluginServiceInstances.java @@ -29,6 +29,7 @@ import org.elasticsearch.plugins.internal.DocumentParsingProvider; import org.elasticsearch.repositories.RepositoriesService; import org.elasticsearch.script.ScriptService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.crossproject.ProjectRoutingResolver; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.TelemetryProvider; @@ -65,5 +66,6 @@ public record PluginServiceInstances( IndexingPressure indexingPressure, LinkedProjectConfigService linkedProjectConfigService, ProjectRoutingResolver projectRoutingResolver, - RemoteTransportClient remoteTransportClient + RemoteTransportClient remoteTransportClient, + CrossProjectModeDecider crossProjectModeDecider ) implements Plugin.PluginServices {} diff --git a/server/src/main/java/org/elasticsearch/plugins/ActionPlugin.java b/server/src/main/java/org/elasticsearch/plugins/ActionPlugin.java index d62c51bdd000e..8c216d27891c8 100644 --- a/server/src/main/java/org/elasticsearch/plugins/ActionPlugin.java +++ b/server/src/main/java/org/elasticsearch/plugins/ActionPlugin.java @@ -23,6 +23,7 @@ import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestHandler; import org.elasticsearch.rest.RestHeaderDefinition; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import java.util.Collection; import java.util.Collections; @@ -141,5 +142,10 @@ default Collection> in return Collections.emptyList(); } - record RestHandlersServices(Settings settings, RestController restController, ProjectResolver projectResolver) {} + record RestHandlersServices( + Settings settings, + RestController restController, + ProjectResolver projectResolver, + CrossProjectModeDecider crossProjectModeDecider + ) {} } diff --git a/server/src/main/java/org/elasticsearch/plugins/Plugin.java b/server/src/main/java/org/elasticsearch/plugins/Plugin.java index 3aa04507cd1ef..877832f1f921d 100644 --- a/server/src/main/java/org/elasticsearch/plugins/Plugin.java +++ b/server/src/main/java/org/elasticsearch/plugins/Plugin.java @@ -37,6 +37,7 @@ import org.elasticsearch.plugins.internal.DocumentParsingProvider; import org.elasticsearch.repositories.RepositoriesService; import org.elasticsearch.script.ScriptService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.crossproject.ProjectRoutingResolver; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.TelemetryProvider; @@ -212,6 +213,9 @@ public interface PluginServices { /** A utility for executing transport actions on remote nodes */ RemoteTransportClient remoteTransportClient(); + + /** A service to determine whether Cross-Project Search applies to a request */ + CrossProjectModeDecider crossProjectModeDecider(); } /** diff --git a/server/src/main/java/org/elasticsearch/rest/action/RestFieldCapabilitiesAction.java b/server/src/main/java/org/elasticsearch/rest/action/RestFieldCapabilitiesAction.java index 92c09d7ccca50..83e2be7dd6398 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/RestFieldCapabilitiesAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/RestFieldCapabilitiesAction.java @@ -13,7 +13,6 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.Scope; @@ -33,12 +32,10 @@ @ServerlessScope(Scope.PUBLIC) public class RestFieldCapabilitiesAction extends BaseRestHandler { - private final Settings settings; private final CrossProjectModeDecider crossProjectModeDecider; - public RestFieldCapabilitiesAction(Settings settings) { - this.settings = settings; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestFieldCapabilitiesAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexAction.java b/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexAction.java index df23cc62cdb32..e7b22053ffaf0 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexAction.java @@ -15,7 +15,6 @@ import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexMode; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; @@ -40,8 +39,8 @@ public class RestResolveIndexAction extends BaseRestHandler { private static final Set CAPABILITIES = Set.of("mode_filter"); private final CrossProjectModeDecider crossProjectModeDecider; - public RestResolveIndexAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestResolveIndexAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java b/server/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java index dbeaa87c49ac8..8cd87bfdef852 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java @@ -17,7 +17,6 @@ import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.Strings; import org.elasticsearch.common.Table; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.RestResponse; @@ -39,8 +38,8 @@ public class RestCountAction extends AbstractCatAction { private final CrossProjectModeDecider crossProjectModeDecider; - public RestCountAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestCountAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/rest/action/search/RestCountAction.java b/server/src/main/java/org/elasticsearch/rest/action/search/RestCountAction.java index 0b65ccbf27f2b..c1ff8846e8e31 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/search/RestCountAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/search/RestCountAction.java @@ -14,7 +14,6 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; @@ -40,8 +39,8 @@ public class RestCountAction extends BaseRestHandler { private final CrossProjectModeDecider crossProjectModeDecider; - public RestCountAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestCountAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java b/server/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java index a4245cd501dea..b6939f0ed4f88 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java @@ -53,11 +53,16 @@ public class RestMultiSearchAction extends BaseRestHandler { private final Predicate clusterSupportsFeature; private final CrossProjectModeDecider crossProjectModeDecider; - public RestMultiSearchAction(Settings settings, SearchUsageHolder searchUsageHolder, Predicate clusterSupportsFeature) { + public RestMultiSearchAction( + Settings settings, + SearchUsageHolder searchUsageHolder, + Predicate clusterSupportsFeature, + CrossProjectModeDecider crossProjectModeDecider + ) { this.allowExplicitIndex = MULTI_ALLOW_EXPLICIT_INDEX.get(settings); this.searchUsageHolder = searchUsageHolder; this.clusterSupportsFeature = clusterSupportsFeature; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java b/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java index ec6ce815b333c..e07890158a597 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java @@ -16,7 +16,6 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Booleans; import org.elasticsearch.core.Nullable; import org.elasticsearch.features.NodeFeature; @@ -71,10 +70,14 @@ public class RestSearchAction extends BaseRestHandler { private final Predicate clusterSupportsFeature; private final CrossProjectModeDecider crossProjectModeDecider; - public RestSearchAction(SearchUsageHolder searchUsageHolder, Predicate clusterSupportsFeature, Settings settings) { + public RestSearchAction( + SearchUsageHolder searchUsageHolder, + Predicate clusterSupportsFeature, + CrossProjectModeDecider crossProjectModeDecider + ) { this.searchUsageHolder = searchUsageHolder; this.clusterSupportsFeature = clusterSupportsFeature; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/server/src/main/java/org/elasticsearch/search/crossproject/CrossProjectModeDecider.java b/server/src/main/java/org/elasticsearch/search/crossproject/CrossProjectModeDecider.java index d76efd2906e5f..6e3321e897d75 100644 --- a/server/src/main/java/org/elasticsearch/search/crossproject/CrossProjectModeDecider.java +++ b/server/src/main/java/org/elasticsearch/search/crossproject/CrossProjectModeDecider.java @@ -33,6 +33,8 @@ * */ public class CrossProjectModeDecider { + public static final CrossProjectModeDecider NOOP = new CrossProjectModeDecider(Settings.EMPTY); + private static final String CROSS_PROJECT_ENABLED_SETTING_KEY = "serverless.cross_project.enabled"; private final boolean crossProjectEnabled; diff --git a/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java b/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java index d6669e093a4ce..2f4bf95ab8a41 100644 --- a/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java +++ b/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java @@ -82,7 +82,12 @@ public boolean isRemoteClusterServerEnabled() { private final ProjectResolver projectResolver; private final CrossProjectModeDecider crossProjectModeDecider; - RemoteClusterService(Settings settings, TransportService transportService, ProjectResolver projectResolver) { + RemoteClusterService( + Settings settings, + TransportService transportService, + CrossProjectModeDecider crossProjectModeDecider, + ProjectResolver projectResolver + ) { super(settings); this.isRemoteClusterClient = DiscoveryNode.isRemoteClusterClient(settings); this.isSearchNode = DiscoveryNode.hasRole(settings, DiscoveryNodeRole.SEARCH_ROLE); @@ -97,7 +102,7 @@ public boolean isRemoteClusterServerEnabled() { if (remoteClusterServerEnabled) { registerRemoteClusterHandshakeRequestHandler(transportService); } - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } public RemoteClusterCredentialsManager getRemoteClusterCredentialsManager() { diff --git a/server/src/main/java/org/elasticsearch/transport/TransportService.java b/server/src/main/java/org/elasticsearch/transport/TransportService.java index 2519720fd5fa6..57e40da89b601 100644 --- a/server/src/main/java/org/elasticsearch/transport/TransportService.java +++ b/server/src/main/java/org/elasticsearch/transport/TransportService.java @@ -49,6 +49,7 @@ import org.elasticsearch.core.UpdateForV10; import org.elasticsearch.node.NodeClosedException; import org.elasticsearch.node.ReportingService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.tasks.Task; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.TelemetryProvider; @@ -281,6 +282,7 @@ public TransportService( taskManger, new ClusterSettingsLinkedProjectConfigService(settings, clusterSettings, DefaultProjectResolver.INSTANCE), TelemetryProvider.NOOP, + CrossProjectModeDecider.NOOP, DefaultProjectResolver.INSTANCE ); } @@ -297,6 +299,7 @@ public TransportService( TaskManager taskManger, LinkedProjectConfigService linkedProjectConfigService, TelemetryProvider telemetryProvider, + CrossProjectModeDecider crossProjectModeDecider, ProjectResolver projectResolver ) { this.transport = transport; @@ -314,7 +317,7 @@ public TransportService( this.enableStackOverflowAvoidance = ENABLE_STACK_OVERFLOW_AVOIDANCE.get(settings); this.linkedProjectConfigService = linkedProjectConfigService; this.telemetryProvider = telemetryProvider; - remoteClusterService = new RemoteClusterService(settings, this, projectResolver); + remoteClusterService = new RemoteClusterService(settings, this, crossProjectModeDecider, projectResolver); responseHandlers = transport.getResponseHandlers(); if (clusterSettings != null) { clusterSettings.addSettingsUpdateConsumer(TransportSettings.TRACE_LOG_INCLUDE_SETTING, this::setTracerLogInclude); diff --git a/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java b/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java index 70293196f8afa..b054710362a27 100644 --- a/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java +++ b/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java @@ -37,6 +37,7 @@ import org.elasticsearch.rest.RestInterceptor; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.action.admin.cluster.RestNodesInfoAction; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.tasks.Task; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.TelemetryProvider; @@ -137,6 +138,7 @@ public void testSetupRestHandlerContainsKnownBuiltin() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ); actionModule.initRestHandlers(null, null); @@ -196,6 +198,7 @@ public String getName() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ); Exception e = expectThrows(IllegalArgumentException.class, () -> actionModule.initRestHandlers(null, null)); @@ -248,6 +251,7 @@ public List getRestHandlers( List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ); actionModule.initRestHandlers(null, null); @@ -299,6 +303,7 @@ public void test3rdPartyHandlerIsNotInstalled() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ) ); @@ -341,6 +346,7 @@ public void test3rdPartyRestControllerIsNotInstalled() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ) ); diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/TransportResolveIndexActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/TransportResolveIndexActionTests.java index bd8cb0ed50b15..91772405f5581 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/TransportResolveIndexActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/resolve/TransportResolveIndexActionTests.java @@ -20,6 +20,7 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.search.SearchService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.TransportVersionUtils; import org.elasticsearch.test.transport.MockTransportService; @@ -81,8 +82,8 @@ public void writeTo(StreamOutput out) throws IOException { clusterService, actionFilters, TestProjectResolvers.DEFAULT_PROJECT_ONLY, - Settings.EMPTY, - null + null, + CrossProjectModeDecider.NOOP ); IllegalArgumentException ex = expectThrows( diff --git a/server/src/test/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesActionTests.java b/server/src/test/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesActionTests.java index 0cb3213865d8c..8e481dbb3ee39 100644 --- a/server/src/test/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/fieldcaps/TransportFieldCapabilitiesActionTests.java @@ -20,6 +20,7 @@ import org.elasticsearch.indices.IndicesService; import org.elasticsearch.search.DummyQueryBuilder; import org.elasticsearch.search.SearchService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.TransportVersionUtils; import org.elasticsearch.test.transport.MockTransportService; @@ -84,7 +85,8 @@ protected void doWriteTo(StreamOutput out) throws IOException { actionFilters, indicesService, null, - null + null, + CrossProjectModeDecider.NOOP ); IllegalArgumentException ex = safeAwaitFailure( diff --git a/server/src/test/java/org/elasticsearch/action/search/RestOpenPointInTimeActionTests.java b/server/src/test/java/org/elasticsearch/action/search/RestOpenPointInTimeActionTests.java index 0cdee17c1f354..4b291e535bdfc 100644 --- a/server/src/test/java/org/elasticsearch/action/search/RestOpenPointInTimeActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/RestOpenPointInTimeActionTests.java @@ -10,9 +10,9 @@ package org.elasticsearch.action.search; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ConcurrentCollections; import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.rest.FakeRestRequest; import org.elasticsearch.test.rest.RestActionTestCase; @@ -27,7 +27,7 @@ public class RestOpenPointInTimeActionTests extends RestActionTestCase { public void testMaxConcurrentSearchRequests() { - RestOpenPointInTimeAction action = new RestOpenPointInTimeAction(Settings.EMPTY); + RestOpenPointInTimeAction action = new RestOpenPointInTimeAction(CrossProjectModeDecider.NOOP); controller().registerHandler(action); Queue transportRequests = ConcurrentCollections.newQueue(); verifyingClient.setExecuteVerifier(((actionType, transportRequest) -> { diff --git a/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java b/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java index f5aee1071291d..aa76e5ad7250d 100644 --- a/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java @@ -76,6 +76,7 @@ import org.elasticsearch.search.aggregations.InternalAggregations; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.collapse.CollapseBuilder; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.internal.AliasFilter; import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.ShardSearchContextId; @@ -1960,7 +1961,8 @@ protected void doWriteTo(StreamOutput out) throws IOException { client, new UsageService(), new TestActionActionLoggingFieldsProvider(), - ActivityLogWriterProvider.NOOP + ActivityLogWriterProvider.NOOP, + CrossProjectModeDecider.NOOP ); CountDownLatch latch = new CountDownLatch(1); diff --git a/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java b/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java index bd31a4f499f30..72503a986c8e8 100644 --- a/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java +++ b/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java @@ -42,6 +42,7 @@ import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.RestResponse; import org.elasticsearch.rest.RestStatus; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.tasks.Task; import org.elasticsearch.telemetry.TelemetryProvider; import org.elasticsearch.telemetry.metric.MeterRegistry; @@ -1168,6 +1169,7 @@ public Collection getRestHeaders() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ); } diff --git a/server/src/test/java/org/elasticsearch/rest/action/RestFieldCapabilitiesActionTests.java b/server/src/test/java/org/elasticsearch/rest/action/RestFieldCapabilitiesActionTests.java index 7c1841319bc9a..1ae2c6c16c893 100644 --- a/server/src/test/java/org/elasticsearch/rest/action/RestFieldCapabilitiesActionTests.java +++ b/server/src/test/java/org/elasticsearch/rest/action/RestFieldCapabilitiesActionTests.java @@ -11,8 +11,8 @@ import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.rest.FakeRestRequest; import org.elasticsearch.xcontent.XContentType; @@ -29,7 +29,7 @@ public class RestFieldCapabilitiesActionTests extends ESTestCase { @Before public void setUpAction() { - action = new RestFieldCapabilitiesAction(Settings.EMPTY); + action = new RestFieldCapabilitiesAction(CrossProjectModeDecider.NOOP); } public void testRequestBodyAndParamsBothInput() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexActionTests.java b/server/src/test/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexActionTests.java index 6d056c42c750d..270542443ef48 100644 --- a/server/src/test/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexActionTests.java +++ b/server/src/test/java/org/elasticsearch/rest/action/admin/indices/RestResolveIndexActionTests.java @@ -19,6 +19,7 @@ import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.rest.FakeRestChannel; import org.elasticsearch.test.rest.FakeRestRequest; @@ -35,7 +36,7 @@ public class RestResolveIndexActionTests extends ESTestCase { private void executeRequest(BytesArray body, boolean cpsEnabled) throws Exception { final Settings settings = Settings.builder().put("serverless.cross_project.enabled", cpsEnabled).build(); - final var action = new RestResolveIndexAction(settings); + final var action = new RestResolveIndexAction(new CrossProjectModeDecider(settings)); final var request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.GET) .withPath("/_resolve/index/foo") .withContent(body, XContentType.JSON) diff --git a/server/src/test/java/org/elasticsearch/rest/action/search/RestSearchActionTests.java b/server/src/test/java/org/elasticsearch/rest/action/search/RestSearchActionTests.java index 379574e64009d..024edd6a19d20 100644 --- a/server/src/test/java/org/elasticsearch/rest/action/search/RestSearchActionTests.java +++ b/server/src/test/java/org/elasticsearch/rest/action/search/RestSearchActionTests.java @@ -11,9 +11,9 @@ import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.search.suggest.term.TermSuggestionBuilder; import org.elasticsearch.search.vectors.KnnSearchBuilder; @@ -34,7 +34,7 @@ public final class RestSearchActionTests extends RestActionTestCase { @Before public void setUpAction() { - action = new RestSearchAction(new UsageService().getSearchUsageHolder(), nf -> false, Settings.EMPTY); + action = new RestSearchAction(new UsageService().getSearchUsageHolder(), nf -> false, CrossProjectModeDecider.NOOP); controller().registerHandler(action); verifyingClient.setExecuteVerifier((actionType, request) -> mock(SearchResponse.class)); verifyingClient.setExecuteLocallyVerifier((actionType, request) -> mock(SearchResponse.class)); diff --git a/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTestHelper.java b/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTestHelper.java index f265ed320c842..47c14418599a2 100644 --- a/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTestHelper.java +++ b/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTestHelper.java @@ -148,6 +148,7 @@ import org.elasticsearch.script.ScriptCompiler; import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.SearchService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.fetch.FetchPhase; import org.elasticsearch.telemetry.TelemetryProvider; import org.elasticsearch.telemetry.tracing.Tracer; @@ -946,7 +947,8 @@ public boolean clusterHasFeature(ClusterState state, NodeFeature feature) { client, usageService, new IndicesServiceTests.TestActionActionLoggingFieldsProvider(), - ActivityLogWriterProvider.NOOP + ActivityLogWriterProvider.NOOP, + CrossProjectModeDecider.NOOP ) ); actions.put( diff --git a/test/framework/src/main/java/org/elasticsearch/node/MockNode.java b/test/framework/src/main/java/org/elasticsearch/node/MockNode.java index c3cdfbbfbd3b3..d1eb06c9ea34d 100644 --- a/test/framework/src/main/java/org/elasticsearch/node/MockNode.java +++ b/test/framework/src/main/java/org/elasticsearch/node/MockNode.java @@ -44,6 +44,7 @@ import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.MockSearchService; import org.elasticsearch.search.SearchService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.fetch.FetchPhase; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.TelemetryProvider; @@ -196,6 +197,7 @@ protected TransportService newTransportService( TelemetryProvider telemetryProvider, String nodeId, LinkedProjectConfigService linkedProjectConfigService, + CrossProjectModeDecider crossProjectModeDecider, ProjectResolver projectResolver ) { @@ -216,6 +218,7 @@ protected TransportService newTransportService( telemetryProvider, nodeId, linkedProjectConfigService, + crossProjectModeDecider, projectResolver ); } else { @@ -229,6 +232,7 @@ protected TransportService newTransportService( taskManager, linkedProjectConfigService, telemetryProvider, + crossProjectModeDecider, projectResolver ); } diff --git a/test/framework/src/main/java/org/elasticsearch/plugins/PluginTestUtil.java b/test/framework/src/main/java/org/elasticsearch/plugins/PluginTestUtil.java index 561fee251063e..daef4beaf58eb 100644 --- a/test/framework/src/main/java/org/elasticsearch/plugins/PluginTestUtil.java +++ b/test/framework/src/main/java/org/elasticsearch/plugins/PluginTestUtil.java @@ -11,6 +11,7 @@ import org.elasticsearch.Version; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import java.io.IOException; import java.io.OutputStream; @@ -69,6 +70,6 @@ public static void writeNamedComponentsFile(Path pluginDir, String namedComponen } public static ActionPlugin.RestHandlersServices emptyRestHandlersServices() { - return new ActionPlugin.RestHandlersServices(Settings.EMPTY, null, null); + return new ActionPlugin.RestHandlersServices(Settings.EMPTY, null, null, CrossProjectModeDecider.NOOP); } } diff --git a/test/framework/src/main/java/org/elasticsearch/test/transport/MockTransportService.java b/test/framework/src/main/java/org/elasticsearch/test/transport/MockTransportService.java index 3883aadac3cf7..9a6fd6f253648 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/transport/MockTransportService.java +++ b/test/framework/src/main/java/org/elasticsearch/test/transport/MockTransportService.java @@ -45,6 +45,7 @@ import org.elasticsearch.node.Node; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.SearchModule; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.tasks.TaskManager; import org.elasticsearch.telemetry.RecordingMeterRegistry; import org.elasticsearch.telemetry.TelemetryProvider; @@ -279,6 +280,7 @@ public MeterRegistry getMeterRegistry() { return meterRegistry; } }, + new CrossProjectModeDecider(settings), DefaultProjectResolver.INSTANCE ); } @@ -293,6 +295,7 @@ public MockTransportService( TaskManager taskManager, LinkedProjectConfigService linkedProjectConfigService, TelemetryProvider telemetryProvider, + CrossProjectModeDecider crossProjectModeDecider, ProjectResolver projectResolver ) { super( @@ -306,6 +309,7 @@ public MockTransportService( taskManager, linkedProjectConfigService, telemetryProvider, + crossProjectModeDecider, projectResolver ); this.original = transport.getDelegate(); diff --git a/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/AsyncSearch.java b/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/AsyncSearch.java index 909b5dddb2eab..3c18439b7f041 100644 --- a/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/AsyncSearch.java +++ b/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/AsyncSearch.java @@ -8,7 +8,6 @@ import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.common.settings.Setting; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.features.NodeFeature; import org.elasticsearch.plugins.ActionPlugin; import org.elasticsearch.plugins.Plugin; @@ -44,9 +43,12 @@ public List getRestHandlers( Predicate clusterSupportsFeature ) { RestController restController = restHandlersServices.restController(); - Settings settings = restHandlersServices.settings(); return Arrays.asList( - new RestSubmitAsyncSearchAction(restController.getSearchUsageHolder(), clusterSupportsFeature, settings), + new RestSubmitAsyncSearchAction( + restController.getSearchUsageHolder(), + clusterSupportsFeature, + restHandlersServices.crossProjectModeDecider() + ), new RestGetAsyncSearchAction(), new RestGetAsyncStatusAction(), new RestDeleteAsyncSearchAction() diff --git a/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java b/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java index aa5417e542c6a..8eb70a9cbf022 100644 --- a/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java +++ b/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.search; import org.elasticsearch.client.internal.node.NodeClient; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.features.NodeFeature; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; @@ -45,11 +44,11 @@ public final class RestSubmitAsyncSearchAction extends BaseRestHandler { public RestSubmitAsyncSearchAction( SearchUsageHolder searchUsageHolder, Predicate clusterSupportsFeature, - Settings settings + CrossProjectModeDecider crossProjectModeDecider ) { this.searchUsageHolder = searchUsageHolder; this.clusterSupportsFeature = clusterSupportsFeature; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchActionTests.java b/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchActionTests.java index f28e6cf2cd03c..e88cb7a3e89a2 100644 --- a/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchActionTests.java +++ b/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchActionTests.java @@ -8,10 +8,10 @@ import org.apache.lucene.util.SetOnce; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.core.TimeValue; import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.test.rest.FakeRestRequest; import org.elasticsearch.test.rest.RestActionTestCase; import org.elasticsearch.usage.UsageService; @@ -35,7 +35,7 @@ public void setUpAction() { RestSubmitAsyncSearchAction action = new RestSubmitAsyncSearchAction( new UsageService().getSearchUsageHolder(), nf -> false, - Settings.EMPTY + CrossProjectModeDecider.NOOP ); controller().registerHandler(action); } diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/EqlPlugin.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/EqlPlugin.java index edfe29872729f..101237aaf9091 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/EqlPlugin.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/EqlPlugin.java @@ -125,7 +125,7 @@ public List getRestHandlers( ) { return List.of( - new RestEqlSearchAction(restHandlersServices.settings()), + new RestEqlSearchAction(restHandlersServices.crossProjectModeDecider()), new RestEqlStatsAction(), new RestEqlGetAsyncResultAction(), new RestEqlGetAsyncStatusAction(), diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/RestEqlSearchAction.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/RestEqlSearchAction.java index d28846fc82dcb..0ce2a25c3d562 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/RestEqlSearchAction.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plugin/RestEqlSearchAction.java @@ -10,7 +10,6 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.internal.node.NodeClient; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.logging.LogManager; import org.elasticsearch.logging.Logger; @@ -46,8 +45,8 @@ public class RestEqlSearchAction extends BaseRestHandler { private static final String SEARCH_PATH = "/{index}/_eql/search"; private final CrossProjectModeDecider crossProjectModeDecider; - public RestEqlSearchAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestEqlSearchAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java index 123cea7e0a658..9be28081a5910 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java @@ -632,7 +632,7 @@ public static LogicalOptimizerContext unboundLogicalOptimizerContext() { new InferenceService(mock(Client.class), clusterService), new BlockFactoryProvider(PlannerUtils.NON_BREAKING_BLOCK_FACTORY), new PlannerSettings.Holder(clusterService), - new CrossProjectModeDecider(Settings.EMPTY) + CrossProjectModeDecider.NOOP ); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/execution/PlanExecutor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/execution/PlanExecutor.java index d896099944c24..ccecaa37f0c88 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/execution/PlanExecutor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/execution/PlanExecutor.java @@ -9,9 +9,9 @@ import org.elasticsearch.TransportVersion; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.indices.IndicesExpressionGrouper; import org.elasticsearch.license.XPackLicenseState; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.telemetry.metric.MeterRegistry; import org.elasticsearch.xpack.esql.action.EsqlExecutionInfo; import org.elasticsearch.xpack.esql.action.EsqlQueryRequest; @@ -60,14 +60,14 @@ public PlanExecutor( XPackLicenseState licenseState, EsqlQueryLog queryLog, List> extraCheckers, - Settings settings, + CrossProjectModeDecider crossProjectModeDecider, DataSourceModule dataSourceModule ) { this.indexResolver = indexResolver; this.preAnalyzer = new PreAnalyzer(); this.functionRegistry = new EsqlFunctionRegistry(); this.mapper = new Mapper(); - this.metrics = new Metrics(functionRegistry, settings); + this.metrics = new Metrics(functionRegistry, crossProjectModeDecider.crossProjectEnabled()); this.verifier = new Verifier(metrics, licenseState, extraCheckers); this.planTelemetryManager = new PlanTelemetryManager(meterRegistry); this.queryLog = queryLog; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java index 3579a99e20fee..9e0d1ce4dc02c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java @@ -260,7 +260,7 @@ public Collection createComponents(PluginServices services) { getLicenseState(), new EsqlQueryLog(services.clusterService().getClusterSettings(), services.loggingFieldsProvider()), extraCheckers, - settings, + services.crossProjectModeDecider(), dataSourceModule ), new ExchangeService( diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java index 6e0d4e3eb3591..75bd250df82df 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java @@ -132,7 +132,8 @@ public TransportEsqlQueryAction( IndexNameExpressionResolver indexNameExpressionResolver, UsageService usageService, ActionLoggingFieldsProvider fieldProvider, - ActivityLogWriterProvider logWriterProvider + ActivityLogWriterProvider logWriterProvider, + CrossProjectModeDecider crossProjectModeDecider ) { // TODO replace SAME when removing workaround for https://github.com/elastic/elasticsearch/issues/97916 super(EsqlQueryAction.NAME, transportService, actionFilters, EsqlQueryRequest::new, EsExecutors.DIRECT_EXECUTOR_SERVICE); @@ -203,7 +204,7 @@ public TransportEsqlQueryAction( new InferenceService(client, clusterService), blockFactoryProvider, new PlannerSettings.Holder(clusterService), - new CrossProjectModeDecider(clusterService.getSettings()) + crossProjectModeDecider ); OperatorFactoryRegistry operatorFactoryRegistry = planExecutor.dataSourceModule() diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/Metrics.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/Metrics.java index 73b7583339b67..9efaecc2a63c7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/Metrics.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/Metrics.java @@ -9,9 +9,7 @@ import org.elasticsearch.Build; import org.elasticsearch.common.metrics.CounterMetric; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.Maps; -import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.xpack.core.watcher.common.stats.Counters; import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry; import org.elasticsearch.xpack.esql.expression.function.FunctionDefinition; @@ -62,8 +60,8 @@ public String toString() { * Settings metrics are filtered based on the current build type (snapshot vs release) * and deployment mode (serverless vs stateful). */ - public Metrics(EsqlFunctionRegistry functionRegistry, Settings settings) { - this(functionRegistry, Build.current().isSnapshot(), new CrossProjectModeDecider(settings).crossProjectEnabled()); + public Metrics(EsqlFunctionRegistry functionRegistry, boolean isServerless) { + this(functionRegistry, Build.current().isSnapshot(), isServerless); } /** diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/PlanExecutorMetricsTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/PlanExecutorMetricsTests.java index 51691ec6a55e2..1d2ded7f1b5e9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/PlanExecutorMetricsTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/PlanExecutorMetricsTests.java @@ -27,6 +27,7 @@ import org.elasticsearch.index.IndexMode; import org.elasticsearch.indices.IndicesExpressionGrouper; import org.elasticsearch.license.XPackLicenseState; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.telemetry.metric.MeterRegistry; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.TestThreadPool; @@ -158,7 +159,7 @@ public void testFailedMetric() throws Exception { new XPackLicenseState(() -> 0L), mockQueryLog(), List.of(), - Settings.EMPTY, + CrossProjectModeDecider.NOOP, dataSourceModule ); var enrichResolver = mockEnrichResolver(); @@ -268,7 +269,7 @@ public void testSettingsMetric() throws Exception { new XPackLicenseState(() -> 0L), mockQueryLog(), List.of(), - Settings.EMPTY, + CrossProjectModeDecider.NOOP, dataSourceModule ); @@ -367,7 +368,7 @@ public void testSettingsMetricDeduplication() throws Exception { new XPackLicenseState(() -> 0L), mockQueryLog(), List.of(), - Settings.EMPTY, + CrossProjectModeDecider.NOOP, dataSourceModule ); @@ -444,7 +445,7 @@ public void testApproximationSettingMetric() throws Exception { new XPackLicenseState(() -> 0L), mockQueryLog(), List.of(), - Settings.EMPTY, + CrossProjectModeDecider.NOOP, dataSourceModule ); @@ -512,7 +513,7 @@ public void testProjectRoutingSettingNotAllowedInStateful() throws Exception { new XPackLicenseState(() -> 0L), mockQueryLog(), List.of(), - Settings.EMPTY, + CrossProjectModeDecider.NOOP, dataSourceModule ); diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java index 3acfc6a526e2e..d368e3e0a57f9 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java @@ -766,6 +766,7 @@ public Collection createComponents(PluginServices services) { new PersistentTasksService(services.clusterService(), services.threadPool(), services.client()), services.linkedProjectConfigService(), services.projectResolver(), + services.crossProjectModeDecider(), services.projectRoutingResolver() ); } catch (final Exception e) { @@ -789,6 +790,7 @@ Collection createComponents( PersistentTasksService persistentTasksService, LinkedProjectConfigService linkedProjectConfigService, ProjectResolver projectResolver, + CrossProjectModeDecider crossProjectModeDecider, ProjectRoutingResolver projectRoutingResolver ) throws Exception { logger.info("Security is {}", enabled ? "enabled" : "disabled"); @@ -1173,7 +1175,7 @@ Collection createComponents( linkedProjectConfigService, projectResolver, authorizedProjectsResolver, - new CrossProjectModeDecider(settings), + crossProjectModeDecider, projectRoutingResolver ); @@ -1884,7 +1886,12 @@ public List getRestHandlers( new RestOpenIdConnectPrepareAuthenticationAction(settings, getLicenseState()), new RestOpenIdConnectAuthenticateAction(settings, getLicenseState()), new RestOpenIdConnectLogoutAction(settings, getLicenseState()), - new RestGetBuiltinPrivilegesAction(settings, getLicenseState(), getBuiltinPrivilegesResponseTranslator.get()), + new RestGetBuiltinPrivilegesAction( + settings, + getLicenseState(), + getBuiltinPrivilegesResponseTranslator.get(), + restHandlersServices.crossProjectModeDecider() + ), new RestGetPrivilegesAction(settings, getLicenseState()), new RestPutPrivilegesAction(settings, getLicenseState()), new RestDeletePrivilegesAction(settings, getLicenseState()), diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/action/privilege/RestGetBuiltinPrivilegesAction.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/action/privilege/RestGetBuiltinPrivilegesAction.java index 123e2f61d8aba..96603e41947e7 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/action/privilege/RestGetBuiltinPrivilegesAction.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/action/privilege/RestGetBuiltinPrivilegesAction.java @@ -53,11 +53,12 @@ public class RestGetBuiltinPrivilegesAction extends SecurityBaseRestHandler { public RestGetBuiltinPrivilegesAction( Settings settings, XPackLicenseState licenseState, - GetBuiltinPrivilegesResponseTranslator responseTranslator + GetBuiltinPrivilegesResponseTranslator responseTranslator, + CrossProjectModeDecider crossProjectModeDecider ) { super(settings, licenseState); this.responseTranslator = responseTranslator; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override 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 d7e037d193c22..044af6962c3d4 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 @@ -67,6 +67,7 @@ import org.elasticsearch.rest.RestHandler; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.script.ScriptService; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.search.crossproject.ProjectRoutingResolver; import org.elasticsearch.telemetry.TelemetryProvider; import org.elasticsearch.telemetry.metric.MeterRegistry; @@ -272,6 +273,7 @@ private Collection createComponentsUtil(Settings settings) throws Except mock(PersistentTasksService.class), StubLinkedProjectConfigService.INSTANCE, TestProjectResolvers.alwaysThrow(), + CrossProjectModeDecider.NOOP, ProjectRoutingResolver.NOOP ); } @@ -984,6 +986,7 @@ public void testSecurityRestHandlerInterceptorCanBeInstalled() throws IllegalAcc List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null, MeterRegistry.NOOP), + CrossProjectModeDecider.NOOP, TestProjectResolvers.alwaysThrow() ); actionModule.initRestHandlers(null, null); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlQueryAction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlQueryAction.java index b0a1c1ed091c4..b75edea2ac27c 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlQueryAction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlQueryAction.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.sql.plugin; import org.elasticsearch.client.internal.node.NodeClient; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.logging.LogManager; import org.elasticsearch.logging.Logger; import org.elasticsearch.rest.BaseRestHandler; @@ -39,8 +38,8 @@ public class RestSqlQueryAction extends BaseRestHandler { private final CrossProjectModeDecider crossProjectModeDecider; - public RestSqlQueryAction(Settings settings) { - crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestSqlQueryAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlTranslateAction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlTranslateAction.java index fb4a272a9ab7e..3eabab8c608b6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlTranslateAction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlTranslateAction.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.sql.plugin; import org.elasticsearch.client.internal.node.NodeClient; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.Scope; @@ -34,8 +33,8 @@ public class RestSqlTranslateAction extends BaseRestHandler { private final CrossProjectModeDecider crossProjectModeDecider; - public RestSqlTranslateAction(Settings settings) { - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + public RestSqlTranslateAction(CrossProjectModeDecider crossProjectModeDecider) { + this.crossProjectModeDecider = crossProjectModeDecider; } @Override diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/SqlPlugin.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/SqlPlugin.java index 54e55f53cfc64..922b44791520d 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/SqlPlugin.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/SqlPlugin.java @@ -110,10 +110,9 @@ public List getRestHandlers( Predicate clusterSupportsFeature ) { - Settings settings = restHandlersServices.settings(); return Arrays.asList( - new RestSqlQueryAction(settings), - new RestSqlTranslateAction(settings), + new RestSqlQueryAction(restHandlersServices.crossProjectModeDecider()), + new RestSqlTranslateAction(restHandlersServices.crossProjectModeDecider()), new RestSqlClearCursorAction(), new RestSqlStatsAction(), new RestSqlAsyncGetResultsAction(), diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlQueryAction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlQueryAction.java index e59ab89c7ed91..ba13c4266d737 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlQueryAction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlQueryAction.java @@ -77,6 +77,7 @@ public final class TransportSqlQueryAction extends HandledTransportAction asyncTaskManagementService; private final ActivityLogger activityLogger; @@ -91,7 +92,8 @@ public TransportSqlQueryAction( SqlLicenseChecker sqlLicenseChecker, BigArrays bigArrays, ActionLoggingFieldsProvider fieldProvider, - ActivityLogWriterProvider logWriterProvider + ActivityLogWriterProvider logWriterProvider, + CrossProjectModeDecider crossProjectModeDecider ) { super(SqlQueryAction.NAME, transportService, actionFilters, SqlQueryRequest::new, EsExecutors.DIRECT_EXECUTOR_SERVICE); @@ -102,6 +104,7 @@ public TransportSqlQueryAction( this.planExecutor = planExecutor; this.sqlLicenseChecker = sqlLicenseChecker; this.transportService = transportService; + this.crossProjectModeDecider = crossProjectModeDecider; asyncTaskManagementService = new AsyncTaskManagementService<>( XPackPlugin.ASYNC_RESULTS_INDEX, @@ -137,7 +140,16 @@ protected void doExecute(Task task, SqlQueryRequest request, ActionListener listener, String username, TransportService transportService, - ClusterService clusterService + ClusterService clusterService, + CrossProjectModeDecider crossProjectModeDecider ) { // The configuration is always created however when dealing with the next page, only the timeouts are relevant // the rest having default values (since the query is already created) - boolean crossProjectEnabled = new CrossProjectModeDecider(clusterService.getSettings()).crossProjectEnabled(); + boolean crossProjectEnabled = crossProjectModeDecider.crossProjectEnabled(); boolean allowPartialSearchResults = request.allowPartialSearchResults() != null ? request.allowPartialSearchResults() : crossProjectEnabled; @@ -295,7 +308,16 @@ public SqlQueryTask createTask( @Override public void execute(SqlQueryRequest request, SqlQueryTask task, ActionListener listener) { - operation(planExecutor, task, request, listener, username(securityContext), transportService, clusterService); + operation( + planExecutor, + task, + request, + listener, + username(securityContext), + transportService, + clusterService, + crossProjectModeDecider + ); } @Override diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlTranslateAction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlTranslateAction.java index eeda755dda51a..c98fe66e44f3d 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlTranslateAction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/TransportSqlTranslateAction.java @@ -47,7 +47,8 @@ public TransportSqlTranslateAction( ThreadPool threadPool, ActionFilters actionFilters, PlanExecutor planExecutor, - SqlLicenseChecker sqlLicenseChecker + SqlLicenseChecker sqlLicenseChecker, + CrossProjectModeDecider cpsDecider ) { super(SqlTranslateAction.NAME, transportService, actionFilters, SqlTranslateRequest::new, EsExecutors.DIRECT_EXECUTOR_SERVICE); @@ -57,7 +58,7 @@ public TransportSqlTranslateAction( this.clusterService = clusterService; this.planExecutor = planExecutor; this.sqlLicenseChecker = sqlLicenseChecker; - this.cpsDecider = new CrossProjectModeDecider(settings); + this.cpsDecider = cpsDecider; } @Override diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/CancellationTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/CancellationTests.java index 534613659e335..5d1500bd4f498 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/CancellationTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/CancellationTests.java @@ -27,6 +27,7 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.tasks.TaskCancelHelper; import org.elasticsearch.tasks.TaskCancelledException; import org.elasticsearch.tasks.TaskId; @@ -88,7 +89,7 @@ public void onFailure(Exception e) { assertThat(e, instanceOf(TaskCancelledException.class)); countDownLatch.countDown(); } - }, "", mock(TransportService.class), mockClusterService); + }, "", mock(TransportService.class), mockClusterService, CrossProjectModeDecider.NOOP); countDownLatch.await(); verify(client, times(1)).settings(); verify(client, times(1)).threadPool(); @@ -142,7 +143,7 @@ public void onFailure(Exception e) { assertThat(e, instanceOf(TaskCancelledException.class)); countDownLatch.countDown(); } - }, "", mock(TransportService.class), mockClusterService); + }, "", mock(TransportService.class), mockClusterService, CrossProjectModeDecider.NOOP); countDownLatch.await(); verify(client, times(1)).fieldCaps(any(), any()); verify(client, times(1)).settings(); @@ -232,7 +233,7 @@ public void onFailure(Exception e) { assertThat(e, instanceOf(TaskCancelledException.class)); countDownLatch.countDown(); } - }, "", mock(TransportService.class), mockClusterService); + }, "", mock(TransportService.class), mockClusterService, CrossProjectModeDecider.NOOP); assertTrue(countDownLatch.await(5, TimeUnit.SECONDS)); // Final verification to ensure no more interaction verify(client).fieldCaps(any(), any()); diff --git a/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/Transform.java b/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/Transform.java index b00753a9cea61..aeaa826346f22 100644 --- a/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/Transform.java +++ b/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/Transform.java @@ -39,7 +39,6 @@ import org.elasticsearch.plugins.SystemIndexPlugin; import org.elasticsearch.rest.RestHandler; import org.elasticsearch.rest.RestStatus; -import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xcontent.NamedXContentRegistry.Entry; import org.elasticsearch.xpack.core.XPackPlugin; @@ -223,9 +222,8 @@ public List getRestHandlers( final Supplier nodesInCluster, Predicate clusterSupportsFeature ) { - var settings = restHandlersServices.settings(); var transformParsingContext = new TransformParsingContext( - new CrossProjectModeDecider(settings).crossProjectEnabled() && TransformConfig.TRANSFORM_CROSS_PROJECT.isEnabled() + restHandlersServices.crossProjectModeDecider().crossProjectEnabled() && TransformConfig.TRANSFORM_CROSS_PROJECT.isEnabled() ); return Arrays.asList( new RestPutTransformAction(transformParsingContext), @@ -280,7 +278,7 @@ public Collection createComponents(PluginServices services) { Client client = services.client(); ClusterService clusterService = services.clusterService(); - var crossProjectModeDecider = new CrossProjectModeDecider(settings); + var crossProjectModeDecider = services.crossProjectModeDecider(); var transformParsingContext = new TransformParsingContext( crossProjectModeDecider.crossProjectEnabled() && TransformConfig.TRANSFORM_CROSS_PROJECT.isEnabled() ); diff --git a/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/VectorTilePlugin.java b/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/VectorTilePlugin.java index 3baac6d1070b3..da8aacd044ab1 100644 --- a/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/VectorTilePlugin.java +++ b/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/VectorTilePlugin.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.vectortile; import org.elasticsearch.cluster.node.DiscoveryNodes; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.features.NodeFeature; import org.elasticsearch.license.XPackLicenseState; import org.elasticsearch.plugins.ActionPlugin; @@ -35,7 +34,6 @@ public List getRestHandlers( Predicate clusterSupportsFeature ) { RestController restController = restHandlersServices.restController(); - Settings settings = restHandlersServices.settings(); - return List.of(new RestVectorTileAction(restController.getSearchUsageHolder(), settings)); + return List.of(new RestVectorTileAction(restController.getSearchUsageHolder(), restHandlersServices.crossProjectModeDecider())); } } diff --git a/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/rest/RestVectorTileAction.java b/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/rest/RestVectorTileAction.java index f14333c8f6328..c68ab8a10de90 100644 --- a/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/rest/RestVectorTileAction.java +++ b/x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/rest/RestVectorTileAction.java @@ -19,7 +19,6 @@ import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.io.stream.BytesStream; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ChunkedToXContent; import org.elasticsearch.geometry.Rectangle; import org.elasticsearch.index.query.BoolQueryBuilder; @@ -92,13 +91,11 @@ public class RestVectorTileAction extends BaseRestHandler { static final String LABEL_POSITION_FIELD_NAME = INTERNAL_AGG_PREFIX + "label_position"; private final SearchUsageHolder searchUsageHolder; - private final Settings settings; private final CrossProjectModeDecider crossProjectModeDecider; - public RestVectorTileAction(SearchUsageHolder searchUsageHolder, Settings settings) { + public RestVectorTileAction(SearchUsageHolder searchUsageHolder, CrossProjectModeDecider crossProjectModeDecider) { this.searchUsageHolder = searchUsageHolder; - this.settings = settings; - this.crossProjectModeDecider = new CrossProjectModeDecider(settings); + this.crossProjectModeDecider = crossProjectModeDecider; } @Override