Skip to content

Commit 7e811c7

Browse files
committed
Merge remote-tracking branch 'origin/6.x' into ccr-6.x
* 6.x: Make AllocatedPersistentTask.isCompleted() protected (#30949) Fix license on AcitveDirectorySIDUtil (#30972) [Test] Prefer ArrayList over Vector (#30965) [CI] Mute HttpSecretsIntegrationTests#testWebhookAction test Cross Cluster Search: do not use dedicated masters as gateways (#30926) Fix AliasMetaData parsing (#30866) SQL: Remove log4j and joda from JDBC dependencies (#30938) Add Verify Repository High Level REST API (#30934) Mute FlushIT tests
2 parents 4da2299 + 89016cb commit 7e811c7

File tree

28 files changed

+581
-760
lines changed

28 files changed

+581
-760
lines changed

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

+14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest;
3434
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
3535
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
36+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest;
3637
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
3738
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
3839
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
@@ -758,6 +759,19 @@ static Request deleteRepository(DeleteRepositoryRequest deleteRepositoryRequest)
758759
return request;
759760
}
760761

762+
static Request verifyRepository(VerifyRepositoryRequest verifyRepositoryRequest) {
763+
String endpoint = new EndpointBuilder().addPathPartAsIs("_snapshot")
764+
.addPathPart(verifyRepositoryRequest.name())
765+
.addPathPartAsIs("_verify")
766+
.build();
767+
Request request = new Request(HttpPost.METHOD_NAME, endpoint);
768+
769+
Params parameters = new Params(request);
770+
parameters.withMasterTimeout(verifyRepositoryRequest.masterNodeTimeout());
771+
parameters.withTimeout(verifyRepositoryRequest.timeout());
772+
return request;
773+
}
774+
761775
static Request putTemplate(PutIndexTemplateRequest putIndexTemplateRequest) throws IOException {
762776
String endpoint = new EndpointBuilder().addPathPartAsIs("_template").addPathPart(putIndexTemplateRequest.name()).build();
763777
Request request = new Request(HttpPut.METHOD_NAME, endpoint);

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

+26
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
2828
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
2929
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
30+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest;
31+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse;
3032

3133
import java.io.IOException;
3234

@@ -116,4 +118,28 @@ public void deleteRepositoryAsync(DeleteRepositoryRequest deleteRepositoryReques
116118
restHighLevelClient.performRequestAsyncAndParseEntity(deleteRepositoryRequest, RequestConverters::deleteRepository,
117119
DeleteRepositoryResponse::fromXContent, listener, emptySet(), headers);
118120
}
121+
122+
/**
123+
* Verifies a snapshot repository.
124+
* <p>
125+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
126+
* API on elastic.co</a>
127+
*/
128+
public VerifyRepositoryResponse verifyRepository(VerifyRepositoryRequest verifyRepositoryRequest, Header... headers)
129+
throws IOException {
130+
return restHighLevelClient.performRequestAndParseEntity(verifyRepositoryRequest, RequestConverters::verifyRepository,
131+
VerifyRepositoryResponse::fromXContent, emptySet(), headers);
132+
}
133+
134+
/**
135+
* Asynchronously verifies a snapshot repository.
136+
* <p>
137+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
138+
* API on elastic.co</a>
139+
*/
140+
public void verifyRepositoryAsync(VerifyRepositoryRequest verifyRepositoryRequest,
141+
ActionListener<VerifyRepositoryResponse> listener, Header... headers) {
142+
restHighLevelClient.performRequestAsyncAndParseEntity(verifyRepositoryRequest, RequestConverters::verifyRepository,
143+
VerifyRepositoryResponse::fromXContent, listener, emptySet(), headers);
144+
}
119145
}

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

+16
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.elasticsearch.action.admin.cluster.repositories.delete.DeleteRepositoryRequest;
3434
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
3535
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
36+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest;
3637
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
3738
import org.elasticsearch.action.admin.indices.alias.Alias;
3839
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
@@ -1665,6 +1666,21 @@ public void testDeleteRepository() {
16651666
assertNull(request.getEntity());
16661667
}
16671668

1669+
public void testVerifyRepository() {
1670+
Map<String, String> expectedParams = new HashMap<>();
1671+
String repository = randomIndicesNames(1, 1)[0];
1672+
String endpoint = "/_snapshot/" + repository + "/_verify";
1673+
1674+
VerifyRepositoryRequest verifyRepositoryRequest = new VerifyRepositoryRequest(repository);
1675+
setRandomMasterTimeout(verifyRepositoryRequest, expectedParams);
1676+
setRandomTimeout(verifyRepositoryRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams);
1677+
1678+
Request request = RequestConverters.verifyRepository(verifyRepositoryRequest);
1679+
assertThat(endpoint, equalTo(request.getEndpoint()));
1680+
assertThat(HttpPost.METHOD_NAME, equalTo(request.getMethod()));
1681+
assertThat(expectedParams, equalTo(request.getParameters()));
1682+
}
1683+
16681684
public void testPutTemplateRequest() throws Exception {
16691685
Map<String, String> names = new HashMap<>();
16701686
names.put("log", "log");

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

+13-4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
2929
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
3030
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
31+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest;
32+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse;
3133
import org.elasticsearch.common.xcontent.XContentType;
3234
import org.elasticsearch.repositories.fs.FsRepository;
3335
import org.elasticsearch.rest.RestStatus;
@@ -86,10 +88,7 @@ public void testSnapshotGetRepositoriesNonExistent() {
8688

8789
public void testSnapshotDeleteRepository() throws IOException {
8890
String repository = "test";
89-
String repositorySettings = "{\"type\":\"fs\", \"settings\":{\"location\": \".\"}}";
90-
91-
highLevelClient().getLowLevelClient().performRequest("put", "_snapshot/" + repository,
92-
Collections.emptyMap(), new StringEntity(repositorySettings, ContentType.APPLICATION_JSON));
91+
assertTrue(createTestRepository(repository, FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged());
9392

9493
GetRepositoriesRequest request = new GetRepositoriesRequest();
9594
GetRepositoriesResponse response = execute(request, highLevelClient().snapshot()::getRepositories,
@@ -102,4 +101,14 @@ public void testSnapshotDeleteRepository() throws IOException {
102101

103102
assertTrue(deleteResponse.isAcknowledged());
104103
}
104+
105+
public void testVerifyRepository() throws IOException {
106+
PutRepositoryResponse putRepositoryResponse = createTestRepository("test", FsRepository.TYPE, "{\"location\": \".\"}");
107+
assertTrue(putRepositoryResponse.isAcknowledged());
108+
109+
VerifyRepositoryRequest request = new VerifyRepositoryRequest("test");
110+
VerifyRepositoryResponse response = execute(request, highLevelClient().snapshot()::verifyRepository,
111+
highLevelClient().snapshot()::verifyRepositoryAsync);
112+
assertThat(response.getNodes().size(), equalTo(1));
113+
}
105114
}

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

+62
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
2828
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
2929
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
30+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryRequest;
31+
import org.elasticsearch.action.admin.cluster.repositories.verify.VerifyRepositoryResponse;
3032
import org.elasticsearch.client.ESRestHighLevelClientTestCase;
3133
import org.elasticsearch.client.RestHighLevelClient;
3234
import org.elasticsearch.cluster.metadata.RepositoryMetaData;
@@ -297,6 +299,66 @@ public void onFailure(Exception e) {
297299
}
298300
}
299301

302+
public void testSnapshotVerifyRepository() throws IOException {
303+
RestHighLevelClient client = highLevelClient();
304+
createTestRepositories();
305+
306+
// tag::verify-repository-request
307+
VerifyRepositoryRequest request = new VerifyRepositoryRequest(repositoryName);
308+
// end::verify-repository-request
309+
310+
// tag::verify-repository-request-masterTimeout
311+
request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); // <1>
312+
request.masterNodeTimeout("1m"); // <2>
313+
// end::verify-repository-request-masterTimeout
314+
// tag::verify-repository-request-timeout
315+
request.timeout(TimeValue.timeValueMinutes(1)); // <1>
316+
request.timeout("1m"); // <2>
317+
// end::verify-repository-request-timeout
318+
319+
// tag::verify-repository-execute
320+
VerifyRepositoryResponse response = client.snapshot().verifyRepository(request);
321+
// end::verify-repository-execute
322+
323+
// tag::verify-repository-response
324+
List<VerifyRepositoryResponse.NodeView> repositoryMetaDataResponse = response.getNodes();
325+
// end::verify-repository-response
326+
assertThat(1, equalTo(repositoryMetaDataResponse.size()));
327+
assertThat("node-0", equalTo(repositoryMetaDataResponse.get(0).getName()));
328+
}
329+
330+
public void testSnapshotVerifyRepositoryAsync() throws InterruptedException {
331+
RestHighLevelClient client = highLevelClient();
332+
{
333+
VerifyRepositoryRequest request = new VerifyRepositoryRequest(repositoryName);
334+
335+
// tag::verify-repository-execute-listener
336+
ActionListener<VerifyRepositoryResponse> listener =
337+
new ActionListener<VerifyRepositoryResponse>() {
338+
@Override
339+
public void onResponse(VerifyRepositoryResponse verifyRepositoryRestResponse) {
340+
// <1>
341+
}
342+
343+
@Override
344+
public void onFailure(Exception e) {
345+
// <2>
346+
}
347+
};
348+
// end::verify-repository-execute-listener
349+
350+
// Replace the empty listener by a blocking listener in test
351+
final CountDownLatch latch = new CountDownLatch(1);
352+
listener = new LatchedActionListener<>(listener, latch);
353+
354+
// tag::verify-repository-execute-async
355+
client.snapshot().verifyRepositoryAsync(request, listener); // <1>
356+
// end::verify-repository-execute-async
357+
358+
assertTrue(latch.await(30L, TimeUnit.SECONDS));
359+
}
360+
}
361+
300362
private void createTestRepositories() throws IOException {
301363
PutRepositoryRequest request = new PutRepositoryRequest(repositoryName);
302364
request.type(FsRepository.TYPE);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
[[java-rest-high-snapshot-verify-repository]]
2+
=== Snapshot Verify Repository API
3+
4+
The Snapshot Verify Repository API allows to verify a registered repository.
5+
6+
[[java-rest-high-snapshot-verify-repository-request]]
7+
==== Snapshot Verify Repository Request
8+
9+
A `VerifyRepositoryRequest`:
10+
11+
["source","java",subs="attributes,callouts,macros"]
12+
--------------------------------------------------
13+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[verify-repository-request]
14+
--------------------------------------------------
15+
16+
==== Optional Arguments
17+
The following arguments can optionally be provided:
18+
19+
["source","java",subs="attributes,callouts,macros"]
20+
--------------------------------------------------
21+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[create-repository-request-timeout]
22+
--------------------------------------------------
23+
<1> Timeout to wait for the all the nodes to acknowledge the settings were applied
24+
as a `TimeValue`
25+
<2> Timeout to wait for the all the nodes to acknowledge the settings were applied
26+
as a `String`
27+
28+
["source","java",subs="attributes,callouts,macros"]
29+
--------------------------------------------------
30+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[verify-repository-request-masterTimeout]
31+
--------------------------------------------------
32+
<1> Timeout to connect to the master node as a `TimeValue`
33+
<2> Timeout to connect to the master node as a `String`
34+
35+
[[java-rest-high-snapshot-verify-repository-sync]]
36+
==== Synchronous Execution
37+
38+
["source","java",subs="attributes,callouts,macros"]
39+
--------------------------------------------------
40+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[verify-repository-execute]
41+
--------------------------------------------------
42+
43+
[[java-rest-high-snapshot-verify-repository-async]]
44+
==== Asynchronous Execution
45+
46+
The asynchronous execution of a snapshot verify repository requires both the
47+
`VerifyRepositoryRequest` instance and an `ActionListener` instance to be
48+
passed to the asynchronous method:
49+
50+
["source","java",subs="attributes,callouts,macros"]
51+
--------------------------------------------------
52+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[verify-repository-execute-async]
53+
--------------------------------------------------
54+
<1> The `VerifyRepositoryRequest` to execute and the `ActionListener`
55+
to use when the execution completes
56+
57+
The asynchronous method does not block and returns immediately. Once it is
58+
completed the `ActionListener` is called back using the `onResponse` method
59+
if the execution successfully completed or using the `onFailure` method if
60+
it failed.
61+
62+
A typical listener for `VerifyRepositoryResponse` looks like:
63+
64+
["source","java",subs="attributes,callouts,macros"]
65+
--------------------------------------------------
66+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[verify-repository-execute-listener]
67+
--------------------------------------------------
68+
<1> Called when the execution is successfully completed. The response is
69+
provided as an argument
70+
<2> Called in case of a failure. The raised exception is provided as an argument
71+
72+
[[java-rest-high-cluster-verify-repository-response]]
73+
==== Snapshot Verify Repository Response
74+
75+
The returned `VerifyRepositoryResponse` allows to retrieve information about the
76+
executed operation as follows:
77+
78+
["source","java",subs="attributes,callouts,macros"]
79+
--------------------------------------------------
80+
include-tagged::{doc-tests}/SnapshotClientDocumentationIT.java[verify-repository-response]
81+
--------------------------------------------------

docs/java-rest/high-level/supported-apis.asciidoc

+2
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,12 @@ The Java High Level REST Client supports the following Snapshot APIs:
118118
* <<java-rest-high-snapshot-get-repository>>
119119
* <<java-rest-high-snapshot-create-repository>>
120120
* <<java-rest-high-snapshot-delete-repository>>
121+
* <<java-rest-high-snapshot-verify-repository>>
121122

122123
include::snapshot/get_repository.asciidoc[]
123124
include::snapshot/create_repository.asciidoc[]
124125
include::snapshot/delete_repository.asciidoc[]
126+
include::snapshot/verify_repository.asciidoc[]
125127

126128
== Tasks APIs
127129

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/MeanReciprocalRankTests.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.Arrays;
3939
import java.util.Collections;
4040
import java.util.List;
41-
import java.util.Vector;
4241

4342
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
4443
import static org.elasticsearch.test.XContentTestUtils.insertRandomFields;
@@ -146,7 +145,7 @@ public void testPrecisionAtFiveRelevanceThreshold() {
146145

147146
public void testCombine() {
148147
MeanReciprocalRank reciprocalRank = new MeanReciprocalRank();
149-
Vector<EvalQueryQuality> partialResults = new Vector<>(3);
148+
List<EvalQueryQuality> partialResults = new ArrayList<>(3);
150149
partialResults.add(new EvalQueryQuality("id1", 0.5));
151150
partialResults.add(new EvalQueryQuality("id2", 1.0));
152151
partialResults.add(new EvalQueryQuality("id3", 0.75));

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/PrecisionAtKTests.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.Arrays;
3939
import java.util.Collections;
4040
import java.util.List;
41-
import java.util.Vector;
4241

4342
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
4443
import static org.elasticsearch.test.XContentTestUtils.insertRandomFields;
@@ -163,7 +162,7 @@ public void testParseFromXContent() throws IOException {
163162

164163
public void testCombine() {
165164
PrecisionAtK metric = new PrecisionAtK();
166-
Vector<EvalQueryQuality> partialResults = new Vector<>(3);
165+
List<EvalQueryQuality> partialResults = new ArrayList<>(3);
167166
partialResults.add(new EvalQueryQuality("a", 0.1));
168167
partialResults.add(new EvalQueryQuality("b", 0.2));
169168
partialResults.add(new EvalQueryQuality("c", 0.6));

server/src/main/java/org/elasticsearch/action/admin/cluster/repositories/verify/VerifyRepositoryResponse.java

+32
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.common.xcontent.ObjectParser;
3333
import org.elasticsearch.common.xcontent.ToXContentObject;
3434
import org.elasticsearch.common.xcontent.XContentBuilder;
35+
import org.elasticsearch.common.xcontent.XContentParser;
3536

3637
import java.io.IOException;
3738
import java.util.Arrays;
@@ -129,6 +130,12 @@ public int hashCode() {
129130
private ClusterName clusterName;
130131

131132

133+
private static final ObjectParser<VerifyRepositoryResponse, Void> PARSER =
134+
new ObjectParser<>(VerifyRepositoryResponse.class.getName(), VerifyRepositoryResponse::new);
135+
static {
136+
PARSER.declareNamedObjects(VerifyRepositoryResponse::setNodes, NodeView.PARSER, new ParseField("nodes"));
137+
}
138+
132139
VerifyRepositoryResponse() {
133140
}
134141

@@ -167,6 +174,10 @@ public ClusterName getClusterName() {
167174
return clusterName;
168175
}
169176

177+
protected void setNodes(List<NodeView> nodes) {
178+
this.nodes = nodes.stream().map(n -> n.convertToDiscoveryNode()).collect(Collectors.toList());
179+
}
180+
170181
@Override
171182
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
172183
builder.startObject();
@@ -187,8 +198,29 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
187198
return builder;
188199
}
189200

201+
public static VerifyRepositoryResponse fromXContent(XContentParser parser) {
202+
return PARSER.apply(parser, null);
203+
}
204+
190205
@Override
191206
public String toString() {
192207
return Strings.toString(this);
193208
}
209+
210+
@Override
211+
public boolean equals(Object obj) {
212+
if (obj == null) {
213+
return false;
214+
}
215+
if (getClass() != obj.getClass()) {
216+
return false;
217+
}
218+
VerifyRepositoryResponse other = (VerifyRepositoryResponse) obj;
219+
return nodes.equals(other.nodes);
220+
}
221+
222+
@Override
223+
public int hashCode() {
224+
return nodes.hashCode();
225+
}
194226
}

0 commit comments

Comments
 (0)