diff --git a/docs/changelog/104778.yaml b/docs/changelog/104778.yaml new file mode 100644 index 0000000000000..7dae338efc09c --- /dev/null +++ b/docs/changelog/104778.yaml @@ -0,0 +1,5 @@ +pr: 104778 +summary: Adding a `RequestBuilder` interface +area: Ingest Node +type: enhancement +issues: [] diff --git a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java index cf974abf4fda9..34f1701a595de 100644 --- a/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java +++ b/modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamIT.java @@ -11,9 +11,9 @@ import org.elasticsearch.ElasticsearchStatusException; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.action.ActionFuture; -import org.elasticsearch.action.ActionRequestBuilder; import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest; import org.elasticsearch.action.admin.indices.alias.Alias; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; @@ -1831,16 +1831,11 @@ public void onFailure(Exception e) { assertThat(indicesStatsResponse.getIndices().size(), equalTo(2)); } - private static void verifyResolvability(String dataStream, ActionRequestBuilder requestBuilder, boolean fail) { + private static void verifyResolvability(String dataStream, RequestBuilder requestBuilder, boolean fail) { verifyResolvability(dataStream, requestBuilder, fail, 0); } - private static void verifyResolvability( - String dataStream, - ActionRequestBuilder requestBuilder, - boolean fail, - long expectedCount - ) { + private static void verifyResolvability(String dataStream, RequestBuilder requestBuilder, boolean fail, long expectedCount) { if (fail) { String expectedErrorMessage = "no such index [" + dataStream + "]"; if (requestBuilder instanceof MultiSearchRequestBuilder) { diff --git a/server/src/internalClusterTest/java/org/elasticsearch/cluster/NoMasterNodeIT.java b/server/src/internalClusterTest/java/org/elasticsearch/cluster/NoMasterNodeIT.java index d21ec3e343943..d8c91d770437f 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/cluster/NoMasterNodeIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/cluster/NoMasterNodeIT.java @@ -8,7 +8,7 @@ package org.elasticsearch.cluster; -import org.elasticsearch.action.ActionRequestBuilder; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.admin.cluster.configuration.AddVotingConfigExclusionsRequest; import org.elasticsearch.action.admin.cluster.configuration.TransportAddVotingConfigExclusionsAction; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; @@ -189,7 +189,7 @@ public void testNoMasterActions() throws Exception { internalCluster().clearDisruptionScheme(true); } - void checkUpdateAction(boolean autoCreateIndex, TimeValue timeout, ActionRequestBuilder builder) { + void checkUpdateAction(boolean autoCreateIndex, TimeValue timeout, RequestBuilder builder) { // we clean the metadata when loosing a master, therefore all operations on indices will auto create it, if allowed try { builder.get(); @@ -204,7 +204,7 @@ void checkUpdateAction(boolean autoCreateIndex, TimeValue timeout, ActionRequest } } - void checkWriteAction(ActionRequestBuilder builder) { + void checkWriteAction(RequestBuilder builder) { try { builder.get(); fail("Expected ClusterBlockException"); diff --git a/server/src/internalClusterTest/java/org/elasticsearch/cluster/coordination/RareClusterStateIT.java b/server/src/internalClusterTest/java/org/elasticsearch/cluster/coordination/RareClusterStateIT.java index 3869952bf3b7e..9fe9e004d0b7c 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/cluster/coordination/RareClusterStateIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/cluster/coordination/RareClusterStateIT.java @@ -12,9 +12,9 @@ import org.elasticsearch.action.ActionFuture; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequest; -import org.elasticsearch.action.ActionRequestBuilder; import org.elasticsearch.action.ActionResponse; import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.support.PlainActionFuture; import org.elasticsearch.action.support.master.AcknowledgedResponse; @@ -130,7 +130,7 @@ public void onFailure(Exception e) {} } private ActionFuture executeAndCancelCommittedPublication( - ActionRequestBuilder req + RequestBuilder req ) throws Exception { // Wait for no publication in progress to not accidentally cancel a publication different from the one triggered by the given // request. diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/DateMathIndexExpressionsIntegrationIT.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/DateMathIndexExpressionsIntegrationIT.java index 67e8d2fd75d65..fb22aaa3747c2 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/indices/DateMathIndexExpressionsIntegrationIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/DateMathIndexExpressionsIntegrationIT.java @@ -9,9 +9,9 @@ package org.elasticsearch.indices; import org.elasticsearch.action.ActionRequest; -import org.elasticsearch.action.ActionRequestBuilder; import org.elasticsearch.action.ActionResponse; import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.index.IndexNotFoundException; @@ -47,10 +47,7 @@ public void setNow() { * of failing when index resolution with `now` is one day off, this method wraps calls with the assumption that * the day did not change during the test run. */ - public void dateSensitiveGet( - ActionRequestBuilder builder, - Consumer consumer - ) { + public void dateSensitiveGet(RequestBuilder builder, Consumer consumer) { Runnable dayChangeAssumption = () -> assumeTrue( "day changed between requests", ZonedDateTime.now(ZoneOffset.UTC).getDayOfYear() == now.getDayOfYear() diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java index 165b776f1ebc1..5bbedd8dc5870 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java @@ -8,7 +8,7 @@ package org.elasticsearch.indices.settings; -import org.elasticsearch.action.ActionRequestBuilder; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; import org.elasticsearch.cluster.ClusterState; @@ -378,10 +378,7 @@ public void testEngineGCDeletesSetting() throws Exception { prepareIndex("test").setId("1").setSource("f", 1).setVersionType(VersionType.EXTERNAL).setVersion(1).get(); client().prepareDelete("test", "1").setVersionType(VersionType.EXTERNAL).setVersion(2).get(); // delete is still in cache this should fail - ActionRequestBuilder builder = prepareIndex("test").setId("1") - .setSource("f", 3) - .setVersionType(VersionType.EXTERNAL) - .setVersion(1); + RequestBuilder builder = prepareIndex("test").setId("1").setSource("f", 3).setVersionType(VersionType.EXTERNAL).setVersion(1); expectThrows(VersionConflictEngineException.class, builder); assertAcked(indicesAdmin().prepareUpdateSettings("test").setSettings(Settings.builder().put("index.gc_deletes", 0))); diff --git a/server/src/internalClusterTest/java/org/elasticsearch/versioning/SimpleVersioningIT.java b/server/src/internalClusterTest/java/org/elasticsearch/versioning/SimpleVersioningIT.java index 819e14c176975..41fc3d2b759ff 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/versioning/SimpleVersioningIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/versioning/SimpleVersioningIT.java @@ -8,10 +8,10 @@ package org.elasticsearch.versioning; import org.apache.lucene.tests.util.TestUtil; -import org.elasticsearch.action.ActionRequestBuilder; import org.elasticsearch.action.ActionResponse; import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetResponse; @@ -88,7 +88,7 @@ public void testExternalGTE() throws Exception { .get(); assertThat(indexResponse.getVersion(), equalTo(14L)); - ActionRequestBuilder builder1 = prepareIndex("test").setId("1") + RequestBuilder builder1 = prepareIndex("test").setId("1") .setSource("field1", "value1_1") .setVersion(13) .setVersionType(VersionType.EXTERNAL_GTE); @@ -103,7 +103,7 @@ public void testExternalGTE() throws Exception { } // deleting with a lower version fails. - ActionRequestBuilder builder = client().prepareDelete("test", "1").setVersion(2).setVersionType(VersionType.EXTERNAL_GTE); + RequestBuilder builder = client().prepareDelete("test", "1").setVersion(2).setVersionType(VersionType.EXTERNAL_GTE); expectThrows(VersionConflictEngineException.class, builder); // Delete with a higher or equal version deletes all versions up to the given one. @@ -259,11 +259,11 @@ public void testCompareAndSet() { VersionConflictEngineException.class ); - ActionRequestBuilder builder6 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(1); + RequestBuilder builder6 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(1); expectThrows(VersionConflictEngineException.class, builder6); - ActionRequestBuilder builder5 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(2); + RequestBuilder builder5 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(2); expectThrows(VersionConflictEngineException.class, builder5); - ActionRequestBuilder builder4 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2); + RequestBuilder builder4 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2); expectThrows(VersionConflictEngineException.class, builder4); client().admin().indices().prepareRefresh().get(); @@ -295,15 +295,15 @@ public void testCompareAndSet() { assertThat(deleteResponse.getSeqNo(), equalTo(2L)); assertThat(deleteResponse.getPrimaryTerm(), equalTo(1L)); - ActionRequestBuilder builder3 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(1); + RequestBuilder builder3 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(1); expectThrows(VersionConflictEngineException.class, builder3); - ActionRequestBuilder builder2 = client().prepareDelete("test", "1").setIfSeqNo(3).setIfPrimaryTerm(12); + RequestBuilder builder2 = client().prepareDelete("test", "1").setIfSeqNo(3).setIfPrimaryTerm(12); expectThrows(VersionConflictEngineException.class, builder2); - ActionRequestBuilder builder1 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2); + RequestBuilder builder1 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2); expectThrows(VersionConflictEngineException.class, builder1); // the doc is deleted. Even when we hit the deleted seqNo, a conditional delete should fail. - ActionRequestBuilder builder = client().prepareDelete("test", "1").setIfSeqNo(2).setIfPrimaryTerm(1); + RequestBuilder builder = client().prepareDelete("test", "1").setIfSeqNo(2).setIfPrimaryTerm(1); expectThrows(VersionConflictEngineException.class, builder); } @@ -319,16 +319,13 @@ public void testSimpleVersioningWithFlush() throws Exception { assertThat(indexResponse.getSeqNo(), equalTo(1L)); client().admin().indices().prepareFlush().get(); - ActionRequestBuilder builder2 = prepareIndex("test").setId("1") - .setSource("field1", "value1_1") - .setIfSeqNo(0) - .setIfPrimaryTerm(1); + RequestBuilder builder2 = prepareIndex("test").setId("1").setSource("field1", "value1_1").setIfSeqNo(0).setIfPrimaryTerm(1); expectThrows(VersionConflictEngineException.class, builder2); - ActionRequestBuilder builder1 = prepareIndex("test").setId("1").setCreate(true).setSource("field1", "value1_1"); + RequestBuilder builder1 = prepareIndex("test").setId("1").setCreate(true).setSource("field1", "value1_1"); expectThrows(VersionConflictEngineException.class, builder1); - ActionRequestBuilder builder = client().prepareDelete("test", "1").setIfSeqNo(0).setIfPrimaryTerm(1); + RequestBuilder builder = client().prepareDelete("test", "1").setIfSeqNo(0).setIfPrimaryTerm(1); expectThrows(VersionConflictEngineException.class, builder); for (int i = 0; i < 10; i++) { diff --git a/server/src/main/java/org/elasticsearch/action/ActionRequestBuilder.java b/server/src/main/java/org/elasticsearch/action/ActionRequestBuilder.java index 32d65d743e6a6..32c8bcf155522 100644 --- a/server/src/main/java/org/elasticsearch/action/ActionRequestBuilder.java +++ b/server/src/main/java/org/elasticsearch/action/ActionRequestBuilder.java @@ -13,7 +13,9 @@ import java.util.Objects; -public abstract class ActionRequestBuilder { +public abstract class ActionRequestBuilder + implements + RequestBuilder { protected final ActionType action; protected final Request request; diff --git a/server/src/main/java/org/elasticsearch/action/RequestBuilder.java b/server/src/main/java/org/elasticsearch/action/RequestBuilder.java new file mode 100644 index 0000000000000..5db55d6569876 --- /dev/null +++ b/server/src/main/java/org/elasticsearch/action/RequestBuilder.java @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +package org.elasticsearch.action; + +import org.elasticsearch.core.RefCounted; +import org.elasticsearch.core.TimeValue; + +public interface RequestBuilder { + /** + * This method returns the request that this builder builds. Depending on the implementation, it might return a new request with each + * call or the same request with each call. + */ + Request request(); + + ActionFuture execute(); + + Response get(); + + Response get(TimeValue timeout); + + void execute(ActionListener listener); +} diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java index e3feefea0d8cc..ab4fd807216e5 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -40,7 +40,7 @@ import org.apache.lucene.util.SetOnce; import org.elasticsearch.TransportVersion; import org.elasticsearch.action.ActionFuture; -import org.elasticsearch.action.ActionRequestBuilder; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.support.PlainActionFuture; import org.elasticsearch.action.support.SubscribableListener; import org.elasticsearch.bootstrap.BootstrapForTesting; @@ -2145,7 +2145,7 @@ public static T expectThrows(Class expectedType, Action ); } - public static T expectThrows(Class expectedType, ActionRequestBuilder builder) { + public static T expectThrows(Class expectedType, RequestBuilder builder) { return expectThrows( expectedType, "Expected exception " + expectedType.getSimpleName() + " but no exception was thrown", diff --git a/test/framework/src/main/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java b/test/framework/src/main/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java index dc48868703bbb..99cf880a83604 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java +++ b/test/framework/src/main/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java @@ -14,8 +14,8 @@ import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.action.ActionFuture; import org.elasticsearch.action.ActionRequest; -import org.elasticsearch.action.ActionRequestBuilder; import org.elasticsearch.action.ActionResponse; +import org.elasticsearch.action.RequestBuilder; import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequestBuilder; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; @@ -99,7 +99,7 @@ public class ElasticsearchAssertions { - public static void assertAcked(ActionRequestBuilder builder) { + public static void assertAcked(RequestBuilder builder) { assertAcked(builder, TimeValue.timeValueSeconds(30)); } @@ -107,7 +107,7 @@ public static void assertAcked(ActionFuture fu assertAcked(future.actionGet()); } - public static void assertAcked(ActionRequestBuilder builder, TimeValue timeValue) { + public static void assertAcked(RequestBuilder builder, TimeValue timeValue) { assertAcked(builder.get(timeValue)); } @@ -141,7 +141,7 @@ public static void assertAcked(CreateIndexResponse response) { * * @param builder the request builder */ - public static void assertBlocked(ActionRequestBuilder builder) { + public static void assertBlocked(RequestBuilder builder) { assertBlocked(builder, (ClusterBlock) null); } @@ -179,7 +179,7 @@ public static void assertBlocked(BaseBroadcastResponse replicatedBroadcastRespon * @param builder the request builder * @param expectedBlockId the expected block id */ - public static void assertBlocked(final ActionRequestBuilder builder, @Nullable final Integer expectedBlockId) { + public static void assertBlocked(final RequestBuilder builder, @Nullable final Integer expectedBlockId) { var e = ESTestCase.expectThrows(ClusterBlockException.class, builder); assertThat(e.blocks(), not(empty())); RestStatus status = checkRetryableBlock(e.blocks()) ? RestStatus.TOO_MANY_REQUESTS : RestStatus.FORBIDDEN; @@ -200,7 +200,7 @@ public static void assertBlocked(final ActionRequestBuilder builder, @Null * @param builder the request builder * @param expectedBlock the expected block */ - public static void assertBlocked(final ActionRequestBuilder builder, @Nullable final ClusterBlock expectedBlock) { + public static void assertBlocked(final RequestBuilder builder, @Nullable final ClusterBlock expectedBlock) { assertBlocked(builder, expectedBlock != null ? expectedBlock.id() : null); } @@ -340,12 +340,12 @@ public static void assertSearchHit(SearchResponse searchResponse, int number, Ma assertThat(searchResponse.getHits().getAt(number - 1), matcher); } - public static void assertNoFailures(ActionRequestBuilder searchRequestBuilder) { + public static void assertNoFailures(RequestBuilder searchRequestBuilder) { assertNoFailuresAndResponse(searchRequestBuilder, r -> {}); } public static void assertNoFailuresAndResponse( - ActionRequestBuilder searchRequestBuilder, + RequestBuilder searchRequestBuilder, Consumer consumer ) { assertResponse(searchRequestBuilder, res -> { @@ -366,7 +366,7 @@ public static void assertNoFailuresAndResponse(ActionFuture resp } public static void assertResponse( - ActionRequestBuilder searchRequestBuilder, + RequestBuilder searchRequestBuilder, Consumer consumer ) { var res = searchRequestBuilder.get(); @@ -430,7 +430,7 @@ public static void assertResponse(ActionFuture res } public static void assertCheckedResponse( - ActionRequestBuilder searchRequestBuilder, + RequestBuilder searchRequestBuilder, CheckedConsumer consumer ) throws IOException { var res = searchRequestBuilder.get(); @@ -692,7 +692,7 @@ public static T assertBooleanSubQuery(Query query, Class su * Run the request from a given builder and check that it throws an exception of the right type, with a given {@link RestStatus} */ public static void assertRequestBuilderThrows( - ActionRequestBuilder builder, + RequestBuilder builder, Class exceptionClass, RestStatus status ) { @@ -705,7 +705,7 @@ public static void assertRequestBuilderThrows( * @param extraInfo extra information to add to the failure message */ public static void assertRequestBuilderThrows( - ActionRequestBuilder builder, + RequestBuilder builder, Class exceptionClass, String extraInfo ) { @@ -767,11 +767,11 @@ public static void assertFutureThrows( } } - public static void assertRequestBuilderThrows(ActionRequestBuilder builder, RestStatus status) { + public static void assertRequestBuilderThrows(RequestBuilder builder, RestStatus status) { assertFutureThrows(builder.execute(), status); } - public static void assertRequestBuilderThrows(ActionRequestBuilder builder, RestStatus status, String extraInfo) { + public static void assertRequestBuilderThrows(RequestBuilder builder, RestStatus status, String extraInfo) { assertFutureThrows(builder.execute(), status, extraInfo); }