From 9378473647cd5a26519fd1dac6be8e445643c580 Mon Sep 17 00:00:00 2001 From: olcbean Date: Mon, 12 Feb 2018 13:27:00 +0100 Subject: [PATCH 1/5] Add Cluster Update Settings API to the high level REST client --- .../elasticsearch/client/ClusterClient.java | 66 +++++++ .../org/elasticsearch/client/Request.java | 12 ++ .../client/RestHighLevelClient.java | 10 ++ .../elasticsearch/client/ClusterClientIT.java | 108 ++++++++++++ .../elasticsearch/client/IndicesClientIT.java | 1 - .../elasticsearch/client/RequestTests.java | 33 +++- .../ClusterClientDocumentationIT.java | 164 ++++++++++++++++++ .../IndicesClientDocumentationIT.java | 2 +- .../cluster/update_settings.asciidoc | 128 ++++++++++++++ .../high-level/indices/put_mapping.asciidoc | 2 +- .../high-level/supported-apis.asciidoc | 7 + .../ClusterUpdateSettingsRequest.java | 59 ++++++- .../ClusterUpdateSettingsResponse.java | 36 +++- .../support/master/AcknowledgedResponse.java | 2 +- .../ClusterUpdateSettingsRequestTests.java | 62 +++++++ .../ClusterUpdateSettingsResponseTests.java | 69 ++++++++ 16 files changed, 745 insertions(+), 16 deletions(-) create mode 100644 client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java create mode 100644 client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java create mode 100644 client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java create mode 100644 docs/java-rest/high-level/cluster/update_settings.asciidoc create mode 100644 server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java create mode 100644 server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java new file mode 100644 index 0000000000000..c4cd36e512445 --- /dev/null +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java @@ -0,0 +1,66 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client; + +import org.apache.http.Header; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse; + +import java.io.IOException; + +import static java.util.Collections.emptySet; + +/** + * A wrapper for the {@link RestHighLevelClient} that provides methods for accessing the cluster api. + *

+ * See Indices API on elastic.co + */ +public final class ClusterClient { + private final RestHighLevelClient restHighLevelClient; + + ClusterClient(RestHighLevelClient restHighLevelClient) { + this.restHighLevelClient = restHighLevelClient; + } + + /** + * Updates cluster wide specific settings using the Cluster Update Settings API + *

+ * See Cluster Update Settings + * API on elastic.co + */ + public ClusterUpdateSettingsResponse updateSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers) + throws IOException { + return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, Request::clusterUpdateSettings, + ClusterUpdateSettingsResponse::fromXContent, emptySet(), headers); + } + + /** + * Asynchronously updates cluster wide specific settings using the Cluster Update Settings API + *

+ * See Cluster Update Settings + * API on elastic.co + */ + public void updateSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, + ActionListener listener, Header... headers) { + restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, Request::clusterUpdateSettings, + ClusterUpdateSettingsResponse::fromXContent, listener, emptySet(), headers); + } +} diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java index 4ec7315b73b58..c44ce440f7c4f 100755 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java @@ -29,6 +29,7 @@ import org.apache.http.entity.ContentType; import org.apache.lucene.util.BytesRef; import org.elasticsearch.action.DocWriteRequest; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest; import org.elasticsearch.action.admin.indices.close.CloseIndexRequest; @@ -528,6 +529,17 @@ private static Request resize(ResizeRequest resizeRequest) throws IOException { return new Request(HttpPut.METHOD_NAME, endpoint, params.getParams(), entity); } + static Request clusterUpdateSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest) throws IOException { + Params parameters = Params.builder(); + parameters.withFlatSettings(clusterUpdateSettingsRequest.flatSettings()); + parameters.withTimeout(clusterUpdateSettingsRequest.timeout()); + parameters.withMasterTimeout(clusterUpdateSettingsRequest.masterNodeTimeout()); + + String endpoint = buildEndpoint("_cluster/settings"); + HttpEntity entity = createEntity(clusterUpdateSettingsRequest, REQUEST_BODY_CONTENT_TYPE); + return new Request(HttpPut.METHOD_NAME, endpoint, parameters.getParams(), entity); + } + private static HttpEntity createEntity(ToXContent toXContent, XContentType xContentType) throws IOException { BytesRef source = XContentHelper.toXContent(toXContent, xContentType, false).toBytesRef(); return new ByteArrayEntity(source.bytes, source.offset, source.length, createContentType(xContentType)); diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index 51c6f40c6e372..0d8e6eb03207f 100755 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -186,6 +186,7 @@ public class RestHighLevelClient implements Closeable { private final CheckedConsumer doClose; private final IndicesClient indicesClient = new IndicesClient(this); + private final ClusterClient clusterClient = new ClusterClient(this); /** * Creates a {@link RestHighLevelClient} given the low level {@link RestClientBuilder} that allows to build the @@ -240,6 +241,15 @@ public final IndicesClient indices() { return indicesClient; } + /** + * Provides a {@link ClusterClient} which can be used to access the Clustre API. + * + * See Cluster API on elastic.co + */ + public final ClusterClient cluster() { + return clusterClient; + } + /** * Executes a bulk request using the Bulk API * diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java new file mode 100644 index 0000000000000..015dd0cfe4921 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java @@ -0,0 +1,108 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client; + +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse; +import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.unit.ByteSizeUnit; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.common.xcontent.support.XContentMapValues; +import org.elasticsearch.indices.recovery.RecoverySettings; +import org.elasticsearch.rest.RestStatus; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; + +public class ClusterClientIT extends ESRestHighLevelClientTestCase { + + public void testClusterUpdateSettings() throws IOException { + final String transientSettingKey = RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); + final int transientSettingValue = 10; + + final String persistentSettingKey = EnableAllocationDecider.CLUSTER_ROUTING_ALLOCATION_ENABLE_SETTING.getKey(); + final String persistentSettingValue = EnableAllocationDecider.Allocation.NONE.name(); + + Settings transientSettings = Settings.builder().put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES).build(); + Map map = new HashMap<>(); + map.put(persistentSettingKey, persistentSettingValue); + + ClusterUpdateSettingsRequest setRequest = new ClusterUpdateSettingsRequest(); + setRequest.transientSettings(transientSettings); + setRequest.persistentSettings(map); + + ClusterUpdateSettingsResponse setResponse = execute(setRequest, highLevelClient().cluster()::updateSettings, + highLevelClient().cluster()::updateSettingsAsync); + + assertAcked(setResponse); + assertThat(setResponse.getTransientSettings().get(transientSettingKey), notNullValue()); + assertThat(setResponse.getTransientSettings().get(persistentSettingKey), nullValue()); + assertThat(setResponse.getTransientSettings().get(transientSettingKey), + equalTo(transientSettingValue + ByteSizeUnit.BYTES.getSuffix())); + assertThat(setResponse.getPersistentSettings().get(transientSettingKey), nullValue()); + assertThat(setResponse.getPersistentSettings().get(persistentSettingKey), notNullValue()); + assertThat(setResponse.getPersistentSettings().get(persistentSettingKey), equalTo(persistentSettingValue)); + + Map setMap = getAsMap("/_cluster/settings"); + String transietSetValue = (String) XContentMapValues.extractValue("transient." + transientSettingKey, setMap); + assertThat(transietSetValue, equalTo(transientSettingValue + ByteSizeUnit.BYTES.getSuffix())); + String persistentSetValue = (String) XContentMapValues.extractValue("persistent." + persistentSettingKey, setMap); + assertThat(persistentSetValue, equalTo(persistentSettingValue)); + + ClusterUpdateSettingsRequest reserRequest = new ClusterUpdateSettingsRequest(); + reserRequest.transientSettings(Settings.builder().putNull(transientSettingKey)); + reserRequest.persistentSettings("{\"" + persistentSettingKey + "\": null }", XContentType.JSON); + + ClusterUpdateSettingsResponse resetResponse = execute(reserRequest, highLevelClient().cluster()::updateSettings, + highLevelClient().cluster()::updateSettingsAsync); + + assertThat(resetResponse.getTransientSettings().get(transientSettingKey), equalTo(null)); + assertThat(resetResponse.getPersistentSettings().get(persistentSettingKey), equalTo(null)); + assertThat(resetResponse.getTransientSettings(), equalTo(Settings.EMPTY)); + assertThat(resetResponse.getPersistentSettings(), equalTo(Settings.EMPTY)); + + Map resetMap = getAsMap("/_cluster/settings"); + String transietResetValue = (String) XContentMapValues.extractValue("transient." + transientSettingKey, resetMap); + assertThat(transietResetValue, equalTo(null)); + String persistentResetValue = (String) XContentMapValues.extractValue("persistent." + persistentSettingKey, resetMap); + assertThat(persistentResetValue, equalTo(null)); + } + + public void testClusterUpdateSettingNonExistent() { + String setting = "no_idea_what_you_are_talking_about"; + int value = 10; + ClusterUpdateSettingsRequest clusterUpdateSettingsRequest = new ClusterUpdateSettingsRequest(); + clusterUpdateSettingsRequest.transientSettings(Settings.builder().put(setting, value).build()); + + ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(clusterUpdateSettingsRequest, + highLevelClient().cluster()::updateSettings, highLevelClient().cluster()::updateSettingsAsync)); + assertThat(exception.status(), equalTo(RestStatus.BAD_REQUEST)); + assertThat(exception.getMessage(), equalTo( + "Elasticsearch exception [type=illegal_argument_exception, reason=transient setting [" + setting + "], not recognized]")); + } +} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java index 5baef93c0dee1..b8c9f4e76c25e 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java @@ -167,7 +167,6 @@ public void testCreateIndex() throws IOException { } } - @SuppressWarnings({"unchecked", "rawtypes"}) public void testPutMapping() throws IOException { { // Add mappings to index diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java index 3e4add16707ff..6cb2b908d540e 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -30,6 +30,8 @@ import org.apache.http.entity.StringEntity; import org.apache.http.util.EntityUtils; import org.elasticsearch.action.DocWriteRequest; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; +import org.elasticsearch.action.admin.cluster.shards.ClusterSearchShardsRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions; import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest; @@ -39,6 +41,7 @@ import org.elasticsearch.action.admin.indices.get.GetIndexRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.admin.indices.open.OpenIndexRequest; +import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest; import org.elasticsearch.action.admin.indices.shrink.ResizeRequest; import org.elasticsearch.action.admin.indices.shrink.ResizeType; import org.elasticsearch.action.bulk.BulkRequest; @@ -93,6 +96,7 @@ import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.RandomObjects; +import org.junit.Test; import java.io.IOException; import java.io.InputStream; @@ -1115,14 +1119,10 @@ private static void resizeTest(ResizeType resizeType, CheckedFunction expectedParams = new HashMap<>(); + setRandomFlatSettings(request::flatSettings, expectedParams); + setRandomMasterTimeout(request, expectedParams); + setRandomTimeout(request::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); + + Request expectedRequest = Request.clusterUpdateSettings(request); + assertEquals("/_cluster/settings", expectedRequest.getEndpoint()); + assertEquals(HttpPut.METHOD_NAME, expectedRequest.getMethod()); + assertEquals(expectedParams, expectedRequest.getParameters()); + } private static void assertToXContentBody(ToXContent expectedBody, HttpEntity actualEntity) throws IOException { BytesReference expectedBytes = XContentHelper.toXContent(expectedBody, REQUEST_BODY_CONTENT_TYPE, false); @@ -1319,6 +1332,14 @@ private static void setRandomTimeout(Consumer setter, TimeValue defaultT } } + private static void setRandomFlatSettings(Consumer setter, Map expectedParams) { + if (randomBoolean()) { + boolean flatSettings = randomBoolean(); + setter.accept(flatSettings); + expectedParams.put("flat_settings", String.valueOf(flatSettings)); + } + } + private static void setRandomMasterTimeout(MasterNodeRequest request, Map expectedParams) { if (randomBoolean()) { String masterTimeout = randomTimeValue(); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java new file mode 100644 index 0000000000000..d915e8d0ebd30 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java @@ -0,0 +1,164 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client.documentation; + +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.LatchedActionListener; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; +import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse; +import org.elasticsearch.client.ESRestHighLevelClientTestCase; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.unit.ByteSizeUnit; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.indices.recovery.RecoverySettings; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +import static org.hamcrest.Matchers.equalTo; + +/** + * This class is used to generate the Java Cluster API documentation. + * You need to wrap your code between two tags like: + * // tag::example[] + * // end::example[] + * + * Where example is your tag name. + * + * Then in the documentation, you can extract what is between tag and end tags with + * ["source","java",subs="attributes,callouts,macros"] + * -------------------------------------------------- + * include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[example] + * -------------------------------------------------- + */ +public class ClusterClientDocumentationIT extends ESRestHighLevelClientTestCase { + + public void testClusterUpdateSettings() throws IOException { + RestHighLevelClient client = highLevelClient(); + + // tag::update-settings-request + ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); + // end::indices-exists-request + + // tag::update-settings-create-settings + String transientSettingKey = RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); + int transientSettingValue = 10; + + String persistentSettingKey = EnableAllocationDecider.CLUSTER_ROUTING_ALLOCATION_ENABLE_SETTING.getKey(); + String persistentSettingValue = EnableAllocationDecider.Allocation.NONE.name(); + + Settings transientSettings = Settings.builder().put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES).build(); // <1> + Settings persistentSettings = Settings.builder().put(persistentSettingKey, persistentSettingValue).build(); + // end::update-settings-create-settings + + // tag::update-settings-request-cluster-settings + request.transientSettings(transientSettings); // <1> + request.persistentSettings(persistentSettings); // <2> + // tag::update-settings-request-cluster-settings + + { + // tag::update-settings-settings-builder + Settings.Builder transientSettingsBuilder = Settings.builder().put(transientSettingKey, transientSettingValue, + ByteSizeUnit.BYTES); + request.transientSettings(transientSettingsBuilder); // <1> + // tag::update-settings-settings-builder + } + { + // tag::update-settings-settings-map + Map map = new HashMap<>(); + map.put(transientSettingKey, transientSettingValue + ByteSizeUnit.BYTES.getSuffix()); + request.transientSettings(map); // <1> + // tag::update-settings-settings-map + } + { + // tag::update-settings-settings-source + request.transientSettings("{\"indices.recovery.max_bytes_per_sec\": \"10b\"}", XContentType.JSON); // <1> + // tag::update-settings-settings-source + } + + // tag::update-settings-request-timeout + request.timeout(TimeValue.timeValueMinutes(2)); // <1> + request.timeout("2m"); // <2> + // end::update-settings-request-timeout + // tag::update-settings-request-masterTimeout + request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); // <1> + request.masterNodeTimeout("1m"); // <2> + // end::update-settings-request-masterTimeout + + // tag::update-settings-request-flat-settings + request.flatSettings(true); // <1> + // end::update-settings-request-flat-settings + + // tag::update-settings-execute + ClusterUpdateSettingsResponse response = client.cluster().updateSettings(request); + // end::update-settings-execute + + // tag::update-settings-response + boolean acknowledged = response.isAcknowledged(); // <1> + Settings transientSettingsResponse = response.getTransientSettings(); // <2> + Settings persistentSettingsResponse = response.getPersistentSettings(); // <3> + // end::update-settings-response + assertTrue(acknowledged); + assertThat(transientSettingsResponse.get(transientSettingKey), equalTo(transientSettingValue + ByteSizeUnit.BYTES.getSuffix())); + assertThat(persistentSettingsResponse.get(persistentSettingKey), equalTo(persistentSettingValue)); + + // tag::update-settings-request-reset-transient + request.transientSettings(Settings.builder().putNull(transientSettingKey).build()); // <1> + // tag::update-settings-request-reset-transient + request.persistentSettings(Settings.builder().putNull(persistentSettingKey)); + ClusterUpdateSettingsResponse resetResponse = client.cluster().updateSettings(request); + + assertTrue(resetResponse.isAcknowledged()); + } + + public void testClusterUpdateSettingsAsync() throws IOException { + RestHighLevelClient client = highLevelClient(); + { + ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); + + // tag::update-settings-execute-listener + ActionListener listener = new ActionListener() { + @Override + public void onResponse(ClusterUpdateSettingsResponse response) { + // <1> + } + + @Override + public void onFailure(Exception e) { + // <2> + } + }; + // end::update-settings-execute-listener + + // Replace the empty listener by a blocking listener in test + final CountDownLatch latch = new CountDownLatch(1); + listener = new LatchedActionListener<>(listener, latch); + + // tag::update-settings-async + client.cluster().updateSettingsAsync(request, listener); // <1> + // end::update-settings-async + } + } +} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java index 0462454f29829..e41a3a268dddc 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java @@ -70,7 +70,7 @@ * Then in the documentation, you can extract what is between tag and end tags with * ["source","java",subs="attributes,callouts,macros"] * -------------------------------------------------- - * include-tagged::{doc-tests}/CRUDDocumentationIT.java[example] + * include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[example] * -------------------------------------------------- */ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase { diff --git a/docs/java-rest/high-level/cluster/update_settings.asciidoc b/docs/java-rest/high-level/cluster/update_settings.asciidoc new file mode 100644 index 0000000000000..8628eb05d3969 --- /dev/null +++ b/docs/java-rest/high-level/cluster/update_settings.asciidoc @@ -0,0 +1,128 @@ +[[java-rest-high-cluster-update-settings]] +=== Cluster Update Settings API + +The Cluster Update Settings API allows to update cluster wide specific settings. + +[[java-rest-high-cluster-update-settings-request]] +==== Cluster Update Settings Request + +A `ClusterUpdateSettingsRequest`: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request] +-------------------------------------------------- + +==== Cluster Settings +At least one setting be updated must be provided: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-cluster-settings] +-------------------------------------------------- +<1> The transient settings provided as `Settigs` +<2> The persistent settings provided as `Settigs` + +==== Providing the Settings +The settings to be updated can be provided in different ways: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-create-settings] +-------------------------------------------------- +<1> Settings provided as `Settings` + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-settings-builder] +-------------------------------------------------- +<1> Settings provided as `Settings.Builder` + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-settings-source] +-------------------------------------------------- +<1> Settings provided as `String` + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-settings-map] +-------------------------------------------------- +<1> Settings provided as `Object` key-pairs, which gets converted to +JSON format + +==== Optional Arguments +The following arguments can optionally be provided: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-flat-settings] +-------------------------------------------------- +<1> Returned settings in flat format + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-timeout] +-------------------------------------------------- +<1> Timeout to wait for the all the nodes to acknowledge the settings were applied +as a `TimeValue` +<2> Timeout to wait for the all the nodes to acknowledge the settings were applied +as a `String` + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-masterTimeout] +-------------------------------------------------- +<1> Timeout to connect to the master node as a `TimeValue` +<2> Timeout to connect to the master node as a `String` + +[[java-rest-high-cluster-update-settings-sync]] +==== Synchronous Execution + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-execute] +-------------------------------------------------- + +[[java-rest-high-cluster-update-settings-async]] +==== Asynchronous Execution + +The asynchronous execution of a cluster update settings requires both the +`ClusterUpdateSettingsRequest` instance and an `ActionListener` instance to be +passed to the asynchronous method: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-execute-async] +-------------------------------------------------- +<1> The `ClusterUpdateSettingsRequest` to execute and the `ActionListener` +to use when the execution completes + +The asynchronous method does not block and returns immediately. Once it is +completed the `ActionListener` is called back using the `onResponse` method +if the execution successfully completed or using the `onFailure` method if +it failed. + +A typical listener for `ClusterUpdateSettingsResponse` looks like: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-execute-listener] +-------------------------------------------------- +<1> Called when the execution is successfully completed. The response is +provided as an argument +<2> Called in case of a failure. The raised exception is provided as an argument + +[[java-rest-high-clustre-update-settings-response]] +==== Cluster Update Settings Response + +The returned `ClusterUpdateSettings` allows to retrieve information about the +executed operation as follows: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-response] +-------------------------------------------------- +<1> Indicates whether all of the nodes have acknowledged the request +<2> Indicates which transient settings have been applied +<3> Indicates which persistent settings have been applied \ No newline at end of file diff --git a/docs/java-rest/high-level/indices/put_mapping.asciidoc b/docs/java-rest/high-level/indices/put_mapping.asciidoc index 1f7d8c1d5e828..5fa985d02c16f 100644 --- a/docs/java-rest/high-level/indices/put_mapping.asciidoc +++ b/docs/java-rest/high-level/indices/put_mapping.asciidoc @@ -20,7 +20,7 @@ A description of the fields to create on the mapping; if not defined, the mappin -------------------------------------------------- include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[put-mapping-request-source] -------------------------------------------------- -<1> The mapping source provided as a `String` +<1> Mapping source provided as a `String` ==== Providing the mapping source The mapping source can be provided in different ways in addition to diff --git a/docs/java-rest/high-level/supported-apis.asciidoc b/docs/java-rest/high-level/supported-apis.asciidoc index 14e4351eb29bd..62243367ff60e 100644 --- a/docs/java-rest/high-level/supported-apis.asciidoc +++ b/docs/java-rest/high-level/supported-apis.asciidoc @@ -71,3 +71,10 @@ include::indices/put_mapping.asciidoc[] include::indices/update_aliases.asciidoc[] include::indices/exists_alias.asciidoc[] +== Cluster APIs + +The Java High Level REST Client supports the following Cluster APIs: + +* <> + +include::cluster/update_settings.asciidoc[] diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java index 2a8ed8bf11f43..dc6a5d35d0f45 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java @@ -22,26 +22,31 @@ import org.elasticsearch.ElasticsearchGenerationException; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.support.master.AcknowledgedRequest; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; import java.util.Map; import static org.elasticsearch.action.ValidateActions.addValidationError; -import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.settings.Settings.readSettingsFromStream; import static org.elasticsearch.common.settings.Settings.writeSettingsToStream; +import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; /** * Request for an update cluster settings action */ -public class ClusterUpdateSettingsRequest extends AcknowledgedRequest { +public class ClusterUpdateSettingsRequest extends AcknowledgedRequest implements ToXContentObject { + private boolean flatSettings = false; private Settings transientSettings = EMPTY_SETTINGS; private Settings persistentSettings = EMPTY_SETTINGS; @@ -57,6 +62,27 @@ public ActionRequestValidationException validate() { return validationException; } + /** + * Sets the value of "flat_settings". + * + * @param flatSettings + * value of "flat_settings" flag to be set + * @return this request + */ + public ClusterUpdateSettingsRequest flatSettings(boolean flatSettings) { + this.flatSettings = flatSettings; + return this; + } + + /** + * Return settings in flat format. + * + * @return true if settings need to be returned in flat format; false otherwise. + */ + public boolean flatSettings() { + return flatSettings; + } + public Settings transientSettings() { return transientSettings; } @@ -92,7 +118,7 @@ public ClusterUpdateSettingsRequest transientSettings(String source, XContentTyp /** * Sets the transient settings to be updated. They will not survive a full cluster restart */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "rawtypes"}) public ClusterUpdateSettingsRequest transientSettings(Map source) { try { XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); @@ -131,7 +157,7 @@ public ClusterUpdateSettingsRequest persistentSettings(String source, XContentTy /** * Sets the persistent settings to be updated. They will get applied cross restarts */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "rawtypes"}) public ClusterUpdateSettingsRequest persistentSettings(Map source) { try { XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); @@ -156,4 +182,29 @@ public void writeTo(StreamOutput out) throws IOException { writeSettingsToStream(transientSettings, out); writeSettingsToStream(persistentSettings, out); } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.startObject("persistent"); + persistentSettings.toXContent(builder, params); + builder.endObject(); + builder.startObject("transient"); + transientSettings.toXContent(builder, params); + builder.endObject(); + builder.endObject(); + return builder; + } + + private static final ObjectParser PARSER = new ObjectParser<>("clustre_update_settings_request", + true, ClusterUpdateSettingsRequest::new); + + static { + PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField("persistent")); + PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField("transient")); + } + + public static ClusterUpdateSettingsRequest fromXContent(XContentParser parser) throws IOException { + return PARSER.apply(parser, null); + } } diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java index b783d314c47ca..888b824a92fc2 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java @@ -20,16 +20,21 @@ package org.elasticsearch.action.admin.cluster.settings; import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; -import java.io.IOException; +import java.io.IOException;; /** * A response for a cluster update settings action. */ -public class ClusterUpdateSettingsResponse extends AcknowledgedResponse { +public class ClusterUpdateSettingsResponse extends AcknowledgedResponse implements ToXContentObject { Settings transientSettings; Settings persistentSettings; @@ -68,4 +73,31 @@ public void writeTo(StreamOutput out) throws IOException { Settings.writeSettingsToStream(persistentSettings, out); writeAcknowledged(out); } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + addAcknowledgedField(builder); + builder.startObject("persistent"); + persistentSettings.toXContent(builder, params); + builder.endObject(); + builder.startObject("transient"); + transientSettings.toXContent(builder, params); + builder.endObject(); + builder.endObject(); + return builder; + } + + private static final ObjectParser PARSER = new ObjectParser<>("clustre_update_settings_response", + true, ClusterUpdateSettingsResponse::new); + + static { + PARSER.declareBoolean((r, a) -> r.acknowledged = a, new ParseField("acknowledged")); + PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField("persistent")); + PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField("transient")); + } + + public static ClusterUpdateSettingsResponse fromXContent(XContentParser parser) throws IOException { + return PARSER.apply(parser, null); + } } diff --git a/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java b/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java index 18cb416a763fe..19b8f00ceaa2a 100755 --- a/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java +++ b/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java @@ -43,7 +43,7 @@ protected static void declareAcknowledgedField( ObjectParser.ValueType.BOOLEAN); } - private boolean acknowledged; + protected boolean acknowledged; protected AcknowledgedResponse() { diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java new file mode 100644 index 0000000000000..97b3c18a4aaab --- /dev/null +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java @@ -0,0 +1,62 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.action.admin.cluster.settings; + +import com.carrotsearch.randomizedtesting.annotations.Repeat; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.settings.ClusterSettings; +import org.elasticsearch.common.settings.Setting; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.settings.Settings.Builder; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.test.ESTestCase; +import org.junit.Test; + +import java.io.IOException; + +import static org.hamcrest.CoreMatchers.equalTo; + +public class ClusterUpdateSettingsRequestTests extends ESTestCase { + + @Test + public void fromToXContent() throws IOException { + final ClusterUpdateSettingsRequest request = createTestItem(); + boolean humanReadable = randomBoolean(); + final XContentType xContentType = XContentType.JSON; + BytesReference xContent = toShuffledXContent(request, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); + + XContentParser parser = createParser(xContentType.xContent(), xContent); + ClusterUpdateSettingsRequest parsedRequest = ClusterUpdateSettingsRequest.fromXContent(parser); + assertNull(parser.nextToken()); + + assertThat(parsedRequest.persistentSettings(), equalTo(request.persistentSettings())); + assertThat(parsedRequest.transientSettings(), equalTo(request.transientSettings())); + } + + private static ClusterUpdateSettingsRequest createTestItem() { + ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); + request.persistentSettings(ClusterUpdateSettingsResponseTests.randomClusterSettings(0, 2)); + request.transientSettings(ClusterUpdateSettingsResponseTests.randomClusterSettings(0, 2)); + return request; + } +} diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java new file mode 100644 index 0000000000000..7bdd3060c6f74 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java @@ -0,0 +1,69 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.action.admin.cluster.settings; + +import com.carrotsearch.randomizedtesting.annotations.Repeat; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.settings.ClusterSettings; +import org.elasticsearch.common.settings.Setting; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.settings.Settings.Builder; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.test.ESTestCase; + +import java.io.IOException; + +import static org.hamcrest.CoreMatchers.equalTo; + +public class ClusterUpdateSettingsResponseTests extends ESTestCase { + + @Repeat(iterations = 10) + public void testFromToXContent() throws IOException { + final ClusterUpdateSettingsResponse response = createTestItem(); + boolean humanReadable = randomBoolean(); + final XContentType xContentType = XContentType.JSON; + BytesReference xContent = toShuffledXContent(response, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); + + XContentParser parser = createParser(xContentType.xContent(), xContent); + ClusterUpdateSettingsResponse parsedResponse = ClusterUpdateSettingsResponse.fromXContent(parser); + assertNull(parser.nextToken()); + + assertThat(parsedResponse.isAcknowledged(), equalTo(response.isAcknowledged())); + assertThat(parsedResponse.persistentSettings, equalTo(response.persistentSettings)); + assertThat(parsedResponse.transientSettings, equalTo(response.transientSettings)); + } + + public static Settings randomClusterSettings(int min, int max) { + int num = randomIntBetween(min, max); + Builder builder = Settings.builder(); + for (int i = 0; i < num; i++) { + Setting setting = randomFrom(ClusterSettings.BUILT_IN_CLUSTER_SETTINGS); + builder.put(setting.getKey(), randomAlphaOfLengthBetween(2, 10)); + } + return builder.build(); + } + + private static ClusterUpdateSettingsResponse createTestItem() { + return new ClusterUpdateSettingsResponse(randomBoolean(), randomClusterSettings(0, 2), randomClusterSettings(0, 2)); + } +} From a9300337cfa2723080c664149df7cda23c4770a0 Mon Sep 17 00:00:00 2001 From: olcbean Date: Tue, 13 Feb 2018 17:41:32 +0100 Subject: [PATCH 2/5] address reviewers' comments --- .../elasticsearch/client/ClusterClient.java | 12 +-- .../org/elasticsearch/client/Request.java | 2 +- .../client/RestHighLevelClient.java | 2 +- .../elasticsearch/client/ClusterClientIT.java | 26 +++---- .../elasticsearch/client/RequestTests.java | 23 ++---- .../ClusterClientDocumentationIT.java | 76 ++++++++++--------- .../IndicesClientDocumentationIT.java | 4 +- ...ettings.asciidoc => put_settings.asciidoc} | 57 +++++++------- .../high-level/supported-apis.asciidoc | 4 +- .../ClusterUpdateSettingsRequest.java | 25 +++--- .../ClusterUpdateSettingsResponse.java | 32 ++++---- .../admin/indices/get/GetIndexRequest.java | 10 ++- .../support/master/AcknowledgedResponse.java | 2 +- .../RestClusterUpdateSettingsAction.java | 15 +--- .../ClusterUpdateSettingsRequestTests.java | 29 ++++--- .../ClusterUpdateSettingsResponseTests.java | 27 +++++-- .../org/elasticsearch/test/ESTestCase.java | 18 +++++ 17 files changed, 202 insertions(+), 162 deletions(-) rename docs/java-rest/high-level/cluster/{update_settings.asciidoc => put_settings.asciidoc} (65%) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java index c4cd36e512445..177e33d727010 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java @@ -29,9 +29,9 @@ import static java.util.Collections.emptySet; /** - * A wrapper for the {@link RestHighLevelClient} that provides methods for accessing the cluster api. + * A wrapper for the {@link RestHighLevelClient} that provides methods for accessing the Cluster API. *

- * See Indices API on elastic.co + * See Cluster API on elastic.co */ public final class ClusterClient { private final RestHighLevelClient restHighLevelClient; @@ -46,9 +46,9 @@ public final class ClusterClient { * See Cluster Update Settings * API on elastic.co */ - public ClusterUpdateSettingsResponse updateSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers) + public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, Request::clusterUpdateSettings, + return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, Request::clusterPutSettings, ClusterUpdateSettingsResponse::fromXContent, emptySet(), headers); } @@ -58,9 +58,9 @@ public ClusterUpdateSettingsResponse updateSettings(ClusterUpdateSettingsRequest * See Cluster Update Settings * API on elastic.co */ - public void updateSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, + public void putSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, Request::clusterUpdateSettings, + restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, Request::clusterPutSettings, ClusterUpdateSettingsResponse::fromXContent, listener, emptySet(), headers); } } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java index c44ce440f7c4f..f46248c2f5b8b 100755 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java @@ -529,7 +529,7 @@ private static Request resize(ResizeRequest resizeRequest) throws IOException { return new Request(HttpPut.METHOD_NAME, endpoint, params.getParams(), entity); } - static Request clusterUpdateSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest) throws IOException { + static Request clusterPutSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest) throws IOException { Params parameters = Params.builder(); parameters.withFlatSettings(clusterUpdateSettingsRequest.flatSettings()); parameters.withTimeout(clusterUpdateSettingsRequest.timeout()); diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index 0d8e6eb03207f..bf80aa7720741 100755 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -242,7 +242,7 @@ public final IndicesClient indices() { } /** - * Provides a {@link ClusterClient} which can be used to access the Clustre API. + * Provides a {@link ClusterClient} which can be used to access the Cluster API. * * See Cluster API on elastic.co */ diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java index 015dd0cfe4921..9314bb2e36cea 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ClusterClientIT.java @@ -41,7 +41,7 @@ public class ClusterClientIT extends ESRestHighLevelClientTestCase { - public void testClusterUpdateSettings() throws IOException { + public void testClusterPutSettings() throws IOException { final String transientSettingKey = RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); final int transientSettingValue = 10; @@ -56,8 +56,8 @@ public void testClusterUpdateSettings() throws IOException { setRequest.transientSettings(transientSettings); setRequest.persistentSettings(map); - ClusterUpdateSettingsResponse setResponse = execute(setRequest, highLevelClient().cluster()::updateSettings, - highLevelClient().cluster()::updateSettingsAsync); + ClusterUpdateSettingsResponse setResponse = execute(setRequest, highLevelClient().cluster()::putSettings, + highLevelClient().cluster()::putSettingsAsync); assertAcked(setResponse); assertThat(setResponse.getTransientSettings().get(transientSettingKey), notNullValue()); @@ -69,17 +69,17 @@ public void testClusterUpdateSettings() throws IOException { assertThat(setResponse.getPersistentSettings().get(persistentSettingKey), equalTo(persistentSettingValue)); Map setMap = getAsMap("/_cluster/settings"); - String transietSetValue = (String) XContentMapValues.extractValue("transient." + transientSettingKey, setMap); - assertThat(transietSetValue, equalTo(transientSettingValue + ByteSizeUnit.BYTES.getSuffix())); + String transientSetValue = (String) XContentMapValues.extractValue("transient." + transientSettingKey, setMap); + assertThat(transientSetValue, equalTo(transientSettingValue + ByteSizeUnit.BYTES.getSuffix())); String persistentSetValue = (String) XContentMapValues.extractValue("persistent." + persistentSettingKey, setMap); assertThat(persistentSetValue, equalTo(persistentSettingValue)); - ClusterUpdateSettingsRequest reserRequest = new ClusterUpdateSettingsRequest(); - reserRequest.transientSettings(Settings.builder().putNull(transientSettingKey)); - reserRequest.persistentSettings("{\"" + persistentSettingKey + "\": null }", XContentType.JSON); + ClusterUpdateSettingsRequest resetRequest = new ClusterUpdateSettingsRequest(); + resetRequest.transientSettings(Settings.builder().putNull(transientSettingKey)); + resetRequest.persistentSettings("{\"" + persistentSettingKey + "\": null }", XContentType.JSON); - ClusterUpdateSettingsResponse resetResponse = execute(reserRequest, highLevelClient().cluster()::updateSettings, - highLevelClient().cluster()::updateSettingsAsync); + ClusterUpdateSettingsResponse resetResponse = execute(resetRequest, highLevelClient().cluster()::putSettings, + highLevelClient().cluster()::putSettingsAsync); assertThat(resetResponse.getTransientSettings().get(transientSettingKey), equalTo(null)); assertThat(resetResponse.getPersistentSettings().get(persistentSettingKey), equalTo(null)); @@ -87,8 +87,8 @@ public void testClusterUpdateSettings() throws IOException { assertThat(resetResponse.getPersistentSettings(), equalTo(Settings.EMPTY)); Map resetMap = getAsMap("/_cluster/settings"); - String transietResetValue = (String) XContentMapValues.extractValue("transient." + transientSettingKey, resetMap); - assertThat(transietResetValue, equalTo(null)); + String transientResetValue = (String) XContentMapValues.extractValue("transient." + transientSettingKey, resetMap); + assertThat(transientResetValue, equalTo(null)); String persistentResetValue = (String) XContentMapValues.extractValue("persistent." + persistentSettingKey, resetMap); assertThat(persistentResetValue, equalTo(null)); } @@ -100,7 +100,7 @@ public void testClusterUpdateSettingNonExistent() { clusterUpdateSettingsRequest.transientSettings(Settings.builder().put(setting, value).build()); ElasticsearchException exception = expectThrows(ElasticsearchException.class, () -> execute(clusterUpdateSettingsRequest, - highLevelClient().cluster()::updateSettings, highLevelClient().cluster()::updateSettingsAsync)); + highLevelClient().cluster()::putSettings, highLevelClient().cluster()::putSettingsAsync)); assertThat(exception.status(), equalTo(RestStatus.BAD_REQUEST)); assertThat(exception.getMessage(), equalTo( "Elasticsearch exception [type=illegal_argument_exception, reason=transient setting [" + setting + "], not recognized]")); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java index 6cb2b908d540e..400a47ca47a70 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -31,7 +31,6 @@ import org.apache.http.util.EntityUtils; import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; -import org.elasticsearch.action.admin.cluster.shards.ClusterSearchShardsRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions; import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest; @@ -41,7 +40,6 @@ import org.elasticsearch.action.admin.indices.get.GetIndexRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.admin.indices.open.OpenIndexRequest; -import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest; import org.elasticsearch.action.admin.indices.shrink.ResizeRequest; import org.elasticsearch.action.admin.indices.shrink.ResizeType; import org.elasticsearch.action.bulk.BulkRequest; @@ -96,7 +94,6 @@ import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.RandomObjects; -import org.junit.Test; import java.io.IOException; import java.io.InputStream; @@ -276,7 +273,7 @@ public void testIndicesExist() { Map expectedParams = new HashMap<>(); setRandomIndicesOptions(getIndexRequest::indicesOptions, getIndexRequest::indicesOptions, expectedParams); setRandomLocal(getIndexRequest, expectedParams); - setRandomFlatSettings(getIndexRequest, expectedParams); + setRandomFlatSettings(getIndexRequest::flatSettings, expectedParams); setRandomHumanReadable(getIndexRequest, expectedParams); setRandomIncludeDefaults(getIndexRequest, expectedParams); @@ -1134,14 +1131,14 @@ private static void resizeTest(ResizeType resizeType, CheckedFunction expectedParams = new HashMap<>(); setRandomFlatSettings(request::flatSettings, expectedParams); setRandomMasterTimeout(request, expectedParams); setRandomTimeout(request::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); - Request expectedRequest = Request.clusterUpdateSettings(request); + Request expectedRequest = Request.clusterPutSettings(request); assertEquals("/_cluster/settings", expectedRequest.getEndpoint()); assertEquals(HttpPut.METHOD_NAME, expectedRequest.getMethod()); assertEquals(expectedParams, expectedRequest.getParameters()); @@ -1302,16 +1299,6 @@ private static void setRandomHumanReadable(GetIndexRequest request, Map expectedParams) { - if (randomBoolean()) { - boolean flatSettings = randomBoolean(); - request.flatSettings(flatSettings); - if (flatSettings) { - expectedParams.put("flat_settings", String.valueOf(flatSettings)); - } - } - } - private static void setRandomLocal(MasterNodeReadRequest request, Map expectedParams) { if (randomBoolean()) { boolean local = randomBoolean(); @@ -1336,7 +1323,9 @@ private static void setRandomFlatSettings(Consumer setter, Map + String persistentSettingKey = EnableAllocationDecider.CLUSTER_ROUTING_ALLOCATION_ENABLE_SETTING.getKey(); String persistentSettingValue = EnableAllocationDecider.Allocation.NONE.name(); + Settings persistentSettings = Settings.builder().put(persistentSettingKey, persistentSettingValue).build(); // <2> + // end::put-settings-create-settings - Settings transientSettings = Settings.builder().put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES).build(); // <1> - Settings persistentSettings = Settings.builder().put(persistentSettingKey, persistentSettingValue).build(); - // end::update-settings-create-settings - - // tag::update-settings-request-cluster-settings + // tag::put-settings-request-cluster-settings request.transientSettings(transientSettings); // <1> request.persistentSettings(persistentSettings); // <2> - // tag::update-settings-request-cluster-settings + // end::put-settings-request-cluster-settings { - // tag::update-settings-settings-builder + // tag::put-settings-settings-builder Settings.Builder transientSettingsBuilder = Settings.builder().put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES); request.transientSettings(transientSettingsBuilder); // <1> - // tag::update-settings-settings-builder + // end::put-settings-settings-builder } { - // tag::update-settings-settings-map + // tag::put-settings-settings-map Map map = new HashMap<>(); map.put(transientSettingKey, transientSettingValue + ByteSizeUnit.BYTES.getSuffix()); request.transientSettings(map); // <1> - // tag::update-settings-settings-map + // end::put-settings-settings-map } { - // tag::update-settings-settings-source + // tag::put-settings-settings-source request.transientSettings("{\"indices.recovery.max_bytes_per_sec\": \"10b\"}", XContentType.JSON); // <1> - // tag::update-settings-settings-source + // end::put-settings-settings-source } - // tag::update-settings-request-timeout + // tag::put-settings-request-timeout request.timeout(TimeValue.timeValueMinutes(2)); // <1> request.timeout("2m"); // <2> - // end::update-settings-request-timeout - // tag::update-settings-request-masterTimeout + // end::put-settings-request-timeout + // tag::put-settings-request-masterTimeout request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); // <1> request.masterNodeTimeout("1m"); // <2> - // end::update-settings-request-masterTimeout + // end::put-settings-request-masterTimeout - // tag::update-settings-request-flat-settings + // tag::put-settings-request-flat-settings request.flatSettings(true); // <1> - // end::update-settings-request-flat-settings + // end::put-settings-request-flat-settings - // tag::update-settings-execute - ClusterUpdateSettingsResponse response = client.cluster().updateSettings(request); - // end::update-settings-execute + // tag::put-settings-execute + ClusterUpdateSettingsResponse response = client.cluster().putSettings(request); + // end::put-settings-execute - // tag::update-settings-response + // tag::put-settings-response boolean acknowledged = response.isAcknowledged(); // <1> Settings transientSettingsResponse = response.getTransientSettings(); // <2> Settings persistentSettingsResponse = response.getPersistentSettings(); // <3> - // end::update-settings-response + // end::put-settings-response assertTrue(acknowledged); assertThat(transientSettingsResponse.get(transientSettingKey), equalTo(transientSettingValue + ByteSizeUnit.BYTES.getSuffix())); assertThat(persistentSettingsResponse.get(persistentSettingKey), equalTo(persistentSettingValue)); - // tag::update-settings-request-reset-transient + // tag::put-settings-request-reset-transient request.transientSettings(Settings.builder().putNull(transientSettingKey).build()); // <1> - // tag::update-settings-request-reset-transient + // tag::put-settings-request-reset-transient request.persistentSettings(Settings.builder().putNull(persistentSettingKey)); - ClusterUpdateSettingsResponse resetResponse = client.cluster().updateSettings(request); + ClusterUpdateSettingsResponse resetResponse = client.cluster().putSettings(request); assertTrue(resetResponse.isAcknowledged()); } - public void testClusterUpdateSettingsAsync() throws IOException { + public void testClusterUpdateSettingsAsync() throws Exception { RestHighLevelClient client = highLevelClient(); { ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); - // tag::update-settings-execute-listener + // tag::put-settings-execute-listener ActionListener listener = new ActionListener() { @Override public void onResponse(ClusterUpdateSettingsResponse response) { @@ -150,15 +150,17 @@ public void onFailure(Exception e) { // <2> } }; - // end::update-settings-execute-listener + // end::put-settings-execute-listener // Replace the empty listener by a blocking listener in test final CountDownLatch latch = new CountDownLatch(1); listener = new LatchedActionListener<>(listener, latch); - // tag::update-settings-async - client.cluster().updateSettingsAsync(request, listener); // <1> - // end::update-settings-async + // tag::put-settings-execute-async + client.cluster().putSettingsAsync(request, listener); // <1> + // end::put-settings-execute-async + + assertTrue(latch.await(30L, TimeUnit.SECONDS)); } } } diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java index e41a3a268dddc..e30018abd4caa 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java @@ -105,7 +105,7 @@ public void testIndicesExist() throws IOException { } } - public void testIndicesExistAsync() throws IOException { + public void testIndicesExistAsync() throws Exception { RestHighLevelClient client = highLevelClient(); { @@ -138,6 +138,8 @@ public void onFailure(Exception e) { // tag::indices-exists-async client.indices().existsAsync(request, listener); // <1> // end::indices-exists-async + + assertTrue(latch.await(30L, TimeUnit.SECONDS)); } } public void testDeleteIndex() throws IOException { diff --git a/docs/java-rest/high-level/cluster/update_settings.asciidoc b/docs/java-rest/high-level/cluster/put_settings.asciidoc similarity index 65% rename from docs/java-rest/high-level/cluster/update_settings.asciidoc rename to docs/java-rest/high-level/cluster/put_settings.asciidoc index 8628eb05d3969..6998493f0cd87 100644 --- a/docs/java-rest/high-level/cluster/update_settings.asciidoc +++ b/docs/java-rest/high-level/cluster/put_settings.asciidoc @@ -1,68 +1,69 @@ -[[java-rest-high-cluster-update-settings]] -=== Cluster Update Settings API +[[java-rest-high-cluster-put-settings]] +=== Cluster Put Settings API -The Cluster Update Settings API allows to update cluster wide specific settings. +The Cluster Put Settings API allows to update cluster wide settings. -[[java-rest-high-cluster-update-settings-request]] +[[java-rest-high-cluster-put-settings-request]] ==== Cluster Update Settings Request A `ClusterUpdateSettingsRequest`: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-request] -------------------------------------------------- ==== Cluster Settings -At least one setting be updated must be provided: +At least one setting to be updated must be provided: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-cluster-settings] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-request-cluster-settings] -------------------------------------------------- -<1> The transient settings provided as `Settigs` -<2> The persistent settings provided as `Settigs` +<1> Sets the transient settings to be applied +<2> Sets the persistent setting to be applied ==== Providing the Settings -The settings to be updated can be provided in different ways: +The settings to be applied can be provided in different ways: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-create-settings] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-create-settings] -------------------------------------------------- -<1> Settings provided as `Settings` +<1> Creates a transient setting as `Settings` +<2> Creates a persistent setting as `Settings` ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-settings-builder] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-settings-builder] -------------------------------------------------- <1> Settings provided as `Settings.Builder` ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-settings-source] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-settings-source] -------------------------------------------------- <1> Settings provided as `String` ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-settings-map] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-settings-map] -------------------------------------------------- -<1> Settings provided as `Object` key-pairs, which gets converted to -JSON format +<1> Settings provided as a `Map` ==== Optional Arguments The following arguments can optionally be provided: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-flat-settings] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-request-flat-settings] -------------------------------------------------- -<1> Returned settings in flat format +<1> Wether the updated settings returned in the `ClusterUpdateSettings` should +be in a flat format ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-timeout] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-request-timeout] -------------------------------------------------- <1> Timeout to wait for the all the nodes to acknowledge the settings were applied as a `TimeValue` @@ -71,20 +72,20 @@ as a `String` ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-request-masterTimeout] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-request-masterTimeout] -------------------------------------------------- <1> Timeout to connect to the master node as a `TimeValue` <2> Timeout to connect to the master node as a `String` -[[java-rest-high-cluster-update-settings-sync]] +[[java-rest-high-cluster-put-settings-sync]] ==== Synchronous Execution ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-execute] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-execute] -------------------------------------------------- -[[java-rest-high-cluster-update-settings-async]] +[[java-rest-high-cluster-put-settings-async]] ==== Asynchronous Execution The asynchronous execution of a cluster update settings requires both the @@ -93,7 +94,7 @@ passed to the asynchronous method: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-execute-async] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-execute-async] -------------------------------------------------- <1> The `ClusterUpdateSettingsRequest` to execute and the `ActionListener` to use when the execution completes @@ -107,13 +108,13 @@ A typical listener for `ClusterUpdateSettingsResponse` looks like: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-execute-listener] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-execute-listener] -------------------------------------------------- <1> Called when the execution is successfully completed. The response is provided as an argument <2> Called in case of a failure. The raised exception is provided as an argument -[[java-rest-high-clustre-update-settings-response]] +[[java-rest-high-cluster-put-settings-response]] ==== Cluster Update Settings Response The returned `ClusterUpdateSettings` allows to retrieve information about the @@ -121,7 +122,7 @@ executed operation as follows: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[update-settings-response] +include-tagged::{doc-tests}/ClusterClientDocumentationIT.java[put-settings-response] -------------------------------------------------- <1> Indicates whether all of the nodes have acknowledged the request <2> Indicates which transient settings have been applied diff --git a/docs/java-rest/high-level/supported-apis.asciidoc b/docs/java-rest/high-level/supported-apis.asciidoc index 62243367ff60e..295de7689f7c1 100644 --- a/docs/java-rest/high-level/supported-apis.asciidoc +++ b/docs/java-rest/high-level/supported-apis.asciidoc @@ -75,6 +75,6 @@ include::indices/exists_alias.asciidoc[] The Java High Level REST Client supports the following Cluster APIs: -* <> +* <> -include::cluster/update_settings.asciidoc[] +include::cluster/put_settings.asciidoc[] diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java index dc6a5d35d0f45..d0092cae768c5 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java @@ -46,6 +46,17 @@ */ public class ClusterUpdateSettingsRequest extends AcknowledgedRequest implements ToXContentObject { + private static final String PERSISTENT = "persistent"; + private static final String TRANSIENT = "transient"; + + private static final ObjectParser PARSER = new ObjectParser<>("cluster_update_settings_request", + true, ClusterUpdateSettingsRequest::new); + + static { + PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField(PERSISTENT)); + PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField(TRANSIENT)); + } + private boolean flatSettings = false; private Settings transientSettings = EMPTY_SETTINGS; private Settings persistentSettings = EMPTY_SETTINGS; @@ -64,6 +75,7 @@ public ActionRequestValidationException validate() { /** * Sets the value of "flat_settings". + * Used only by the high-level REST client. * * @param flatSettings * value of "flat_settings" flag to be set @@ -76,6 +88,7 @@ public ClusterUpdateSettingsRequest flatSettings(boolean flatSettings) { /** * Return settings in flat format. + * Used only by the high-level REST client. * * @return true if settings need to be returned in flat format; false otherwise. */ @@ -186,24 +199,16 @@ public void writeTo(StreamOutput out) throws IOException { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.startObject("persistent"); + builder.startObject(PERSISTENT); persistentSettings.toXContent(builder, params); builder.endObject(); - builder.startObject("transient"); + builder.startObject(TRANSIENT); transientSettings.toXContent(builder, params); builder.endObject(); builder.endObject(); return builder; } - private static final ObjectParser PARSER = new ObjectParser<>("clustre_update_settings_request", - true, ClusterUpdateSettingsRequest::new); - - static { - PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField("persistent")); - PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField("transient")); - } - public static ClusterUpdateSettingsRequest fromXContent(XContentParser parser) throws IOException { return PARSER.apply(parser, null); } diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java index 888b824a92fc2..4e0a8d95d4fc1 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java @@ -24,18 +24,29 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ConstructingObjectParser; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; -import java.io.IOException;; +import java.io.IOException; /** * A response for a cluster update settings action. */ public class ClusterUpdateSettingsResponse extends AcknowledgedResponse implements ToXContentObject { + private static final String PERSISTENT = "persistent"; + private static final String TRANSIENT = "transient"; + + private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>( + "cluster_update_settings_response", true, a -> new ClusterUpdateSettingsResponse((boolean) a[0])); + static { + declareAcknowledgedField(PARSER); + PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField(PERSISTENT)); + PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField(TRANSIENT)); + } + Settings transientSettings; Settings persistentSettings; @@ -44,6 +55,10 @@ public class ClusterUpdateSettingsResponse extends AcknowledgedResponse implemen this.transientSettings = Settings.EMPTY; } + ClusterUpdateSettingsResponse(boolean acknowledged) { + super(acknowledged); + } + ClusterUpdateSettingsResponse(boolean acknowledged, Settings transientSettings, Settings persistentSettings) { super(acknowledged); this.persistentSettings = persistentSettings; @@ -78,25 +93,16 @@ public void writeTo(StreamOutput out) throws IOException { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); addAcknowledgedField(builder); - builder.startObject("persistent"); + builder.startObject(PERSISTENT); persistentSettings.toXContent(builder, params); builder.endObject(); - builder.startObject("transient"); + builder.startObject(TRANSIENT); transientSettings.toXContent(builder, params); builder.endObject(); builder.endObject(); return builder; } - private static final ObjectParser PARSER = new ObjectParser<>("clustre_update_settings_response", - true, ClusterUpdateSettingsResponse::new); - - static { - PARSER.declareBoolean((r, a) -> r.acknowledged = a, new ParseField("acknowledged")); - PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField("persistent")); - PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField("transient")); - } - public static ClusterUpdateSettingsResponse fromXContent(XContentParser parser) throws IOException { return PARSER.apply(parser, null); } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java b/server/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java index 477656d96cb58..2a70aa836454e 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java @@ -26,8 +26,6 @@ import org.elasticsearch.common.util.ArrayUtils; import java.io.IOException; -import java.util.Arrays; -import java.util.List; /** * A request to delete an index. Best created with {@link org.elasticsearch.client.Requests#deleteIndexRequest(String)}. @@ -122,6 +120,8 @@ public boolean humanReadable() { /** * Sets the value of "flat_settings". + * Used only by the high-level REST client. + * * @param flatSettings value of "flat_settings" flag to be set * @return this request */ @@ -132,6 +132,8 @@ public GetIndexRequest flatSettings(boolean flatSettings) { /** * Return settings in flat format. + * Used only by the high-level REST client. + * * @return true if settings need to be returned in flat format; false otherwise. */ public boolean flatSettings() { @@ -140,6 +142,8 @@ public boolean flatSettings() { /** * Sets the value of "include_defaults". + * Used only by the high-level REST client. + * * @param includeDefaults value of "include_defaults" to be set. * @return this request */ @@ -150,6 +154,8 @@ public GetIndexRequest includeDefaults(boolean includeDefaults) { /** * Whether to return all default settings for each of the indices. + * Used only by the high-level REST client. + * * @return true if defaults settings for each of the indices need to returned; * false otherwise. */ diff --git a/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java b/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java index 19b8f00ceaa2a..18cb416a763fe 100755 --- a/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java +++ b/server/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java @@ -43,7 +43,7 @@ protected static void declareAcknowledgedField( ObjectParser.ValueType.BOOLEAN); } - protected boolean acknowledged; + private boolean acknowledged; protected AcknowledgedResponse() { diff --git a/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java b/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java index 88e8ada55976d..b1f58464bae42 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java @@ -29,7 +29,7 @@ import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestRequest; -import org.elasticsearch.rest.action.AcknowledgedRestListener; +import org.elasticsearch.rest.action.RestToXContentListener; import java.io.IOException; import java.util.Map; @@ -64,18 +64,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC } return channel -> client.admin().cluster().updateSettings(clusterUpdateSettingsRequest, - new AcknowledgedRestListener(channel) { - @Override - protected void addCustomFields(XContentBuilder builder, ClusterUpdateSettingsResponse response) throws IOException { - builder.startObject("persistent"); - response.getPersistentSettings().toXContent(builder, request); - builder.endObject(); - - builder.startObject("transient"); - response.getTransientSettings().toXContent(builder, request); - builder.endObject(); - } - }); + new RestToXContentListener(channel)); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java index 97b3c18a4aaab..c86f54fa76d10 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java @@ -19,38 +19,47 @@ package org.elasticsearch.action.admin.cluster.settings; -import com.carrotsearch.randomizedtesting.annotations.Repeat; - import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.settings.ClusterSettings; -import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings.Builder; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; -import org.junit.Test; import java.io.IOException; import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.IsCollectionContaining.hasItem; public class ClusterUpdateSettingsRequestTests extends ESTestCase { - @Test - public void fromToXContent() throws IOException { + public void testFromToXContent() throws IOException { final ClusterUpdateSettingsRequest request = createTestItem(); boolean humanReadable = randomBoolean(); final XContentType xContentType = XContentType.JSON; - BytesReference xContent = toShuffledXContent(request, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); + BytesReference xContent = toShuffledXContentAndInsertRandomFields(request, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); XContentParser parser = createParser(xContentType.xContent(), xContent); ClusterUpdateSettingsRequest parsedRequest = ClusterUpdateSettingsRequest.fromXContent(parser); + assertNull(parser.nextToken()); - assertThat(parsedRequest.persistentSettings(), equalTo(request.persistentSettings())); - assertThat(parsedRequest.transientSettings(), equalTo(request.transientSettings())); + Builder persistentBuilder = Settings.builder().put(request.persistentSettings()); + Builder parsedPersistentBuilder = Settings.builder().put(parsedRequest.persistentSettings()); + + persistentBuilder.keys().forEach(k -> { + assertThat(parsedPersistentBuilder.keys(), hasItem(equalTo(k))); + assertThat(parsedPersistentBuilder.get(k), equalTo(persistentBuilder.get(k))); + }); + + Builder transientBuilder = Settings.builder().put(request.persistentSettings()); + Builder parsedTransientBuilder = Settings.builder().put(parsedRequest.persistentSettings()); + + transientBuilder.keys().forEach(k -> { + assertThat(parsedTransientBuilder.keys(), hasItem(equalTo(k))); + assertThat(parsedTransientBuilder.get(k), equalTo(transientBuilder.get(k))); + }); } private static ClusterUpdateSettingsRequest createTestItem() { diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java index 7bdd3060c6f74..e265265760a6a 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java @@ -19,8 +19,6 @@ package org.elasticsearch.action.admin.cluster.settings; -import com.carrotsearch.randomizedtesting.annotations.Repeat; - import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Setting; @@ -34,23 +32,38 @@ import java.io.IOException; import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.IsCollectionContaining.hasItem; public class ClusterUpdateSettingsResponseTests extends ESTestCase { - @Repeat(iterations = 10) public void testFromToXContent() throws IOException { final ClusterUpdateSettingsResponse response = createTestItem(); boolean humanReadable = randomBoolean(); final XContentType xContentType = XContentType.JSON; - BytesReference xContent = toShuffledXContent(response, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); + + BytesReference xContent = toShuffledXContentAndInsertRandomFields(response, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); XContentParser parser = createParser(xContentType.xContent(), xContent); ClusterUpdateSettingsResponse parsedResponse = ClusterUpdateSettingsResponse.fromXContent(parser); - assertNull(parser.nextToken()); + assertNull(parser.nextToken()); assertThat(parsedResponse.isAcknowledged(), equalTo(response.isAcknowledged())); - assertThat(parsedResponse.persistentSettings, equalTo(response.persistentSettings)); - assertThat(parsedResponse.transientSettings, equalTo(response.transientSettings)); + + Builder persistentBuilder = Settings.builder().put(response.persistentSettings); + Builder parsedPersistentBuilder = Settings.builder().put(parsedResponse.persistentSettings); + + persistentBuilder.keys().forEach(k -> { + assertThat(parsedPersistentBuilder.keys(), hasItem(equalTo(k))); + assertThat(parsedPersistentBuilder.get(k), equalTo(persistentBuilder.get(k))); + }); + + Builder transientBuilder = Settings.builder().put(response.persistentSettings); + Builder parsedTransientBuilder = Settings.builder().put(parsedResponse.persistentSettings); + + transientBuilder.keys().forEach(k -> { + assertThat(parsedTransientBuilder.keys(), hasItem(equalTo(k))); + assertThat(parsedTransientBuilder.get(k), equalTo(transientBuilder.get(k))); + }); } public static Settings randomClusterSettings(int min, int max) { 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 aaed939c310c9..1b38106c1ee01 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -146,6 +146,7 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static org.elasticsearch.common.util.CollectionUtils.arrayAsArrayList; +import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; @@ -967,6 +968,23 @@ public XContentBuilder shuffleXContent(XContentParser parser, boolean prettyPrin return xContentBuilder.map(shuffledMap); } + /** + * Returns the bytes that represent the XContent output of the provided {@link ToXContent} object, using the provided + * {@link XContentType}. + * Adds a random field value, inner object or array into each json object. + */ + protected final BytesReference toShuffledXContentAndInsertRandomFields(ToXContent toXContent, XContentType xContentType, + ToXContent.Params params, boolean humanReadable, String... exceptFieldNames) throws IOException { + BytesReference originalBytes = toShuffledXContent(toXContent, xContentType, params, humanReadable, exceptFieldNames); + BytesReference mutated; + if (randomBoolean()) { + mutated = insertRandomFields(xContentType, originalBytes, null, random()); + } else { + mutated = originalBytes; + } + return mutated; + } + // shuffle fields of objects in the list, but not the list itself private static List shuffleList(List list, Set exceptFields) { List targetList = new ArrayList<>(); From 432b659c061bd8307cdcc3fa6a9839e3cd16cb77 Mon Sep 17 00:00:00 2001 From: olcbean Date: Wed, 14 Feb 2018 20:02:41 +0100 Subject: [PATCH 3/5] address reviewer comments --- .../ClusterClientDocumentationIT.java | 36 +++++++++----- .../high-level/cluster/put_settings.asciidoc | 2 +- .../ClusterUpdateSettingsRequest.java | 14 +++--- .../ClusterUpdateSettingsResponse.java | 12 ++--- .../RestClusterUpdateSettingsAction.java | 18 +++---- .../ClusterUpdateSettingsRequestTests.java | 48 +++++++++---------- .../ClusterUpdateSettingsResponseTests.java | 41 ++++++++-------- .../org/elasticsearch/test/ESTestCase.java | 17 ------- 8 files changed, 94 insertions(+), 94 deletions(-) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java index 2df1b67b12ee1..e9fc4ec01ba99 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java @@ -64,13 +64,22 @@ public void testClusterPutSettings() throws IOException { // end::put-settings-request // tag::put-settings-create-settings - String transientSettingKey = RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); + String transientSettingKey = + RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); int transientSettingValue = 10; - Settings transientSettings = Settings.builder().put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES).build(); // <1> - - String persistentSettingKey = EnableAllocationDecider.CLUSTER_ROUTING_ALLOCATION_ENABLE_SETTING.getKey(); - String persistentSettingValue = EnableAllocationDecider.Allocation.NONE.name(); - Settings persistentSettings = Settings.builder().put(persistentSettingKey, persistentSettingValue).build(); // <2> + Settings transientSettings = + Settings.builder() + .put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES) + .build(); // <1> + + String persistentSettingKey = + EnableAllocationDecider.CLUSTER_ROUTING_ALLOCATION_ENABLE_SETTING.getKey(); + String persistentSettingValue = + EnableAllocationDecider.Allocation.NONE.name(); + Settings persistentSettings = + Settings.builder() + .put(persistentSettingKey, persistentSettingValue) + .build(); // <2> // end::put-settings-create-settings // tag::put-settings-request-cluster-settings @@ -80,21 +89,25 @@ public void testClusterPutSettings() throws IOException { { // tag::put-settings-settings-builder - Settings.Builder transientSettingsBuilder = Settings.builder().put(transientSettingKey, transientSettingValue, - ByteSizeUnit.BYTES); + Settings.Builder transientSettingsBuilder = + Settings.builder() + .put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES); request.transientSettings(transientSettingsBuilder); // <1> // end::put-settings-settings-builder } { // tag::put-settings-settings-map Map map = new HashMap<>(); - map.put(transientSettingKey, transientSettingValue + ByteSizeUnit.BYTES.getSuffix()); + map.put(transientSettingKey + , transientSettingValue + ByteSizeUnit.BYTES.getSuffix()); request.transientSettings(map); // <1> // end::put-settings-settings-map } { // tag::put-settings-settings-source - request.transientSettings("{\"indices.recovery.max_bytes_per_sec\": \"10b\"}", XContentType.JSON); // <1> + request.transientSettings( + "{\"indices.recovery.max_bytes_per_sec\": \"10b\"}" + , XContentType.JSON); // <1> // end::put-settings-settings-source } @@ -139,7 +152,8 @@ public void testClusterUpdateSettingsAsync() throws Exception { ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); // tag::put-settings-execute-listener - ActionListener listener = new ActionListener() { + ActionListener listener = + new ActionListener() { @Override public void onResponse(ClusterUpdateSettingsResponse response) { // <1> diff --git a/docs/java-rest/high-level/cluster/put_settings.asciidoc b/docs/java-rest/high-level/cluster/put_settings.asciidoc index 6998493f0cd87..27531db72d242 100644 --- a/docs/java-rest/high-level/cluster/put_settings.asciidoc +++ b/docs/java-rest/high-level/cluster/put_settings.asciidoc @@ -1,5 +1,5 @@ [[java-rest-high-cluster-put-settings]] -=== Cluster Put Settings API +=== Cluster Update Settings API The Cluster Put Settings API allows to update cluster wide settings. diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java index d0092cae768c5..f282cedff3608 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequest.java @@ -46,15 +46,15 @@ */ public class ClusterUpdateSettingsRequest extends AcknowledgedRequest implements ToXContentObject { - private static final String PERSISTENT = "persistent"; - private static final String TRANSIENT = "transient"; + private static final ParseField PERSISTENT = new ParseField("persistent"); + private static final ParseField TRANSIENT = new ParseField("transient"); private static final ObjectParser PARSER = new ObjectParser<>("cluster_update_settings_request", - true, ClusterUpdateSettingsRequest::new); + false, ClusterUpdateSettingsRequest::new); static { - PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField(PERSISTENT)); - PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField(TRANSIENT)); + PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), PERSISTENT); + PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), TRANSIENT); } private boolean flatSettings = false; @@ -199,10 +199,10 @@ public void writeTo(StreamOutput out) throws IOException { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.startObject(PERSISTENT); + builder.startObject(PERSISTENT.getPreferredName()); persistentSettings.toXContent(builder, params); builder.endObject(); - builder.startObject(TRANSIENT); + builder.startObject(TRANSIENT.getPreferredName()); transientSettings.toXContent(builder, params); builder.endObject(); builder.endObject(); diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java index 4e0a8d95d4fc1..7ef0e76330da9 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponse.java @@ -36,15 +36,15 @@ */ public class ClusterUpdateSettingsResponse extends AcknowledgedResponse implements ToXContentObject { - private static final String PERSISTENT = "persistent"; - private static final String TRANSIENT = "transient"; + private static final ParseField PERSISTENT = new ParseField("persistent"); + private static final ParseField TRANSIENT = new ParseField("transient"); private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>( "cluster_update_settings_response", true, a -> new ClusterUpdateSettingsResponse((boolean) a[0])); static { declareAcknowledgedField(PARSER); - PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), new ParseField(PERSISTENT)); - PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), new ParseField(TRANSIENT)); + PARSER.declareObject((r, p) -> r.persistentSettings = p, (p, c) -> Settings.fromXContent(p), PERSISTENT); + PARSER.declareObject((r, t) -> r.transientSettings = t, (p, c) -> Settings.fromXContent(p), TRANSIENT); } Settings transientSettings; @@ -93,10 +93,10 @@ public void writeTo(StreamOutput out) throws IOException { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); addAcknowledgedField(builder); - builder.startObject(PERSISTENT); + builder.startObject(PERSISTENT.getPreferredName()); persistentSettings.toXContent(builder, params); builder.endObject(); - builder.startObject(TRANSIENT); + builder.startObject(TRANSIENT.getPreferredName()); transientSettings.toXContent(builder, params); builder.endObject(); builder.endObject(); diff --git a/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java b/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java index b1f58464bae42..2901cdd2d9ba8 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java @@ -20,11 +20,10 @@ package org.elasticsearch.rest.action.admin.cluster; import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; -import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse; import org.elasticsearch.client.Requests; import org.elasticsearch.client.node.NodeClient; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; @@ -36,6 +35,10 @@ import java.util.Set; public class RestClusterUpdateSettingsAction extends BaseRestHandler { + + private static final String PERSISTENT = "persistent"; + private static final String TRANSIENT = "transient"; + public RestClusterUpdateSettingsAction(Settings settings, RestController controller) { super(settings); controller.registerHandler(RestRequest.Method.PUT, "/_cluster/settings", this); @@ -56,15 +59,14 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC try (XContentParser parser = request.contentParser()) { source = parser.map(); } - if (source.containsKey("transient")) { - clusterUpdateSettingsRequest.transientSettings((Map) source.get("transient")); + if (source.containsKey(TRANSIENT)) { + clusterUpdateSettingsRequest.transientSettings((Map) source.get(TRANSIENT)); } - if (source.containsKey("persistent")) { - clusterUpdateSettingsRequest.persistentSettings((Map) source.get("persistent")); + if (source.containsKey(PERSISTENT)) { + clusterUpdateSettingsRequest.persistentSettings((Map) source.get(PERSISTENT)); } - return channel -> client.admin().cluster().updateSettings(clusterUpdateSettingsRequest, - new RestToXContentListener(channel)); + return channel -> client.admin().cluster().updateSettings(clusterUpdateSettingsRequest, new RestToXContentListener<>(channel)); } @Override diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java index c86f54fa76d10..1dceb44e97371 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java @@ -20,8 +20,6 @@ package org.elasticsearch.action.admin.cluster.settings; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.Settings.Builder; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; @@ -29,37 +27,39 @@ import java.io.IOException; +import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.core.IsCollectionContaining.hasItem; public class ClusterUpdateSettingsRequestTests extends ESTestCase { - public void testFromToXContent() throws IOException { + public void testFromXContent() throws IOException { + doFromXContentTestWithRandomFields(false); + } + + public void testFromXContentWithRandomFields() throws IOException { + doFromXContentTestWithRandomFields(true); + } + + private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws IOException { final ClusterUpdateSettingsRequest request = createTestItem(); boolean humanReadable = randomBoolean(); final XContentType xContentType = XContentType.JSON; - BytesReference xContent = toShuffledXContentAndInsertRandomFields(request, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); - - XContentParser parser = createParser(xContentType.xContent(), xContent); - ClusterUpdateSettingsRequest parsedRequest = ClusterUpdateSettingsRequest.fromXContent(parser); - - assertNull(parser.nextToken()); - - Builder persistentBuilder = Settings.builder().put(request.persistentSettings()); - Builder parsedPersistentBuilder = Settings.builder().put(parsedRequest.persistentSettings()); - - persistentBuilder.keys().forEach(k -> { - assertThat(parsedPersistentBuilder.keys(), hasItem(equalTo(k))); - assertThat(parsedPersistentBuilder.get(k), equalTo(persistentBuilder.get(k))); - }); + BytesReference originalBytes = toShuffledXContent(request, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); - Builder transientBuilder = Settings.builder().put(request.persistentSettings()); - Builder parsedTransientBuilder = Settings.builder().put(parsedRequest.persistentSettings()); + if (addRandomFields) { + BytesReference mutated = insertRandomFields(xContentType, originalBytes, + p -> p.startsWith("transient") || p.startsWith("persistent"), random()); + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> ClusterUpdateSettingsRequest.fromXContent(createParser(xContentType.xContent(), mutated))); + assertTrue(e.getMessage().matches("\\[cluster_update_settings_request\\] unknown field \\[\\w*\\], parser not found")); + } else { + XContentParser parser = createParser(xContentType.xContent(), originalBytes); + ClusterUpdateSettingsRequest parsedRequest = ClusterUpdateSettingsRequest.fromXContent(parser); - transientBuilder.keys().forEach(k -> { - assertThat(parsedTransientBuilder.keys(), hasItem(equalTo(k))); - assertThat(parsedTransientBuilder.get(k), equalTo(transientBuilder.get(k))); - }); + assertNull(parser.nextToken()); + assertThat(parsedRequest.transientSettings(), equalTo(request.transientSettings())); + assertThat(parsedRequest.persistentSettings(), equalTo(request.persistentSettings())); + } } private static ClusterUpdateSettingsRequest createTestItem() { diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java index e265265760a6a..77ccae5a96d35 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsResponseTests.java @@ -31,39 +31,40 @@ import java.io.IOException; +import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.core.IsCollectionContaining.hasItem; public class ClusterUpdateSettingsResponseTests extends ESTestCase { - public void testFromToXContent() throws IOException { + public void testFromXContent() throws IOException { + doFromXContentTestWithRandomFields(false); + } + + public void testFromXContentWithRandomFields() throws IOException { + doFromXContentTestWithRandomFields(true); + } + + private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws IOException { final ClusterUpdateSettingsResponse response = createTestItem(); boolean humanReadable = randomBoolean(); final XContentType xContentType = XContentType.JSON; - BytesReference xContent = toShuffledXContentAndInsertRandomFields(response, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); + BytesReference originalBytes = toShuffledXContent(response, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); + BytesReference mutated; + if (addRandomFields) { + mutated = insertRandomFields(xContentType, originalBytes, p -> p.startsWith("transient") || p.startsWith("persistent"), + random()); + } else { + mutated = originalBytes; + } - XContentParser parser = createParser(xContentType.xContent(), xContent); + XContentParser parser = createParser(xContentType.xContent(), mutated); ClusterUpdateSettingsResponse parsedResponse = ClusterUpdateSettingsResponse.fromXContent(parser); assertNull(parser.nextToken()); assertThat(parsedResponse.isAcknowledged(), equalTo(response.isAcknowledged())); - - Builder persistentBuilder = Settings.builder().put(response.persistentSettings); - Builder parsedPersistentBuilder = Settings.builder().put(parsedResponse.persistentSettings); - - persistentBuilder.keys().forEach(k -> { - assertThat(parsedPersistentBuilder.keys(), hasItem(equalTo(k))); - assertThat(parsedPersistentBuilder.get(k), equalTo(persistentBuilder.get(k))); - }); - - Builder transientBuilder = Settings.builder().put(response.persistentSettings); - Builder parsedTransientBuilder = Settings.builder().put(parsedResponse.persistentSettings); - - transientBuilder.keys().forEach(k -> { - assertThat(parsedTransientBuilder.keys(), hasItem(equalTo(k))); - assertThat(parsedTransientBuilder.get(k), equalTo(transientBuilder.get(k))); - }); + assertThat(response.transientSettings, equalTo(response.transientSettings)); + assertThat(response.persistentSettings, equalTo(response.persistentSettings)); } public static Settings randomClusterSettings(int min, int max) { 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 1b38106c1ee01..49fd80b50533b 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -968,23 +968,6 @@ public XContentBuilder shuffleXContent(XContentParser parser, boolean prettyPrin return xContentBuilder.map(shuffledMap); } - /** - * Returns the bytes that represent the XContent output of the provided {@link ToXContent} object, using the provided - * {@link XContentType}. - * Adds a random field value, inner object or array into each json object. - */ - protected final BytesReference toShuffledXContentAndInsertRandomFields(ToXContent toXContent, XContentType xContentType, - ToXContent.Params params, boolean humanReadable, String... exceptFieldNames) throws IOException { - BytesReference originalBytes = toShuffledXContent(toXContent, xContentType, params, humanReadable, exceptFieldNames); - BytesReference mutated; - if (randomBoolean()) { - mutated = insertRandomFields(xContentType, originalBytes, null, random()); - } else { - mutated = originalBytes; - } - return mutated; - } - // shuffle fields of objects in the list, but not the list itself private static List shuffleList(List list, Set exceptFields) { List targetList = new ArrayList<>(); From dda7951fe3c0b993177487ad2e4b0edd8ca8e894 Mon Sep 17 00:00:00 2001 From: olcbean Date: Thu, 15 Feb 2018 10:40:28 +0100 Subject: [PATCH 4/5] Turn off the formatter for all sections which were wrapped for better doc display --- .../documentation/ClusterClientDocumentationIT.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java index e9fc4ec01ba99..ef2e0a4825161 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java @@ -63,6 +63,7 @@ public void testClusterPutSettings() throws IOException { ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); // end::put-settings-request + // @formatter:off // tag::put-settings-create-settings String transientSettingKey = RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); @@ -81,6 +82,7 @@ public void testClusterPutSettings() throws IOException { .put(persistentSettingKey, persistentSettingValue) .build(); // <2> // end::put-settings-create-settings + // @formatter:on // tag::put-settings-request-cluster-settings request.transientSettings(transientSettings); // <1> @@ -88,27 +90,33 @@ public void testClusterPutSettings() throws IOException { // end::put-settings-request-cluster-settings { + // @formatter:off // tag::put-settings-settings-builder Settings.Builder transientSettingsBuilder = Settings.builder() .put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES); request.transientSettings(transientSettingsBuilder); // <1> // end::put-settings-settings-builder + // @formatter:on } { + // @formatter:off // tag::put-settings-settings-map Map map = new HashMap<>(); map.put(transientSettingKey , transientSettingValue + ByteSizeUnit.BYTES.getSuffix()); request.transientSettings(map); // <1> // end::put-settings-settings-map + // @formatter:on } { + // @formatter:off // tag::put-settings-settings-source request.transientSettings( "{\"indices.recovery.max_bytes_per_sec\": \"10b\"}" , XContentType.JSON); // <1> // end::put-settings-settings-source + // @formatter:on } // tag::put-settings-request-timeout @@ -151,6 +159,7 @@ public void testClusterUpdateSettingsAsync() throws Exception { { ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); + //@formatter:off // tag::put-settings-execute-listener ActionListener listener = new ActionListener() { @@ -165,6 +174,7 @@ public void onFailure(Exception e) { } }; // end::put-settings-execute-listener + //@formatter:on // Replace the empty listener by a blocking listener in test final CountDownLatch latch = new CountDownLatch(1); From 131a05fcdba2806a540324c214d8dab73e0b0dea Mon Sep 17 00:00:00 2001 From: olcbean Date: Thu, 15 Feb 2018 12:14:54 +0100 Subject: [PATCH 5/5] modify tests correct docs remove tags disabling auto formatting --- .../documentation/ClusterClientDocumentationIT.java | 10 ---------- .../high-level/cluster/put_settings.asciidoc | 2 +- .../settings/ClusterUpdateSettingsRequestTests.java | 13 ++++++++----- .../java/org/elasticsearch/test/ESTestCase.java | 2 +- .../org/elasticsearch/test/XContentTestUtils.java | 2 +- 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java index ef2e0a4825161..e9fc4ec01ba99 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ClusterClientDocumentationIT.java @@ -63,7 +63,6 @@ public void testClusterPutSettings() throws IOException { ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); // end::put-settings-request - // @formatter:off // tag::put-settings-create-settings String transientSettingKey = RecoverySettings.INDICES_RECOVERY_MAX_BYTES_PER_SEC_SETTING.getKey(); @@ -82,7 +81,6 @@ public void testClusterPutSettings() throws IOException { .put(persistentSettingKey, persistentSettingValue) .build(); // <2> // end::put-settings-create-settings - // @formatter:on // tag::put-settings-request-cluster-settings request.transientSettings(transientSettings); // <1> @@ -90,33 +88,27 @@ public void testClusterPutSettings() throws IOException { // end::put-settings-request-cluster-settings { - // @formatter:off // tag::put-settings-settings-builder Settings.Builder transientSettingsBuilder = Settings.builder() .put(transientSettingKey, transientSettingValue, ByteSizeUnit.BYTES); request.transientSettings(transientSettingsBuilder); // <1> // end::put-settings-settings-builder - // @formatter:on } { - // @formatter:off // tag::put-settings-settings-map Map map = new HashMap<>(); map.put(transientSettingKey , transientSettingValue + ByteSizeUnit.BYTES.getSuffix()); request.transientSettings(map); // <1> // end::put-settings-settings-map - // @formatter:on } { - // @formatter:off // tag::put-settings-settings-source request.transientSettings( "{\"indices.recovery.max_bytes_per_sec\": \"10b\"}" , XContentType.JSON); // <1> // end::put-settings-settings-source - // @formatter:on } // tag::put-settings-request-timeout @@ -159,7 +151,6 @@ public void testClusterUpdateSettingsAsync() throws Exception { { ClusterUpdateSettingsRequest request = new ClusterUpdateSettingsRequest(); - //@formatter:off // tag::put-settings-execute-listener ActionListener listener = new ActionListener() { @@ -174,7 +165,6 @@ public void onFailure(Exception e) { } }; // end::put-settings-execute-listener - //@formatter:on // Replace the empty listener by a blocking listener in test final CountDownLatch latch = new CountDownLatch(1); diff --git a/docs/java-rest/high-level/cluster/put_settings.asciidoc b/docs/java-rest/high-level/cluster/put_settings.asciidoc index 27531db72d242..2d9f55c1e9419 100644 --- a/docs/java-rest/high-level/cluster/put_settings.asciidoc +++ b/docs/java-rest/high-level/cluster/put_settings.asciidoc @@ -1,7 +1,7 @@ [[java-rest-high-cluster-put-settings]] === Cluster Update Settings API -The Cluster Put Settings API allows to update cluster wide settings. +The Cluster Update Settings API allows to update cluster wide settings. [[java-rest-high-cluster-put-settings-request]] ==== Cluster Update Settings Request diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java index 1dceb44e97371..fdca03ebcda4e 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/settings/ClusterUpdateSettingsRequestTests.java @@ -24,10 +24,11 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.XContentTestUtils; import java.io.IOException; +import java.util.Collections; -import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; import static org.hamcrest.CoreMatchers.equalTo; public class ClusterUpdateSettingsRequestTests extends ESTestCase { @@ -47,11 +48,13 @@ private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws BytesReference originalBytes = toShuffledXContent(request, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); if (addRandomFields) { - BytesReference mutated = insertRandomFields(xContentType, originalBytes, - p -> p.startsWith("transient") || p.startsWith("persistent"), random()); - IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + String unsupportedField = "unsupported_field"; + BytesReference mutated = XContentTestUtils.insertIntoXContent(xContentType.xContent(), originalBytes, + Collections.singletonList(""), () -> unsupportedField, () -> randomAlphaOfLengthBetween(3, 10)).bytes(); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> ClusterUpdateSettingsRequest.fromXContent(createParser(xContentType.xContent(), mutated))); - assertTrue(e.getMessage().matches("\\[cluster_update_settings_request\\] unknown field \\[\\w*\\], parser not found")); + assertThat(iae.getMessage(), + equalTo("[cluster_update_settings_request] unknown field [" + unsupportedField + "], parser not found")); } else { XContentParser parser = createParser(xContentType.xContent(), originalBytes); ClusterUpdateSettingsRequest parsedRequest = ClusterUpdateSettingsRequest.fromXContent(parser); 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 49fd80b50533b..ba8e674674810 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -29,6 +29,7 @@ import com.carrotsearch.randomizedtesting.generators.RandomPicks; import com.carrotsearch.randomizedtesting.generators.RandomStrings; import com.carrotsearch.randomizedtesting.rules.TestRuleAdapter; + import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -146,7 +147,6 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static org.elasticsearch.common.util.CollectionUtils.arrayAsArrayList; -import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; diff --git a/test/framework/src/main/java/org/elasticsearch/test/XContentTestUtils.java b/test/framework/src/main/java/org/elasticsearch/test/XContentTestUtils.java index 063f05544431c..cd556a9115ad3 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/XContentTestUtils.java +++ b/test/framework/src/main/java/org/elasticsearch/test/XContentTestUtils.java @@ -286,7 +286,7 @@ static List getInsertPaths(XContentParser parser, Stack currentP * {@link ObjectPath}. * The key/value arguments can suppliers that either return fixed or random values. */ - static XContentBuilder insertIntoXContent(XContent xContent, BytesReference original, List paths, Supplier key, + public static XContentBuilder insertIntoXContent(XContent xContent, BytesReference original, List paths, Supplier key, Supplier value) throws IOException { ObjectPath object = ObjectPath.createFromXContent(xContent, original); for (String path : paths) {