Skip to content

Commit 2aa0570

Browse files
committed
Merge branch '6.x' into ccr-6.x
* 6.x: [DOCS] Fixes typos in security settings Add support for indexed shape routing in geo_shape query (#30760) [DOCS] Splits auditing.asciidoc into smaller files Painless: Types Section Clean Up (#30283) [test] java tests for archive packaging (#30734) Deprecate http.pipelining setting (#30786) [DOCS] Fix more edit URLs in Stack Overview (#30704) Use correct cluster state version for node fault detection (#30810) [DOCS] Fixes broken link for native realm [DOCS] Clarified audit.index.client.hosts (#30797) Change serialization version of doc-value fields. Add a `format` option to `docvalue_fields`. (#29639) [TEST] Don't expect acks when isolating nodes Fixes UpdateSettingsRequestStreamableTests mutate bug Revert "Add more yaml tests for get alias API (#29513)" Revert "Mutes MachineLearningTests.testNoAttributes_givenSameAndMlEnabled" Only allow x-pack metadata if all nodes are ready (#30743) Mutes MachineLearningTests.testNoAttributes_givenSameAndMlEnabled Use original settings on full-cluster restart (#30780) Only ack cluster state updates successfully applied on all nodes (#30672) Replace Request#setHeaders with addHeader (#30588) [TEST] remove endless wait in RestClientTests (#30776) QA: Add xpack tests to rolling upgrade (#30795) Add support for search templates to the high-level REST client. (#30473) Reduce CLI scripts to one-liners on Windows (#30772) Fold RestGetAllSettingsAction in RestGetSettingsAction (#30561) Add more yaml tests for get alias API (#29513) [Docs] Fix script-fields snippet execution (#30693) Convert FieldCapabilitiesResponse to a ToXContentObject. (#30182) Remove assert statements from field caps documentation. (#30601) Fix a bug in FieldCapabilitiesRequest#equals and hashCode. (#30181) Add support for field capabilities to the high-level REST client. (#29664) [DOCS] Add SAML configuration information (#30548) [DOCS] Remove X-Pack references from SQL CLI (#30694) [Docs] Fix typo in circuit breaker docs (#29659) [Feature] Adding a char_group tokenizer (#24186) Increase the maximum number of filters that may be in the cache. (#30655) [Docs] Fix broken cross link in documentation Test: wait for netty threads in a JUnit ClassRule (#30763) [Security] Include an empty json object in an json array when FLS filters out all fields (#30709) [DOCS] fixed incorrect default [TEST] Wait for CS to be fully applied in testDeleteCreateInOneBulk Enable installing plugins from snapshots.elastic.co (#30765) Ignore empty completion input (#30713) Fix docs failure on language analyzers (#30722) [Docs] Fix inconsistencies in snapshot/restore doc (#30480) Add Delete Repository High Level REST API (#30666) Reduce CLI scripts to one-liners (#30759)
2 parents f45a2eb + 7d63d3d commit 2aa0570

File tree

266 files changed

+7052
-1974
lines changed

Some content is hidden

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

266 files changed

+7052
-1974
lines changed

TESTING.asciidoc

+24-4
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,9 @@ into it
512512
vagrant ssh debian-9
513513
--------------------------------------------
514514

515-
Now inside the VM, to run the https://github.com/sstephenson/bats[bats] packaging tests
515+
Now inside the VM, start the packaging tests from the terminal. There are two packaging
516+
test projects. The old ones are written with https://github.com/sstephenson/bats[bats]
517+
and only run on linux. To run them do
516518

517519
--------------------------------------------
518520
cd $PACKAGING_ARCHIVES
@@ -524,18 +526,36 @@ sudo bats $BATS_TESTS/*.bats
524526
sudo bats $BATS_TESTS/20_tar_package.bats $BATS_TESTS/25_tar_plugins.bats
525527
--------------------------------------------
526528

527-
To run the Java packaging tests, again inside the VM
529+
The new packaging tests are written in Java and run on both linux and windows. On
530+
linux (again, inside the VM)
528531

529532
--------------------------------------------
530-
bash $PACKAGING_TESTS/run-tests.sh
533+
# run the full suite
534+
sudo bash $PACKAGING_TESTS/run-tests.sh
535+
536+
# run specific test cases
537+
sudo bash $PACKAGING_TESTS/run-tests.sh \
538+
org.elasticsearch.packaging.test.DefaultZipTests \
539+
org.elasticsearch.packaging.test.OssZipTests
531540
--------------------------------------------
532541

533-
or on Windows
542+
or on Windows, from a terminal running as Administrator
534543

535544
--------------------------------------------
545+
# run the full suite
536546
powershell -File $Env:PACKAGING_TESTS/run-tests.ps1
547+
548+
# run specific test cases
549+
powershell -File $Env:PACKAGING_TESTS/run-tests.ps1 `
550+
org.elasticsearch.packaging.test.DefaultZipTests `
551+
org.elasticsearch.packaging.test.OssZipTests
537552
--------------------------------------------
538553

554+
Note that on Windows boxes when running from inside the GUI, you may have to log out and
555+
back in to the `vagrant` user (password `vagrant`) for the environment variables that
556+
locate the packaging tests and distributions to take effect, due to how vagrant provisions
557+
Windows machines.
558+
539559
When you've made changes you want to test, keep the VM up and reload the tests and
540560
distributions inside by running (on the host)
541561

Vagrantfile

+1
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ def linux_common(config,
237237

238238
config.vm.provision 'markerfile', type: 'shell', inline: <<-SHELL
239239
touch /etc/is_vagrant_vm
240+
touch /is_vagrant_vm # for consistency between linux and windows
240241
SHELL
241242

242243
# This prevents leftovers from previous tests using the

buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy

+20-3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class VagrantTestPlugin implements Plugin<Project> {
5252
static final List<String> DISTRIBUTIONS = unmodifiableList([
5353
'archives:tar',
5454
'archives:oss-tar',
55+
'archives:zip',
56+
'archives:oss-zip',
5557
'packages:rpm',
5658
'packages:oss-rpm',
5759
'packages:deb',
@@ -242,13 +244,27 @@ class VagrantTestPlugin implements Plugin<Project> {
242244
Task createLinuxRunnerScript = project.tasks.create('createLinuxRunnerScript', FileContentsTask) {
243245
dependsOn copyPackagingTests
244246
file "${testsDir}/run-tests.sh"
245-
contents "java -cp \"\$PACKAGING_TESTS/*\" org.junit.runner.JUnitCore ${-> project.extensions.esvagrant.testClass}"
247+
contents """\
248+
if [ "\$#" -eq 0 ]; then
249+
test_args=( "${-> project.extensions.esvagrant.testClass}" )
250+
else
251+
test_args=( "\$@" )
252+
fi
253+
java -cp "\$PACKAGING_TESTS/*" org.elasticsearch.packaging.VMTestRunner "\${test_args[@]}"
254+
"""
246255
}
247256
Task createWindowsRunnerScript = project.tasks.create('createWindowsRunnerScript', FileContentsTask) {
248257
dependsOn copyPackagingTests
249258
file "${testsDir}/run-tests.ps1"
259+
// the use of $args rather than param() here is deliberate because the syntax for array (multivalued) parameters is likely
260+
// a little trappy for those unfamiliar with powershell
250261
contents """\
251-
java -cp "\$Env:PACKAGING_TESTS/*" org.junit.runner.JUnitCore ${-> project.extensions.esvagrant.testClass}
262+
if (\$args.Count -eq 0) {
263+
\$testArgs = @("${-> project.extensions.esvagrant.testClass}")
264+
} else {
265+
\$testArgs = \$args
266+
}
267+
java -cp "\$Env:PACKAGING_TESTS/*" org.elasticsearch.packaging.VMTestRunner @testArgs
252268
exit \$LASTEXITCODE
253269
"""
254270
}
@@ -525,9 +541,10 @@ class VagrantTestPlugin implements Plugin<Project> {
525541

526542
if (LINUX_BOXES.contains(box)) {
527543
javaPackagingTest.command = 'ssh'
528-
javaPackagingTest.args = ['--command', 'bash "$PACKAGING_TESTS/run-tests.sh"']
544+
javaPackagingTest.args = ['--command', 'sudo bash "$PACKAGING_TESTS/run-tests.sh"']
529545
} else {
530546
javaPackagingTest.command = 'winrm'
547+
// winrm commands run as administrator
531548
javaPackagingTest.args = ['--command', 'powershell -File "$Env:PACKAGING_TESTS/run-tests.ps1"']
532549
}
533550

client/rest-high-level/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dependencies {
4040
compile "org.elasticsearch.plugin:parent-join-client:${version}"
4141
compile "org.elasticsearch.plugin:aggs-matrix-stats-client:${version}"
4242
compile "org.elasticsearch.plugin:rank-eval-client:${version}"
43+
compile "org.elasticsearch.plugin:lang-mustache-client:${version}"
4344

4445
testCompile "org.elasticsearch.client:test:${version}"
4546
testCompile "org.elasticsearch.test:framework:${version}"

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

+59-6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.lucene.util.BytesRef;
3131
import org.elasticsearch.action.DocWriteRequest;
3232
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
33+
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest;
3334
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
3435
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
3536
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
@@ -46,13 +47,14 @@
4647
import org.elasticsearch.action.admin.indices.open.OpenIndexRequest;
4748
import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
4849
import org.elasticsearch.action.admin.indices.rollover.RolloverRequest;
49-
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;
5050
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest;
51+
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;
5152
import org.elasticsearch.action.admin.indices.shrink.ResizeRequest;
5253
import org.elasticsearch.action.admin.indices.shrink.ResizeType;
5354
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateRequest;
5455
import org.elasticsearch.action.bulk.BulkRequest;
5556
import org.elasticsearch.action.delete.DeleteRequest;
57+
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
5658
import org.elasticsearch.action.get.GetRequest;
5759
import org.elasticsearch.action.get.MultiGetRequest;
5860
import org.elasticsearch.action.index.IndexRequest;
@@ -81,6 +83,7 @@
8183
import org.elasticsearch.index.VersionType;
8284
import org.elasticsearch.index.rankeval.RankEvalRequest;
8385
import org.elasticsearch.rest.action.search.RestSearchAction;
86+
import org.elasticsearch.script.mustache.SearchTemplateRequest;
8487
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
8588
import org.elasticsearch.tasks.TaskId;
8689

@@ -469,6 +472,15 @@ static Request search(SearchRequest searchRequest) throws IOException {
469472
Request request = new Request(HttpPost.METHOD_NAME, endpoint(searchRequest.indices(), searchRequest.types(), "_search"));
470473

471474
Params params = new Params(request);
475+
addSearchRequestParams(params, searchRequest);
476+
477+
if (searchRequest.source() != null) {
478+
request.setEntity(createEntity(searchRequest.source(), REQUEST_BODY_CONTENT_TYPE));
479+
}
480+
return request;
481+
}
482+
483+
private static void addSearchRequestParams(Params params, SearchRequest searchRequest) {
472484
params.putParam(RestSearchAction.TYPED_KEYS_PARAM, "true");
473485
params.withRouting(searchRequest.routing());
474486
params.withPreference(searchRequest.preference());
@@ -484,11 +496,6 @@ static Request search(SearchRequest searchRequest) throws IOException {
484496
if (searchRequest.scroll() != null) {
485497
params.putParam("scroll", searchRequest.scroll().keepAlive());
486498
}
487-
488-
if (searchRequest.source() != null) {
489-
request.setEntity(createEntity(searchRequest.source(), REQUEST_BODY_CONTENT_TYPE));
490-
}
491-
return request;
492499
}
493500

494501
static Request searchScroll(SearchScrollRequest searchScrollRequest) throws IOException {
@@ -518,6 +525,24 @@ static Request multiSearch(MultiSearchRequest multiSearchRequest) throws IOExcep
518525
return request;
519526
}
520527

528+
static Request searchTemplate(SearchTemplateRequest searchTemplateRequest) throws IOException {
529+
Request request;
530+
531+
if (searchTemplateRequest.isSimulate()) {
532+
request = new Request(HttpGet.METHOD_NAME, "_render/template");
533+
} else {
534+
SearchRequest searchRequest = searchTemplateRequest.getRequest();
535+
String endpoint = endpoint(searchRequest.indices(), searchRequest.types(), "_search/template");
536+
request = new Request(HttpGet.METHOD_NAME, endpoint);
537+
538+
Params params = new Params(request);
539+
addSearchRequestParams(params, searchRequest);
540+
}
541+
542+
request.setEntity(createEntity(searchTemplateRequest, REQUEST_BODY_CONTENT_TYPE));
543+
return request;
544+
}
545+
521546
static Request existsAlias(GetAliasesRequest getAliasesRequest) {
522547
if ((getAliasesRequest.indices() == null || getAliasesRequest.indices().length == 0) &&
523548
(getAliasesRequest.aliases() == null || getAliasesRequest.aliases().length == 0)) {
@@ -534,6 +559,17 @@ static Request existsAlias(GetAliasesRequest getAliasesRequest) {
534559
return request;
535560
}
536561

562+
static Request fieldCaps(FieldCapabilitiesRequest fieldCapabilitiesRequest) {
563+
String[] indices = fieldCapabilitiesRequest.indices();
564+
Request request = new Request(HttpGet.METHOD_NAME, endpoint(indices, "_field_caps"));
565+
566+
Params params = new Params(request);
567+
params.withFields(fieldCapabilitiesRequest.fields());
568+
params.withIndicesOptions(fieldCapabilitiesRequest.indicesOptions());
569+
570+
return request;
571+
}
572+
537573
static Request rankEval(RankEvalRequest rankEvalRequest) throws IOException {
538574
Request request = new Request(HttpGet.METHOD_NAME, endpoint(rankEvalRequest.indices(), Strings.EMPTY_ARRAY, "_rank_eval"));
539575

@@ -687,6 +723,16 @@ static Request createRepository(PutRepositoryRequest putRepositoryRequest) throw
687723
return request;
688724
}
689725

726+
static Request deleteRepository(DeleteRepositoryRequest deleteRepositoryRequest) {
727+
String endpoint = new EndpointBuilder().addPathPartAsIs("_snapshot").addPathPart(deleteRepositoryRequest.name()).build();
728+
Request request = new Request(HttpDelete.METHOD_NAME, endpoint);
729+
730+
Params parameters = new Params(request);
731+
parameters.withMasterTimeout(deleteRepositoryRequest.masterNodeTimeout());
732+
parameters.withTimeout(deleteRepositoryRequest.timeout());
733+
return request;
734+
}
735+
690736
static Request putTemplate(PutIndexTemplateRequest putIndexTemplateRequest) throws IOException {
691737
String endpoint = new EndpointBuilder().addPathPartAsIs("_template").addPathPart(putIndexTemplateRequest.name()).build();
692738
Request request = new Request(HttpPut.METHOD_NAME, endpoint);
@@ -795,6 +841,13 @@ Params withFetchSourceContext(FetchSourceContext fetchSourceContext) {
795841
return this;
796842
}
797843

844+
Params withFields(String[] fields) {
845+
if (fields != null && fields.length > 0) {
846+
return putParam("fields", String.join(",", fields));
847+
}
848+
return this;
849+
}
850+
798851
Params withMasterTimeout(TimeValue masterTimeout) {
799852
return putParam("master_timeout", masterTimeout);
800853
}

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

+64-4
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626
import org.elasticsearch.action.ActionListener;
2727
import org.elasticsearch.action.ActionRequest;
2828
import org.elasticsearch.action.ActionRequestValidationException;
29-
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
30-
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
3129
import org.elasticsearch.action.bulk.BulkRequest;
3230
import org.elasticsearch.action.bulk.BulkResponse;
3331
import org.elasticsearch.action.delete.DeleteRequest;
3432
import org.elasticsearch.action.delete.DeleteResponse;
33+
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
34+
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesResponse;
3535
import org.elasticsearch.action.get.GetRequest;
3636
import org.elasticsearch.action.get.GetResponse;
3737
import org.elasticsearch.action.get.MultiGetRequest;
@@ -62,6 +62,8 @@
6262
import org.elasticsearch.plugins.spi.NamedXContentProvider;
6363
import org.elasticsearch.rest.BytesRestResponse;
6464
import org.elasticsearch.rest.RestStatus;
65+
import org.elasticsearch.script.mustache.SearchTemplateRequest;
66+
import org.elasticsearch.script.mustache.SearchTemplateResponse;
6567
import org.elasticsearch.search.aggregations.Aggregation;
6668
import org.elasticsearch.search.aggregations.bucket.adjacency.AdjacencyMatrixAggregationBuilder;
6769
import org.elasticsearch.search.aggregations.bucket.adjacency.ParsedAdjacencyMatrix;
@@ -499,6 +501,32 @@ public final void clearScrollAsync(ClearScrollRequest clearScrollRequest,
499501
listener, emptySet(), headers);
500502
}
501503

504+
/**
505+
* Executes a request using the Search Template API.
506+
*
507+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html">Search Template API
508+
* on elastic.co</a>.
509+
*/
510+
public final SearchTemplateResponse searchTemplate(SearchTemplateRequest searchTemplateRequest,
511+
Header... headers) throws IOException {
512+
return performRequestAndParseEntity(searchTemplateRequest, RequestConverters::searchTemplate,
513+
SearchTemplateResponse::fromXContent, emptySet(), headers);
514+
}
515+
516+
/**
517+
* Asynchronously executes a request using the Search Template API
518+
*
519+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html">Search Template API
520+
* on elastic.co</a>.
521+
*/
522+
public final void searchTemplateAsync(SearchTemplateRequest searchTemplateRequest,
523+
ActionListener<SearchTemplateResponse> listener,
524+
Header... headers) {
525+
performRequestAsyncAndParseEntity(searchTemplateRequest, RequestConverters::searchTemplate,
526+
SearchTemplateResponse::fromXContent, listener, emptySet(), headers);
527+
}
528+
529+
502530
/**
503531
* Executes a request using the Ranking Evaluation API.
504532
*
@@ -521,6 +549,31 @@ public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener<
521549
emptySet(), headers);
522550
}
523551

552+
/**
553+
* Executes a request using the Field Capabilities API.
554+
*
555+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API
556+
* on elastic.co</a>.
557+
*/
558+
public final FieldCapabilitiesResponse fieldCaps(FieldCapabilitiesRequest fieldCapabilitiesRequest,
559+
Header... headers) throws IOException {
560+
return performRequestAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps,
561+
FieldCapabilitiesResponse::fromXContent, emptySet(), headers);
562+
}
563+
564+
/**
565+
* Asynchronously executes a request using the Field Capabilities API.
566+
*
567+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html">Field Capabilities API
568+
* on elastic.co</a>.
569+
*/
570+
public final void fieldCapsAsync(FieldCapabilitiesRequest fieldCapabilitiesRequest,
571+
ActionListener<FieldCapabilitiesResponse> listener,
572+
Header... headers) {
573+
performRequestAsyncAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps,
574+
FieldCapabilitiesResponse::fromXContent, listener, emptySet(), headers);
575+
}
576+
524577
protected final <Req extends ActionRequest, Resp> Resp performRequestAndParseEntity(Req request,
525578
CheckedFunction<Req, Request, IOException> requestConverter,
526579
CheckedFunction<XContentParser, Resp, IOException> entityParser,
@@ -537,7 +590,7 @@ protected final <Req extends ActionRequest, Resp> Resp performRequest(Req reques
537590
throw validationException;
538591
}
539592
Request req = requestConverter.apply(request);
540-
req.setHeaders(headers);
593+
addHeaders(req, headers);
541594
Response response;
542595
try {
543596
response = client.performRequest(req);
@@ -587,12 +640,19 @@ protected final <Req extends ActionRequest, Resp> void performRequestAsync(Req r
587640
listener.onFailure(e);
588641
return;
589642
}
590-
req.setHeaders(headers);
643+
addHeaders(req, headers);
591644

592645
ResponseListener responseListener = wrapResponseListener(responseConverter, listener, ignores);
593646
client.performRequestAsync(req, responseListener);
594647
}
595648

649+
private static void addHeaders(Request request, Header... headers) {
650+
Objects.requireNonNull(headers, "headers cannot be null");
651+
for (Header header : headers) {
652+
request.addHeader(header.getName(), header.getValue());
653+
}
654+
}
655+
596656
final <Resp> ResponseListener wrapResponseListener(CheckedFunction<Response, Resp, IOException> responseConverter,
597657
ActionListener<Resp> actionListener, Set<Integer> ignores) {
598658
return new ResponseListener() {

0 commit comments

Comments
 (0)