diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java index 6240ac7fd15e9..6135411f14ea2 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/lifecycle/action/TransportGetDataStreamLifecycleStatsActionTests.java @@ -52,7 +52,7 @@ public class TransportGetDataStreamLifecycleStatsActionTests extends ESTestCase mock(ThreadPool.class), mock(ActionFilters.class), dataStreamLifecycleService, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); private Long lastRunDuration; private Long timeBetweenStarts; diff --git a/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java b/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java index f154e5bd17ae0..051ba6db4f736 100644 --- a/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java +++ b/server/src/test/java/org/elasticsearch/action/ActionModuleTests.java @@ -134,7 +134,7 @@ public void testSetupRestHandlerContainsKnownBuiltin() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); actionModule.initRestHandlers(null, 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 @@ -201,7 +201,7 @@ public String getName() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); Exception e = expectThrows(IllegalArgumentException.class, () -> actionModule.initRestHandlers(null, null)); assertThat(e.getMessage(), startsWith("Cannot replace existing handler for [/_nodes] for method: GET")); @@ -261,7 +261,7 @@ public List getRestHandlers( List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); actionModule.initRestHandlers(null, 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 @@ -314,7 +314,7 @@ public void test3rdPartyHandlerIsNotInstalled() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ) ); assertThat( @@ -358,7 +358,7 @@ public void test3rdPartyRestControllerIsNotInstalled() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ) ); assertThat( diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/template/reservedstate/ReservedComposableIndexTemplateActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/template/reservedstate/ReservedComposableIndexTemplateActionTests.java index 237b7d1d2af78..eacd2d4edc276 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/template/reservedstate/ReservedComposableIndexTemplateActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/template/reservedstate/ReservedComposableIndexTemplateActionTests.java @@ -694,7 +694,7 @@ public void testHandlerCorrectness() { threadPool, null, mock(ActionFilters.class), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); assertEquals(ReservedComposableIndexTemplateAction.NAME, putIndexAction.reservedStateHandlerName().get()); assertThat( @@ -707,7 +707,7 @@ public void testHandlerCorrectness() { threadPool, null, mock(ActionFilters.class), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); assertEquals(ReservedComposableIndexTemplateAction.NAME, delIndexAction.reservedStateHandlerName().get()); assertThat( @@ -722,7 +722,7 @@ public void testHandlerCorrectness() { null, mock(ActionFilters.class), indexScopedSettings, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); assertEquals(ReservedComposableIndexTemplateAction.NAME, putComponentAction.reservedStateHandlerName().get()); assertThat( @@ -736,7 +736,7 @@ public void testHandlerCorrectness() { threadPool, null, mock(ActionFilters.class), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); assertEquals(ReservedComposableIndexTemplateAction.NAME, delComponentAction.reservedStateHandlerName().get()); assertThat( @@ -959,7 +959,7 @@ public void testTemplatesWithReservedPrefix() throws Exception { threadPool, null, mock(ActionFilters.class), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); // Try fake REST modification request with validate_template, this will fail diff --git a/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java b/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java index 9d21ca9e630da..2908bff995340 100644 --- a/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/ClusterModuleTests.java @@ -166,7 +166,7 @@ public Collection createAllocationDeciders(Settings settings, null, threadPool, EmptySystemIndices.INSTANCE, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), WriteLoadForecaster.DEFAULT, TelemetryProvider.NOOP ) @@ -185,7 +185,7 @@ public Collection createAllocationDeciders(Settings settings, null, threadPool, EmptySystemIndices.INSTANCE, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), WriteLoadForecaster.DEFAULT, TelemetryProvider.NOOP ); @@ -203,7 +203,7 @@ public Map> getShardsAllocators(Settings setti null, threadPool, EmptySystemIndices.INSTANCE, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), WriteLoadForecaster.DEFAULT, TelemetryProvider.NOOP ); @@ -239,7 +239,7 @@ public void testUnknownShardsAllocator() { null, threadPool, EmptySystemIndices.INSTANCE, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), WriteLoadForecaster.DEFAULT, TelemetryProvider.NOOP ) @@ -303,7 +303,7 @@ public void testRejectsReservedExistingShardsAllocatorName() { null, threadPool, EmptySystemIndices.INSTANCE, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), WriteLoadForecaster.DEFAULT, TelemetryProvider.NOOP ); @@ -319,7 +319,7 @@ public void testRejectsDuplicateExistingShardsAllocatorName() { null, threadPool, EmptySystemIndices.INSTANCE, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), WriteLoadForecaster.DEFAULT, TelemetryProvider.NOOP ); diff --git a/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java b/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java index b075e08a9ea0f..0dd79efaf9bfe 100644 --- a/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java +++ b/server/src/test/java/org/elasticsearch/http/AbstractHttpServerTransportTests.java @@ -1184,7 +1184,7 @@ public Collection getRestHeaders() { List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); } diff --git a/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java b/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java index 7c5fe13d9a3cf..260aac9c02128 100644 --- a/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java +++ b/server/src/test/java/org/elasticsearch/ingest/IngestServiceTests.java @@ -160,7 +160,7 @@ public void testIngestPlugin() { client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); Map factories = ingestService.getProcessorFactories(); assertTrue(factories.containsKey("foo")); @@ -181,7 +181,7 @@ public void testIngestPluginDuplicate() { client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ) ); assertTrue(e.getMessage(), e.getMessage().contains("already registered")); @@ -199,7 +199,7 @@ public void testExecuteIndexPipelineDoesNotExist() { client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); final IndexRequest indexRequest = new IndexRequest("_index").id("_id") .source(Map.of()) @@ -2440,7 +2440,7 @@ public Map getProcessors(Processor.Parameters paramet client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); ingestService.addIngestClusterStateListener(ingestClusterStateListener); @@ -2929,7 +2929,7 @@ private void testUpdatingPipeline(String pipelineString) throws Exception { client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); ingestService.applyClusterState(new ClusterChangedEvent("", clusterState, clusterState)); @@ -3263,7 +3263,7 @@ public Map getProcessors(final Processor.Parameters p client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); if (randomBoolean()) { /* diff --git a/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java b/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java index be60f6f02d6e5..98fd9e63d0795 100644 --- a/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java +++ b/server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java @@ -2403,7 +2403,7 @@ public RecyclerBytesStreamOutput newNetworkBytesStream() { client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ), client, actionFilters, @@ -2541,7 +2541,7 @@ public RecyclerBytesStreamOutput newNetworkBytesStream() { threadPool, allocationService, actionFilters, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ) ); actions.put( diff --git a/test/framework/src/main/java/org/elasticsearch/cluster/project/TestProjectResolvers.java b/test/framework/src/main/java/org/elasticsearch/cluster/project/TestProjectResolvers.java index 951b5da7cfab9..c66df541f6f76 100644 --- a/test/framework/src/main/java/org/elasticsearch/cluster/project/TestProjectResolvers.java +++ b/test/framework/src/main/java/org/elasticsearch/cluster/project/TestProjectResolvers.java @@ -57,10 +57,9 @@ public boolean supportsMultipleProjects() { /** * This method returns a ProjectResolver that is unable to provide the project-id unless explicitly specified - * with the executeOnProject method. This is mostly useful in places where we just need a placeholder to satisfy - * the constructor signature. + * with the executeOnProject method. */ - public static ProjectResolver singleProjectOnly() { + public static ProjectResolver mustExecuteFirst() { return new ProjectResolver() { private ProjectId enforceProjectId = null; @@ -100,14 +99,48 @@ public boolean supportsMultipleProjects() { }; } + private static final ProjectResolver ALWAYS_THROW = new ProjectResolver() { + @Override + public void executeOnProject(ProjectId projectId, CheckedRunnable body) throws E { + throw new UnsupportedOperationException("Method on the dummy ProjectResolver is not meant to be invoked"); + } + + @Override + public ProjectId getProjectId() { + throw new UnsupportedOperationException("Method on the dummy ProjectResolver is not meant to be invoked"); + } + + @Override + public boolean supportsMultipleProjects() { + throw new UnsupportedOperationException("Method on the dummy ProjectResolver is not meant to be invoked"); + } + }; + + /** + * This method returns a ProjectResolver that always throw for all methods. This is mostly useful in places where + * we just need a placeholder to satisfy the constructor signature. + */ + public static ProjectResolver alwaysThrow() { + return ALWAYS_THROW; + } + /** * This method returns a ProjectResolver that gives back the specified project-id when its getProjectId method is called. - * It also assumes it is the only project in the cluster state and throws if that is not the case. + * The ProjectResolver can work with cluster state containing multiple projects and its supportsMultipleProjects returns true. */ public static ProjectResolver singleProject(ProjectId projectId) { return singleProject(projectId, false); } + /** + * This method returns a ProjectResolver that returns the given ProjectId. + * It also assumes it is the only project in the cluster state and throws if that is not the case. + * In addition, the ProjectResolvers returns false for supportsMultipleProjects. + */ + public static ProjectResolver singleProjectOnly(ProjectId projectId) { + return singleProject(projectId, true); + } + private static ProjectResolver singleProject(ProjectId projectId, boolean only) { Objects.requireNonNull(projectId); return new ProjectResolver() { @@ -144,7 +177,7 @@ public void executeOnProject(ProjectId otherProjectId, Che @Override public boolean supportsMultipleProjects() { - return true; + return only == false; } }; } diff --git a/test/framework/src/test/java/org/elasticsearch/cluster/project/TestProjectResolversTests.java b/test/framework/src/test/java/org/elasticsearch/cluster/project/TestProjectResolversTests.java index 39a1ef7f48d72..be6ae83c4ec5f 100644 --- a/test/framework/src/test/java/org/elasticsearch/cluster/project/TestProjectResolversTests.java +++ b/test/framework/src/test/java/org/elasticsearch/cluster/project/TestProjectResolversTests.java @@ -20,6 +20,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; public class TestProjectResolversTests extends ESTestCase { @@ -37,17 +38,38 @@ public void testAllProjects() { public void testSingleProject() { final ProjectId projectId = randomUniqueProjectId(); final ProjectResolver projectResolver = TestProjectResolvers.singleProject(projectId); + assertThat(projectResolver.supportsMultipleProjects(), is(true)); assertThat(projectResolver.getProjectId(), equalTo(projectId)); ClusterState state = buildClusterState(projectId, randomIntBetween(0, 10)); assertThat(projectResolver.getProjectMetadata(state), notNullValue()); } - public void testSingleProjectOnly_getProjectIdAndMetadata() { + public void testAlwaysThrowProjectResolver() { + final ProjectResolver projectResolver = TestProjectResolvers.alwaysThrow(); + expectThrows(UnsupportedOperationException.class, projectResolver::getProjectId); + expectThrows(UnsupportedOperationException.class, projectResolver::supportsMultipleProjects); + expectThrows(UnsupportedOperationException.class, () -> projectResolver.executeOnProject(randomProjectIdOrDefault(), () -> {})); + expectThrows( + UnsupportedOperationException.class, + () -> projectResolver.getProjectMetadata(buildClusterState(randomProjectIdOrDefault(), randomIntBetween(0, 10))) + ); + } + + public void testDefaultProjectOnly() { + final ProjectResolver projectResolver = TestProjectResolvers.DEFAULT_PROJECT_ONLY; + assertThat(projectResolver.supportsMultipleProjects(), is(false)); + assertThat(projectResolver.getProjectId(), equalTo(ProjectId.DEFAULT)); + + ClusterState state = buildClusterState(ProjectId.DEFAULT, 0); + assertThat(projectResolver.getProjectMetadata(state), notNullValue()); + } + + public void testMustExecuteFirst_getProjectIdAndMetadata() { final ProjectId projectId = randomUniqueProjectId(); final ClusterState state = buildClusterState(projectId); - final ProjectResolver projectResolver = TestProjectResolvers.singleProjectOnly(); + final ProjectResolver projectResolver = TestProjectResolvers.mustExecuteFirst(); expectThrows(UnsupportedOperationException.class, projectResolver::getProjectId); expectThrows(UnsupportedOperationException.class, () -> projectResolver.getProjectMetadata(state)); @@ -57,9 +79,9 @@ public void testSingleProjectOnly_getProjectIdAndMetadata() { }); } - public void testSingleProjectOnly_getProjectIds() { + public void testMustExecuteFirst_getProjectIds() { { - final ProjectResolver projectResolver = TestProjectResolvers.singleProjectOnly(); + final ProjectResolver projectResolver = TestProjectResolvers.mustExecuteFirst(); final ProjectId projectId = randomUniqueProjectId(); ClusterState state = buildClusterState(projectId); assertThat(state.metadata().projects().values(), hasSize(1)); @@ -71,7 +93,7 @@ public void testSingleProjectOnly_getProjectIds() { }); } { - final ProjectResolver projectResolver = TestProjectResolvers.singleProjectOnly(); + final ProjectResolver projectResolver = TestProjectResolvers.mustExecuteFirst(); final ProjectId projectId = randomUniqueProjectId(); ClusterState state = buildClusterState(projectId, randomIntBetween(1, 10)); assertThat(state.metadata().projects().values().size(), greaterThan(1)); diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/async/AsyncTaskMaintenanceServiceTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/async/AsyncTaskMaintenanceServiceTests.java index 491d2077039d8..27444c5efb5c8 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/async/AsyncTaskMaintenanceServiceTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/async/AsyncTaskMaintenanceServiceTests.java @@ -102,7 +102,7 @@ public void testStartStopDuringClusterChanges() { return null; }).when(client).execute(same(DeleteByQueryAction.INSTANCE), any(DeleteByQueryRequest.class), any(ActionListener.class)); - final ProjectResolver projectResolver = Mockito.spy(TestProjectResolvers.singleProjectOnly()); + final ProjectResolver projectResolver = Mockito.spy(TestProjectResolvers.mustExecuteFirst()); final AsyncTaskMaintenanceService service = new AsyncTaskMaintenanceService( clusterService, diff --git a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/action/InternalExecutePolicyActionTests.java b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/action/InternalExecutePolicyActionTests.java index 99df6c7c1c87d..8c91fb5a38e9b 100644 --- a/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/action/InternalExecutePolicyActionTests.java +++ b/x-pack/plugin/enrich/src/test/java/org/elasticsearch/xpack/enrich/action/InternalExecutePolicyActionTests.java @@ -35,7 +35,7 @@ public void instantiateTransportAction() { transportService, mock(ActionFilters.class), null, - TestProjectResolvers.singleProjectOnly(), + TestProjectResolvers.alwaysThrow(), null ); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportGetTrainedModelsStatsActionTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportGetTrainedModelsStatsActionTests.java index 28d39d3f1682c..41947fb152adc 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportGetTrainedModelsStatsActionTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/action/TransportGetTrainedModelsStatsActionTests.java @@ -149,7 +149,7 @@ public void setUpVariables() { client, null, FailureStoreMetrics.NOOP, - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); } 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 d2873654275da..40acb9a32f1bc 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 @@ -228,7 +228,7 @@ private Collection createComponentsUtil(Settings settings) throws Except TestIndexNameExpressionResolver.newInstance(threadContext), TelemetryProvider.NOOP, mock(PersistentTasksService.class), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); } @@ -862,7 +862,7 @@ public void testSecurityRestHandlerInterceptorCanBeInstalled() throws IllegalAcc List.of(), RestExtension.allowAll(), new IncrementalBulkService(null, null), - TestProjectResolvers.singleProjectOnly() + TestProjectResolvers.alwaysThrow() ); actionModule.initRestHandlers(null, null);