Skip to content

Commit d2288e4

Browse files
committed
Merge remote-tracking branch 'origin/master' into no-copy-settings-for-you
* origin/master: Update forcemerge.asciidoc (elastic#30113) Added zentity to the list of API extension plugins (elastic#29143) Fix the search request default operation behavior doc (elastic#29302) (elastic#29405) Watcher: Mark watcher as started only after loading watches (elastic#30403) Pass the task to broadcast actions (elastic#29672) Disable REST default settings testing until elastic#29229 is back-ported Correct wording in log message (elastic#30336) Do not fail snapshot when deleting a missing snapshotted file (elastic#30332) AwaitsFix testCreateShrinkIndexToN DOCS: Correct mapping tags in put-template api DOCS: Fix broken link in the put index template api Add put index template api to high level rest client (elastic#30400) Relax testAckedIndexing to allow document updating [Docs] Add snippets for POS stop tags default value Move respect accept header on no handler to 6.3.1
2 parents 56ceb89 + e5653e6 commit d2288e4

File tree

32 files changed

+783
-109
lines changed

32 files changed

+783
-109
lines changed

client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java

+24
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsResponse;
5252
import org.elasticsearch.action.admin.indices.shrink.ResizeRequest;
5353
import org.elasticsearch.action.admin.indices.shrink.ResizeResponse;
54+
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateRequest;
55+
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateResponse;
5456

5557
import java.io.IOException;
5658
import java.util.Collections;
@@ -456,4 +458,26 @@ public void putSettingsAsync(UpdateSettingsRequest updateSettingsRequest, Action
456458
UpdateSettingsResponse::fromXContent, listener, emptySet(), headers);
457459
}
458460

461+
/**
462+
* Puts an index template using the Index Templates API
463+
* <p>
464+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html"> Index Templates API
465+
* on elastic.co</a>
466+
*/
467+
public PutIndexTemplateResponse putTemplate(PutIndexTemplateRequest putIndexTemplateRequest, Header... headers) throws IOException {
468+
return restHighLevelClient.performRequestAndParseEntity(putIndexTemplateRequest, RequestConverters::putTemplate,
469+
PutIndexTemplateResponse::fromXContent, emptySet(), headers);
470+
}
471+
472+
/**
473+
* Asynchronously puts an index template using the Index Templates API
474+
* <p>
475+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html"> Index Templates API
476+
* on elastic.co</a>
477+
*/
478+
public void putTemplateAsync(PutIndexTemplateRequest putIndexTemplateRequest,
479+
ActionListener<PutIndexTemplateResponse> listener, Header... headers) {
480+
restHighLevelClient.performRequestAsyncAndParseEntity(putIndexTemplateRequest, RequestConverters::putTemplate,
481+
PutIndexTemplateResponse::fromXContent, listener, emptySet(), headers);
482+
}
459483
}

client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest;
4848
import org.elasticsearch.action.admin.indices.shrink.ResizeRequest;
4949
import org.elasticsearch.action.admin.indices.shrink.ResizeType;
50+
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateRequest;
5051
import org.elasticsearch.action.bulk.BulkRequest;
5152
import org.elasticsearch.action.delete.DeleteRequest;
5253
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
@@ -77,7 +78,6 @@
7778
import org.elasticsearch.common.xcontent.XContentType;
7879
import org.elasticsearch.index.VersionType;
7980
import org.elasticsearch.index.rankeval.RankEvalRequest;
80-
import org.elasticsearch.rest.action.RestFieldCapabilitiesAction;
8181
import org.elasticsearch.rest.action.search.RestSearchAction;
8282
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
8383

@@ -86,10 +86,7 @@
8686
import java.net.URI;
8787
import java.net.URISyntaxException;
8888
import java.nio.charset.Charset;
89-
import java.util.Collections;
90-
import java.util.HashMap;
9189
import java.util.Locale;
92-
import java.util.Map;
9390
import java.util.StringJoiner;
9491

9592
final class RequestConverters {
@@ -647,6 +644,21 @@ static Request indexPutSettings(UpdateSettingsRequest updateSettingsRequest) thr
647644
return request;
648645
}
649646

647+
static Request putTemplate(PutIndexTemplateRequest putIndexTemplateRequest) throws IOException {
648+
String endpoint = new EndpointBuilder().addPathPartAsIs("_template").addPathPart(putIndexTemplateRequest.name()).build();
649+
Request request = new Request(HttpPut.METHOD_NAME, endpoint);
650+
Params params = new Params(request);
651+
params.withMasterTimeout(putIndexTemplateRequest.masterNodeTimeout());
652+
if (putIndexTemplateRequest.create()) {
653+
params.putParam("create", Boolean.TRUE.toString());
654+
}
655+
if (Strings.hasText(putIndexTemplateRequest.cause())) {
656+
params.putParam("cause", putIndexTemplateRequest.cause());
657+
}
658+
request.setEntity(createEntity(putIndexTemplateRequest, REQUEST_BODY_CONTENT_TYPE));
659+
return request;
660+
}
661+
650662
private static HttpEntity createEntity(ToXContent toXContent, XContentType xContentType) throws IOException {
651663
BytesRef source = XContentHelper.toXContent(toXContent, xContentType, false).toBytesRef();
652664
return new ByteArrayEntity(source.bytes, source.offset, source.length, createContentType(xContentType));

client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java

+66
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,14 @@
5656
import org.elasticsearch.action.admin.indices.shrink.ResizeRequest;
5757
import org.elasticsearch.action.admin.indices.shrink.ResizeResponse;
5858
import org.elasticsearch.action.admin.indices.shrink.ResizeType;
59+
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateRequest;
60+
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateResponse;
5961
import org.elasticsearch.action.index.IndexRequest;
6062
import org.elasticsearch.action.support.IndicesOptions;
6163
import org.elasticsearch.action.support.WriteRequest;
6264
import org.elasticsearch.action.support.broadcast.BroadcastResponse;
6365
import org.elasticsearch.cluster.metadata.IndexMetaData;
66+
import org.elasticsearch.common.ValidationException;
6467
import org.elasticsearch.common.settings.Setting;
6568
import org.elasticsearch.common.settings.Settings;
6669
import org.elasticsearch.common.unit.ByteSizeUnit;
@@ -73,11 +76,19 @@
7376
import org.elasticsearch.rest.RestStatus;
7477

7578
import java.io.IOException;
79+
import java.util.Arrays;
80+
import java.util.Collections;
7681
import java.util.Map;
7782

7883
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
84+
import static org.elasticsearch.common.xcontent.support.XContentMapValues.extractRawValues;
85+
import static org.elasticsearch.common.xcontent.support.XContentMapValues.extractValue;
7986
import static org.hamcrest.CoreMatchers.hasItem;
87+
import static org.hamcrest.Matchers.contains;
88+
import static org.hamcrest.Matchers.containsString;
8089
import static org.hamcrest.Matchers.equalTo;
90+
import static org.hamcrest.Matchers.hasEntry;
91+
import static org.hamcrest.Matchers.hasSize;
8192
import static org.hamcrest.Matchers.not;
8293
import static org.hamcrest.Matchers.startsWith;
8394

@@ -812,4 +823,59 @@ public void testIndexPutSettingNonExistent() throws IOException {
812823
+ "or check the breaking changes documentation for removed settings]"));
813824
}
814825

826+
@SuppressWarnings("unchecked")
827+
public void testPutTemplate() throws Exception {
828+
PutIndexTemplateRequest putTemplateRequest = new PutIndexTemplateRequest()
829+
.name("my-template")
830+
.patterns(Arrays.asList("pattern-1", "name-*"))
831+
.order(10)
832+
.create(randomBoolean())
833+
.settings(Settings.builder().put("number_of_shards", "3").put("number_of_replicas", "0"))
834+
.mapping("doc", "host_name", "type=keyword", "description", "type=text")
835+
.alias(new Alias("alias-1").indexRouting("abc")).alias(new Alias("{index}-write").searchRouting("xyz"));
836+
837+
PutIndexTemplateResponse putTemplateResponse = execute(putTemplateRequest,
838+
highLevelClient().indices()::putTemplate, highLevelClient().indices()::putTemplateAsync);
839+
assertThat(putTemplateResponse.isAcknowledged(), equalTo(true));
840+
841+
Map<String, Object> templates = getAsMap("/_template/my-template");
842+
assertThat(templates.keySet(), hasSize(1));
843+
assertThat(extractValue("my-template.order", templates), equalTo(10));
844+
assertThat(extractRawValues("my-template.index_patterns", templates), contains("pattern-1", "name-*"));
845+
assertThat(extractValue("my-template.settings.index.number_of_shards", templates), equalTo("3"));
846+
assertThat(extractValue("my-template.settings.index.number_of_replicas", templates), equalTo("0"));
847+
assertThat(extractValue("my-template.mappings.doc.properties.host_name.type", templates), equalTo("keyword"));
848+
assertThat(extractValue("my-template.mappings.doc.properties.description.type", templates), equalTo("text"));
849+
assertThat((Map<String, String>) extractValue("my-template.aliases.alias-1", templates), hasEntry("index_routing", "abc"));
850+
assertThat((Map<String, String>) extractValue("my-template.aliases.{index}-write", templates), hasEntry("search_routing", "xyz"));
851+
}
852+
853+
public void testPutTemplateBadRequests() throws Exception {
854+
RestHighLevelClient client = highLevelClient();
855+
856+
// Failed to validate because index patterns are missing
857+
PutIndexTemplateRequest withoutPattern = new PutIndexTemplateRequest("t1");
858+
ValidationException withoutPatternError = expectThrows(ValidationException.class,
859+
() -> execute(withoutPattern, client.indices()::putTemplate, client.indices()::putTemplateAsync));
860+
assertThat(withoutPatternError.validationErrors(), contains("index patterns are missing"));
861+
862+
// Create-only specified but an template exists already
863+
PutIndexTemplateRequest goodTemplate = new PutIndexTemplateRequest("t2").patterns(Arrays.asList("qa-*", "prod-*"));
864+
assertTrue(execute(goodTemplate, client.indices()::putTemplate, client.indices()::putTemplateAsync).isAcknowledged());
865+
goodTemplate.create(true);
866+
ElasticsearchException alreadyExistsError = expectThrows(ElasticsearchException.class,
867+
() -> execute(goodTemplate, client.indices()::putTemplate, client.indices()::putTemplateAsync));
868+
assertThat(alreadyExistsError.getDetailedMessage(),
869+
containsString("[type=illegal_argument_exception, reason=index_template [t2] already exists]"));
870+
goodTemplate.create(false);
871+
assertTrue(execute(goodTemplate, client.indices()::putTemplate, client.indices()::putTemplateAsync).isAcknowledged());
872+
873+
// Rejected due to unknown settings
874+
PutIndexTemplateRequest unknownSettingTemplate = new PutIndexTemplateRequest("t3")
875+
.patterns(Collections.singletonList("any"))
876+
.settings(Settings.builder().put("this-setting-does-not-exist", 100));
877+
ElasticsearchStatusException unknownSettingError = expectThrows(ElasticsearchStatusException.class,
878+
() -> execute(unknownSettingTemplate, client.indices()::putTemplate, client.indices()::putTemplateAsync));
879+
assertThat(unknownSettingError.getDetailedMessage(), containsString("unknown setting [index.this-setting-does-not-exist]"));
880+
}
815881
}

client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java

+47-10
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,11 @@
2626
import org.apache.http.client.methods.HttpPost;
2727
import org.apache.http.client.methods.HttpPut;
2828
import org.apache.http.entity.ByteArrayEntity;
29-
import org.apache.http.entity.ContentType;
30-
import org.apache.http.entity.StringEntity;
3129
import org.apache.http.util.EntityUtils;
3230
import org.elasticsearch.action.ActionRequestValidationException;
3331
import org.elasticsearch.action.DocWriteRequest;
3432
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
33+
import org.elasticsearch.action.admin.indices.alias.Alias;
3534
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
3635
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions;
3736
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
@@ -46,10 +45,11 @@
4645
import org.elasticsearch.action.admin.indices.open.OpenIndexRequest;
4746
import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
4847
import org.elasticsearch.action.admin.indices.rollover.RolloverRequest;
49-
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;
5048
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest;
49+
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;
5150
import org.elasticsearch.action.admin.indices.shrink.ResizeRequest;
5251
import org.elasticsearch.action.admin.indices.shrink.ResizeType;
52+
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateRequest;
5353
import org.elasticsearch.action.bulk.BulkRequest;
5454
import org.elasticsearch.action.bulk.BulkShardRequest;
5555
import org.elasticsearch.action.delete.DeleteRequest;
@@ -70,22 +70,21 @@
7070
import org.elasticsearch.action.support.master.MasterNodeRequest;
7171
import org.elasticsearch.action.support.replication.ReplicationRequest;
7272
import org.elasticsearch.action.update.UpdateRequest;
73+
import org.elasticsearch.client.RequestConverters.EndpointBuilder;
7374
import org.elasticsearch.common.CheckedBiConsumer;
7475
import org.elasticsearch.common.CheckedFunction;
7576
import org.elasticsearch.common.Strings;
7677
import org.elasticsearch.common.bytes.BytesArray;
7778
import org.elasticsearch.common.bytes.BytesReference;
7879
import org.elasticsearch.common.io.Streams;
7980
import org.elasticsearch.common.lucene.uid.Versions;
80-
import org.elasticsearch.common.settings.IndexScopedSettings;
81+
import org.elasticsearch.common.settings.Settings;
8182
import org.elasticsearch.common.unit.TimeValue;
8283
import org.elasticsearch.common.xcontent.ToXContent;
8384
import org.elasticsearch.common.xcontent.XContentBuilder;
8485
import org.elasticsearch.common.xcontent.XContentHelper;
8586
import org.elasticsearch.common.xcontent.XContentParser;
8687
import org.elasticsearch.common.xcontent.XContentType;
87-
import org.elasticsearch.client.RequestConverters.EndpointBuilder;
88-
import org.elasticsearch.client.RequestConverters.Params;
8988
import org.elasticsearch.index.RandomCreateIndexGenerator;
9089
import org.elasticsearch.index.VersionType;
9190
import org.elasticsearch.index.query.TermQueryBuilder;
@@ -94,7 +93,6 @@
9493
import org.elasticsearch.index.rankeval.RankEvalSpec;
9594
import org.elasticsearch.index.rankeval.RatedRequest;
9695
import org.elasticsearch.index.rankeval.RestRankEvalAction;
97-
import org.elasticsearch.rest.action.RestFieldCapabilitiesAction;
9896
import org.elasticsearch.rest.action.search.RestSearchAction;
9997
import org.elasticsearch.search.Scroll;
10098
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
@@ -111,8 +109,6 @@
111109

112110
import java.io.IOException;
113111
import java.io.InputStream;
114-
import java.lang.reflect.Constructor;
115-
import java.lang.reflect.Modifier;
116112
import java.util.ArrayList;
117113
import java.util.Arrays;
118114
import java.util.Collections;
@@ -121,7 +117,6 @@
121117
import java.util.List;
122118
import java.util.Locale;
123119
import java.util.Map;
124-
import java.util.Set;
125120
import java.util.StringJoiner;
126121
import java.util.function.Consumer;
127122
import java.util.function.Function;
@@ -1432,6 +1427,48 @@ public void testIndexPutSettings() throws IOException {
14321427
assertEquals(expectedParams, request.getParameters());
14331428
}
14341429

1430+
public void testPutTemplateRequest() throws Exception {
1431+
Map<String, String> names = new HashMap<>();
1432+
names.put("log", "log");
1433+
names.put("template#1", "template%231");
1434+
names.put("-#template", "-%23template");
1435+
names.put("foo^bar", "foo%5Ebar");
1436+
1437+
PutIndexTemplateRequest putTemplateRequest = new PutIndexTemplateRequest()
1438+
.name(randomFrom(names.keySet()))
1439+
.patterns(Arrays.asList(generateRandomStringArray(20, 100, false, false)));
1440+
if (randomBoolean()) {
1441+
putTemplateRequest.order(randomInt());
1442+
}
1443+
if (randomBoolean()) {
1444+
putTemplateRequest.version(randomInt());
1445+
}
1446+
if (randomBoolean()) {
1447+
putTemplateRequest.settings(Settings.builder().put("setting-" + randomInt(), randomTimeValue()));
1448+
}
1449+
if (randomBoolean()) {
1450+
putTemplateRequest.mapping("doc-" + randomInt(), "field-" + randomInt(), "type=" + randomFrom("text", "keyword"));
1451+
}
1452+
if (randomBoolean()) {
1453+
putTemplateRequest.alias(new Alias("alias-" + randomInt()));
1454+
}
1455+
Map<String, String> expectedParams = new HashMap<>();
1456+
if (randomBoolean()) {
1457+
expectedParams.put("create", Boolean.TRUE.toString());
1458+
putTemplateRequest.create(true);
1459+
}
1460+
if (randomBoolean()) {
1461+
String cause = randomUnicodeOfCodepointLengthBetween(1, 50);
1462+
putTemplateRequest.cause(cause);
1463+
expectedParams.put("cause", cause);
1464+
}
1465+
setRandomMasterTimeout(putTemplateRequest, expectedParams);
1466+
Request request = RequestConverters.putTemplate(putTemplateRequest);
1467+
assertThat(request.getEndpoint(), equalTo("/_template/" + names.get(putTemplateRequest.name())));
1468+
assertThat(request.getParameters(), equalTo(expectedParams));
1469+
assertToXContentBody(putTemplateRequest, request.getEntity());
1470+
}
1471+
14351472
private static void assertToXContentBody(ToXContent expectedBody, HttpEntity actualEntity) throws IOException {
14361473
BytesReference expectedBytes = XContentHelper.toXContent(expectedBody, REQUEST_BODY_CONTENT_TYPE, false);
14371474
assertEquals(XContentType.JSON.mediaTypeWithoutParameters(), actualEntity.getContentType().getValue());

0 commit comments

Comments
 (0)