Skip to content

Commit f071e96

Browse files
committed
Merge branch 'master' into upgrade-settings
* master: CORE: Make Pattern Exclusion Work with Aliases (elastic#33518) Reverse logic for CCR license checks (elastic#33549) Add latch countdown on failure in CCR license tests (elastic#33548) HLRC: Add put stored script support to high-level rest client (elastic#31323) Create temporary directory if needed in CCR test Add license checks for auto-follow implementation (elastic#33496) Bootstrap a new history_uuid when force allocating a stale primary (elastic#33432) INGEST: Remove Outdated TODOs (elastic#33458) Logging: Clean up skipping test Logging: Skip test if it'd fail CRUD: AwaitsFix entire wait_for_refresh close test Painless: Add Imported Static Method (elastic#33440)
2 parents f7a019e + d4b212c commit f071e96

File tree

66 files changed

+1334
-429
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1334
-429
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
3333
import org.elasticsearch.action.admin.cluster.storedscripts.DeleteStoredScriptRequest;
3434
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptRequest;
35+
import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest;
3536
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
3637
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
3738
import org.elasticsearch.action.admin.indices.analyze.AnalyzeRequest;
@@ -887,6 +888,19 @@ static Request getTemplates(GetIndexTemplatesRequest getIndexTemplatesRequest) t
887888
return request;
888889
}
889890

891+
static Request putScript(PutStoredScriptRequest putStoredScriptRequest) throws IOException {
892+
String endpoint = new EndpointBuilder().addPathPartAsIs("_scripts").addPathPart(putStoredScriptRequest.id()).build();
893+
Request request = new Request(HttpPost.METHOD_NAME, endpoint);
894+
Params params = new Params(request);
895+
params.withTimeout(putStoredScriptRequest.timeout());
896+
params.withMasterTimeout(putStoredScriptRequest.masterNodeTimeout());
897+
if (Strings.hasText(putStoredScriptRequest.context())) {
898+
params.putParam("context", putStoredScriptRequest.context());
899+
}
900+
request.setEntity(createEntity(putStoredScriptRequest, REQUEST_BODY_CONTENT_TYPE));
901+
return request;
902+
}
903+
890904
static Request analyze(AnalyzeRequest request) throws IOException {
891905
EndpointBuilder builder = new EndpointBuilder();
892906
String index = request.index();

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

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.elasticsearch.action.admin.cluster.storedscripts.DeleteStoredScriptRequest;
2929
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptRequest;
3030
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptResponse;
31+
import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest;
3132
import org.elasticsearch.action.bulk.BulkRequest;
3233
import org.elasticsearch.action.bulk.BulkResponse;
3334
import org.elasticsearch.action.delete.DeleteRequest;
@@ -121,36 +122,36 @@
121122
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
122123
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
123124
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
124-
import org.elasticsearch.search.aggregations.metrics.ParsedAvg;
125125
import org.elasticsearch.search.aggregations.metrics.CardinalityAggregationBuilder;
126-
import org.elasticsearch.search.aggregations.metrics.ParsedCardinality;
126+
import org.elasticsearch.search.aggregations.metrics.ExtendedStatsAggregationBuilder;
127127
import org.elasticsearch.search.aggregations.metrics.GeoBoundsAggregationBuilder;
128-
import org.elasticsearch.search.aggregations.metrics.ParsedGeoBounds;
129128
import org.elasticsearch.search.aggregations.metrics.GeoCentroidAggregationBuilder;
130-
import org.elasticsearch.search.aggregations.metrics.ParsedGeoCentroid;
131-
import org.elasticsearch.search.aggregations.metrics.MaxAggregationBuilder;
132-
import org.elasticsearch.search.aggregations.metrics.ParsedMax;
133-
import org.elasticsearch.search.aggregations.metrics.MinAggregationBuilder;
134-
import org.elasticsearch.search.aggregations.metrics.ParsedMin;
135129
import org.elasticsearch.search.aggregations.metrics.InternalHDRPercentileRanks;
136130
import org.elasticsearch.search.aggregations.metrics.InternalHDRPercentiles;
137-
import org.elasticsearch.search.aggregations.metrics.ParsedHDRPercentileRanks;
138-
import org.elasticsearch.search.aggregations.metrics.ParsedHDRPercentiles;
139131
import org.elasticsearch.search.aggregations.metrics.InternalTDigestPercentileRanks;
140132
import org.elasticsearch.search.aggregations.metrics.InternalTDigestPercentiles;
133+
import org.elasticsearch.search.aggregations.metrics.MaxAggregationBuilder;
134+
import org.elasticsearch.search.aggregations.metrics.MinAggregationBuilder;
135+
import org.elasticsearch.search.aggregations.metrics.ParsedAvg;
136+
import org.elasticsearch.search.aggregations.metrics.ParsedCardinality;
137+
import org.elasticsearch.search.aggregations.metrics.ParsedExtendedStats;
138+
import org.elasticsearch.search.aggregations.metrics.ParsedGeoBounds;
139+
import org.elasticsearch.search.aggregations.metrics.ParsedGeoCentroid;
140+
import org.elasticsearch.search.aggregations.metrics.ParsedHDRPercentileRanks;
141+
import org.elasticsearch.search.aggregations.metrics.ParsedHDRPercentiles;
142+
import org.elasticsearch.search.aggregations.metrics.ParsedMax;
143+
import org.elasticsearch.search.aggregations.metrics.ParsedMin;
144+
import org.elasticsearch.search.aggregations.metrics.ParsedScriptedMetric;
145+
import org.elasticsearch.search.aggregations.metrics.ParsedStats;
146+
import org.elasticsearch.search.aggregations.metrics.ParsedSum;
141147
import org.elasticsearch.search.aggregations.metrics.ParsedTDigestPercentileRanks;
142148
import org.elasticsearch.search.aggregations.metrics.ParsedTDigestPercentiles;
143-
import org.elasticsearch.search.aggregations.metrics.ParsedScriptedMetric;
149+
import org.elasticsearch.search.aggregations.metrics.ParsedTopHits;
150+
import org.elasticsearch.search.aggregations.metrics.ParsedValueCount;
144151
import org.elasticsearch.search.aggregations.metrics.ScriptedMetricAggregationBuilder;
145-
import org.elasticsearch.search.aggregations.metrics.ParsedStats;
146152
import org.elasticsearch.search.aggregations.metrics.StatsAggregationBuilder;
147-
import org.elasticsearch.search.aggregations.metrics.ExtendedStatsAggregationBuilder;
148-
import org.elasticsearch.search.aggregations.metrics.ParsedExtendedStats;
149-
import org.elasticsearch.search.aggregations.metrics.ParsedSum;
150153
import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
151-
import org.elasticsearch.search.aggregations.metrics.ParsedTopHits;
152154
import org.elasticsearch.search.aggregations.metrics.TopHitsAggregationBuilder;
153-
import org.elasticsearch.search.aggregations.metrics.ParsedValueCount;
154155
import org.elasticsearch.search.aggregations.metrics.ValueCountAggregationBuilder;
155156
import org.elasticsearch.search.aggregations.pipeline.InternalSimpleValue;
156157
import org.elasticsearch.search.aggregations.pipeline.ParsedSimpleValue;
@@ -1050,6 +1051,35 @@ public void deleteScriptAsync(DeleteStoredScriptRequest request, RequestOptions
10501051
AcknowledgedResponse::fromXContent, listener, emptySet());
10511052
}
10521053

1054+
/**
1055+
* Puts an stored script using the Scripting API.
1056+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html"> Scripting API
1057+
* on elastic.co</a>
1058+
* @param putStoredScriptRequest the request
1059+
* @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
1060+
* @return the response
1061+
* @throws IOException in case there is a problem sending the request or parsing back the response
1062+
*/
1063+
public AcknowledgedResponse putScript(PutStoredScriptRequest putStoredScriptRequest,
1064+
RequestOptions options) throws IOException {
1065+
return performRequestAndParseEntity(putStoredScriptRequest, RequestConverters::putScript, options,
1066+
AcknowledgedResponse::fromXContent, emptySet());
1067+
}
1068+
1069+
/**
1070+
* Asynchronously puts an stored script using the Scripting API.
1071+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html"> Scripting API
1072+
* on elastic.co</a>
1073+
* @param putStoredScriptRequest the request
1074+
* @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
1075+
* @param listener the listener to be notified upon request completion
1076+
*/
1077+
public void putScriptAsync(PutStoredScriptRequest putStoredScriptRequest, RequestOptions options,
1078+
ActionListener<AcknowledgedResponse> listener) {
1079+
performRequestAsyncAndParseEntity(putStoredScriptRequest, RequestConverters::putScript, options,
1080+
AcknowledgedResponse::fromXContent, listener, emptySet());
1081+
}
1082+
10531083
/**
10541084
* Asynchronously executes a request using the Field Capabilities API.
10551085
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.elasticsearch.action.DocWriteRequest;
3232
import org.elasticsearch.action.admin.cluster.storedscripts.DeleteStoredScriptRequest;
3333
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptRequest;
34+
import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest;
3435
import org.elasticsearch.action.admin.indices.alias.Alias;
3536
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
3637
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions;
@@ -1991,6 +1992,42 @@ public void testGetTemplateRequest() throws Exception {
19911992
assertThat(request.getEntity(), nullValue());
19921993
}
19931994

1995+
public void testPutScript() throws Exception {
1996+
PutStoredScriptRequest putStoredScriptRequest = new PutStoredScriptRequest();
1997+
1998+
String id = randomAlphaOfLengthBetween(5, 10);
1999+
putStoredScriptRequest.id(id);
2000+
2001+
XContentType xContentType = randomFrom(XContentType.values());
2002+
try (XContentBuilder builder = XContentBuilder.builder(xContentType.xContent())) {
2003+
builder.startObject();
2004+
builder.startObject("script")
2005+
.field("lang", "painless")
2006+
.field("source", "Math.log(_score * 2) + params.multiplier")
2007+
.endObject();
2008+
builder.endObject();
2009+
2010+
putStoredScriptRequest.content(BytesReference.bytes(builder), xContentType);
2011+
}
2012+
2013+
Map<String, String> expectedParams = new HashMap<>();
2014+
setRandomMasterTimeout(putStoredScriptRequest, expectedParams);
2015+
setRandomTimeout(putStoredScriptRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams);
2016+
2017+
if (randomBoolean()) {
2018+
String context = randomAlphaOfLengthBetween(5, 10);
2019+
putStoredScriptRequest.context(context);
2020+
expectedParams.put("context", context);
2021+
}
2022+
2023+
Request request = RequestConverters.putScript(putStoredScriptRequest);
2024+
2025+
assertThat(request.getEndpoint(), equalTo("/_scripts/" + id));
2026+
assertThat(request.getParameters(), equalTo(expectedParams));
2027+
assertNotNull(request.getEntity());
2028+
assertToXContentBody(putStoredScriptRequest, request.getEntity());
2029+
}
2030+
19942031
public void testAnalyzeRequest() throws Exception {
19952032
AnalyzeRequest indexAnalyzeRequest = new AnalyzeRequest()
19962033
.text("Here is some text")

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,6 @@ public void testApiNamingConventions() throws Exception {
658658
"indices.get_upgrade",
659659
"indices.put_alias",
660660
"mtermvectors",
661-
"put_script",
662661
"reindex_rethrottle",
663662
"render_search_template",
664663
"scripts_painless_execute",
Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
package org.elasticsearch.client;/*
1+
package org.elasticsearch.client;
2+
/*
23
* Licensed to Elasticsearch under one or more contributor
34
* license agreements. See the NOTICE file distributed with
45
* this work for additional information regarding copyright
@@ -17,41 +18,37 @@
1718
* under the License.
1819
*/
1920

20-
import org.apache.http.util.EntityUtils;
2121
import org.elasticsearch.ElasticsearchStatusException;
2222
import org.elasticsearch.action.admin.cluster.storedscripts.DeleteStoredScriptRequest;
2323
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptRequest;
2424
import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptResponse;
25-
import org.elasticsearch.action.support.master.AcknowledgedResponse;
26-
import org.elasticsearch.common.Strings;
27-
import org.elasticsearch.common.xcontent.ToXContent;
25+
import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest;
26+
import org.elasticsearch.common.bytes.BytesArray;
2827
import org.elasticsearch.common.xcontent.XContentType;
2928
import org.elasticsearch.rest.RestStatus;
3029
import org.elasticsearch.script.Script;
3130
import org.elasticsearch.script.StoredScriptSource;
3231

3332
import java.util.Collections;
33+
import java.util.Map;
3434

35-
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
35+
import static org.elasticsearch.common.xcontent.support.XContentMapValues.extractValue;
36+
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
3637
import static org.hamcrest.Matchers.equalTo;
3738

3839
public class StoredScriptsIT extends ESRestHighLevelClientTestCase {
3940

40-
final String id = "calculate-score";
41+
private static final String id = "calculate-score";
4142

4243
public void testGetStoredScript() throws Exception {
4344
final StoredScriptSource scriptSource =
4445
new StoredScriptSource("painless",
4546
"Math.log(_score * 2) + params.my_modifier",
4647
Collections.singletonMap(Script.CONTENT_TYPE_OPTION, XContentType.JSON.mediaType()));
4748

48-
final String script = Strings.toString(scriptSource.toXContent(jsonBuilder(), ToXContent.EMPTY_PARAMS));
49-
// TODO: change to HighLevel PutStoredScriptRequest when it will be ready
50-
// so far - using low-level REST API
51-
Request putRequest = new Request("PUT", "/_scripts/calculate-score");
52-
putRequest.setJsonEntity("{\"script\":" + script + "}");
53-
Response putResponse = adminClient().performRequest(putRequest);
54-
assertEquals("{\"acknowledged\":true}", EntityUtils.toString(putResponse.getEntity()));
49+
PutStoredScriptRequest request =
50+
new PutStoredScriptRequest(id, "search", new BytesArray("{}"), XContentType.JSON, scriptSource);
51+
assertAcked(execute(request, highLevelClient()::putScript, highLevelClient()::putScriptAsync));
5552

5653
GetStoredScriptRequest getRequest = new GetStoredScriptRequest("calculate-score");
5754
getRequest.masterNodeTimeout("50s");
@@ -68,22 +65,14 @@ public void testDeleteStoredScript() throws Exception {
6865
"Math.log(_score * 2) + params.my_modifier",
6966
Collections.singletonMap(Script.CONTENT_TYPE_OPTION, XContentType.JSON.mediaType()));
7067

71-
final String script = Strings.toString(scriptSource.toXContent(jsonBuilder(), ToXContent.EMPTY_PARAMS));
72-
// TODO: change to HighLevel PutStoredScriptRequest when it will be ready
73-
// so far - using low-level REST API
74-
Request putRequest = new Request("PUT", "/_scripts/" + id);
75-
putRequest.setJsonEntity("{\"script\":" + script + "}");
76-
Response putResponse = adminClient().performRequest(putRequest);
77-
assertEquals("{\"acknowledged\":true}", EntityUtils.toString(putResponse.getEntity()));
68+
PutStoredScriptRequest request =
69+
new PutStoredScriptRequest(id, "search", new BytesArray("{}"), XContentType.JSON, scriptSource);
70+
assertAcked(execute(request, highLevelClient()::putScript, highLevelClient()::putScriptAsync));
7871

7972
DeleteStoredScriptRequest deleteRequest = new DeleteStoredScriptRequest(id);
8073
deleteRequest.masterNodeTimeout("50s");
8174
deleteRequest.timeout("50s");
82-
83-
AcknowledgedResponse deleteResponse = execute(deleteRequest, highLevelClient()::deleteScript,
84-
highLevelClient()::deleteScriptAsync);
85-
86-
assertThat(deleteResponse.isAcknowledged(), equalTo(true));
75+
assertAcked(execute(deleteRequest, highLevelClient()::deleteScript, highLevelClient()::deleteScriptAsync));
8776

8877
GetStoredScriptRequest getRequest = new GetStoredScriptRequest(id);
8978

@@ -92,4 +81,21 @@ public void testDeleteStoredScript() throws Exception {
9281
highLevelClient()::getScriptAsync));
9382
assertThat(statusException.status(), equalTo(RestStatus.NOT_FOUND));
9483
}
84+
85+
public void testPutScript() throws Exception {
86+
final StoredScriptSource scriptSource =
87+
new StoredScriptSource("painless",
88+
"Math.log(_score * 2) + params.my_modifier",
89+
Collections.singletonMap(Script.CONTENT_TYPE_OPTION, XContentType.JSON.mediaType()));
90+
91+
PutStoredScriptRequest request =
92+
new PutStoredScriptRequest(id, "search", new BytesArray("{}"), XContentType.JSON, scriptSource);
93+
assertAcked(execute(request, highLevelClient()::putScript, highLevelClient()::putScriptAsync));
94+
95+
Map<String, Object> script = getAsMap("/_scripts/" + id);
96+
assertThat(extractValue("_id", script), equalTo(id));
97+
assertThat(extractValue("found", script), equalTo(true));
98+
assertThat(extractValue("script.lang", script), equalTo("painless"));
99+
assertThat(extractValue("script.source", script), equalTo("Math.log(_score * 2) + params.my_modifier"));
100+
}
95101
}

0 commit comments

Comments
 (0)