Skip to content

Commit 4207078

Browse files
committed
Add Create Repository High Level REST API (#30501)
This commit adds Create Repository, the associated docs and tests for the high level REST API client. A few small changes to the PutRepository Request and Response went into the commit as well.
1 parent a0ef529 commit 4207078

File tree

10 files changed

+503
-44
lines changed

10 files changed

+503
-44
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
@@ -31,6 +31,7 @@
3131
import org.elasticsearch.action.DocWriteRequest;
3232
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
3333
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
34+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
3435
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
3536
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
3637
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
@@ -656,6 +657,19 @@ static Request getRepositories(GetRepositoriesRequest getRepositoriesRequest) {
656657
return request;
657658
}
658659

660+
static Request createRepository(PutRepositoryRequest putRepositoryRequest) throws IOException {
661+
String endpoint = new EndpointBuilder().addPathPart("_snapshot").addPathPart(putRepositoryRequest.name()).build();
662+
Request request = new Request(HttpPut.METHOD_NAME, endpoint);
663+
664+
Params parameters = new Params(request);
665+
parameters.withMasterTimeout(putRepositoryRequest.masterNodeTimeout());
666+
parameters.withTimeout(putRepositoryRequest.timeout());
667+
parameters.withVerify(putRepositoryRequest.verify());
668+
669+
request.setEntity(createEntity(putRepositoryRequest, REQUEST_BODY_CONTENT_TYPE));
670+
return request;
671+
}
672+
659673
static Request putTemplate(PutIndexTemplateRequest putIndexTemplateRequest) throws IOException {
660674
String endpoint = new EndpointBuilder().addPathPartAsIs("_template").addPathPart(putIndexTemplateRequest.name()).build();
661675
Request request = new Request(HttpPut.METHOD_NAME, endpoint);

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import org.elasticsearch.action.ActionListener;
2424
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
2525
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
26-
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
27-
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse;
26+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
27+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
2828

2929
import java.io.IOException;
3030

@@ -67,4 +67,27 @@ public void getRepositoriesAsync(GetRepositoriesRequest getRepositoriesRequest,
6767
restHighLevelClient.performRequestAsyncAndParseEntity(getRepositoriesRequest, RequestConverters::getRepositories,
6868
GetRepositoriesResponse::fromXContent, listener, emptySet(), headers);
6969
}
70+
71+
/**
72+
* Creates a snapshot repository.
73+
* <p>
74+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
75+
* API on elastic.co</a>
76+
*/
77+
public PutRepositoryResponse createRepository(PutRepositoryRequest putRepositoryRequest, Header... headers) throws IOException {
78+
return restHighLevelClient.performRequestAndParseEntity(putRepositoryRequest, RequestConverters::createRepository,
79+
PutRepositoryResponse::fromXContent, emptySet(), headers);
80+
}
81+
82+
/**
83+
* Asynchronously creates a snapshot repository.
84+
* <p>
85+
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html"> Snapshot and Restore
86+
* API on elastic.co</a>
87+
*/
88+
public void createRepositoryAsync(PutRepositoryRequest putRepositoryRequest,
89+
ActionListener<PutRepositoryResponse> listener, Header... headers) {
90+
restHighLevelClient.performRequestAsyncAndParseEntity(putRepositoryRequest, RequestConverters::createRepository,
91+
PutRepositoryResponse::fromXContent, listener, emptySet(), headers);
92+
}
7093
}

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

Lines changed: 26 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.node.tasks.list.ListTasksRequest;
3333
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
34+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
3435
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest;
3536
import org.elasticsearch.action.admin.indices.alias.Alias;
3637
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
@@ -76,9 +77,11 @@
7677
import org.elasticsearch.common.Strings;
7778
import org.elasticsearch.common.bytes.BytesArray;
7879
import org.elasticsearch.common.bytes.BytesReference;
80+
import org.elasticsearch.common.io.PathUtils;
7981
import org.elasticsearch.common.io.Streams;
8082
import org.elasticsearch.common.lucene.uid.Versions;
8183
import org.elasticsearch.common.settings.Settings;
84+
import org.elasticsearch.common.unit.ByteSizeUnit;
8285
import org.elasticsearch.common.unit.TimeValue;
8386
import org.elasticsearch.common.xcontent.ToXContent;
8487
import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -93,6 +96,7 @@
9396
import org.elasticsearch.index.rankeval.RankEvalSpec;
9497
import org.elasticsearch.index.rankeval.RatedRequest;
9598
import org.elasticsearch.index.rankeval.RestRankEvalAction;
99+
import org.elasticsearch.repositories.fs.FsRepository;
96100
import org.elasticsearch.rest.action.search.RestSearchAction;
97101
import org.elasticsearch.search.Scroll;
98102
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
@@ -110,6 +114,7 @@
110114

111115
import java.io.IOException;
112116
import java.io.InputStream;
117+
import java.nio.file.Path;
113118
import java.util.ArrayList;
114119
import java.util.Arrays;
115120
import java.util.Collections;
@@ -1450,6 +1455,27 @@ public void testGetRepositories() {
14501455
assertThat(expectedParams, equalTo(request.getParameters()));
14511456
}
14521457

1458+
public void testCreateRepository() throws IOException {
1459+
String repository = "repo";
1460+
String endpoint = "/_snapshot/" + repository;
1461+
Path repositoryLocation = PathUtils.get(".");
1462+
PutRepositoryRequest putRepositoryRequest = new PutRepositoryRequest(repository);
1463+
putRepositoryRequest.type(FsRepository.TYPE);
1464+
putRepositoryRequest.verify(randomBoolean());
1465+
1466+
putRepositoryRequest.settings(
1467+
Settings.builder()
1468+
.put(FsRepository.LOCATION_SETTING.getKey(), repositoryLocation)
1469+
.put(FsRepository.COMPRESS_SETTING.getKey(), randomBoolean())
1470+
.put(FsRepository.CHUNK_SIZE_SETTING.getKey(), randomIntBetween(100, 1000), ByteSizeUnit.BYTES)
1471+
.build());
1472+
1473+
Request request = RequestConverters.createRepository(putRepositoryRequest);
1474+
assertThat(endpoint, equalTo(request.getEndpoint()));
1475+
assertThat(HttpPut.METHOD_NAME, equalTo(request.getMethod()));
1476+
assertToXContentBody(putRepositoryRequest, request.getEntity());
1477+
}
1478+
14531479
public void testPutTemplateRequest() throws Exception {
14541480
Map<String, String> names = new HashMap<>();
14551481
names.put("log", "log");

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

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,56 +19,56 @@
1919

2020
package org.elasticsearch.client;
2121

22-
import org.apache.http.entity.ContentType;
23-
import org.apache.http.entity.StringEntity;
2422
import org.elasticsearch.ElasticsearchException;
2523
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
2624
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
25+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
26+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
27+
import org.elasticsearch.common.xcontent.XContentType;
28+
import org.elasticsearch.repositories.fs.FsRepository;
2729
import org.elasticsearch.rest.RestStatus;
2830

2931
import java.io.IOException;
30-
import java.util.Collections;
3132

3233
import static org.hamcrest.Matchers.equalTo;
3334

3435
public class SnapshotIT extends ESRestHighLevelClientTestCase {
3536

36-
public void testModulesGetRepositoriesUsingParams() throws IOException {
37-
String repository = "test";
38-
String repositorySettings = "{\"type\":\"fs\", \"settings\":{\"location\": \".\"}}";
39-
highLevelClient().getLowLevelClient().performRequest("put", "_snapshot/" + repository, Collections.emptyMap(),
40-
new StringEntity(repositorySettings, ContentType.APPLICATION_JSON));
41-
42-
highLevelClient().getLowLevelClient().performRequest("put", "_snapshot/" + repository + "_other", Collections.emptyMap(),
43-
new StringEntity(repositorySettings, ContentType.APPLICATION_JSON));
37+
private PutRepositoryResponse createTestRepository(String repository, String type, String settings) throws IOException {
38+
PutRepositoryRequest request = new PutRepositoryRequest(repository);
39+
request.settings(settings, XContentType.JSON);
40+
request.type(type);
41+
return execute(request, highLevelClient().snapshot()::createRepository,
42+
highLevelClient().snapshot()::createRepositoryAsync);
4443

45-
{
46-
GetRepositoriesRequest request = new GetRepositoriesRequest();
47-
request.repositories(new String[]{repository});
48-
GetRepositoriesResponse response = execute(request, highLevelClient().snapshot()::getRepositories,
49-
highLevelClient().snapshot()::getRepositoriesAsync);
50-
assertThat(1, equalTo(response.repositories().size()));
51-
}
52-
{
53-
GetRepositoriesRequest request = new GetRepositoriesRequest();
54-
GetRepositoriesResponse response = execute(request, highLevelClient().snapshot()::getRepositories,
55-
highLevelClient().snapshot()::getRepositoriesAsync);
56-
assertThat(2, equalTo(response.repositories().size()));
57-
}
5844
}
5945

60-
public void testModulesGetDefaultRepositories() throws IOException {
61-
String repositorySettings = "{\"type\":\"fs\", \"settings\":{\"location\": \".\"}}";
62-
GetRepositoriesRequest request = new GetRepositoriesRequest();
46+
public void testCreateRepository() throws IOException {
47+
PutRepositoryResponse response = createTestRepository("test", FsRepository.TYPE, "{\"location\": \".\"}");
48+
assertTrue(response.isAcknowledged());
49+
}
6350

64-
highLevelClient().getLowLevelClient().performRequest("put", "_snapshot/test", Collections.emptyMap(),
65-
new StringEntity(repositorySettings, ContentType.APPLICATION_JSON));
51+
public void testModulesGetRepositoriesUsingParams() throws IOException {
52+
String testRepository = "test";
53+
assertTrue(createTestRepository(testRepository, FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged());
54+
assertTrue(createTestRepository("other", FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged());
6655

56+
GetRepositoriesRequest request = new GetRepositoriesRequest();
57+
request.repositories(new String[]{testRepository});
6758
GetRepositoriesResponse response = execute(request, highLevelClient().snapshot()::getRepositories,
6859
highLevelClient().snapshot()::getRepositoriesAsync);
6960
assertThat(1, equalTo(response.repositories().size()));
7061
}
7162

63+
public void testModulesGetDefaultRepositories() throws IOException {
64+
assertTrue(createTestRepository("other", FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged());
65+
assertTrue(createTestRepository("test", FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged());
66+
67+
GetRepositoriesResponse response = execute(new GetRepositoriesRequest(), highLevelClient().snapshot()::getRepositories,
68+
highLevelClient().snapshot()::getRepositoriesAsync);
69+
assertThat(2, equalTo(response.repositories().size()));
70+
}
71+
7272
public void testModulesGetRepositoriesNonExistent() throws IOException {
7373
String repository = "doesnotexist";
7474
GetRepositoriesRequest request = new GetRepositoriesRequest(new String[]{repository});

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

Lines changed: 121 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,24 @@
1919

2020
package org.elasticsearch.client.documentation;
2121

22-
import org.apache.http.entity.ContentType;
23-
import org.apache.http.entity.StringEntity;
2422
import org.elasticsearch.action.ActionListener;
2523
import org.elasticsearch.action.LatchedActionListener;
2624
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
2725
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
26+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
27+
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse;
2828
import org.elasticsearch.client.ESRestHighLevelClientTestCase;
2929
import org.elasticsearch.client.RestHighLevelClient;
3030
import org.elasticsearch.cluster.metadata.RepositoryMetaData;
31+
import org.elasticsearch.common.settings.Settings;
3132
import org.elasticsearch.common.unit.TimeValue;
33+
import org.elasticsearch.common.xcontent.XContentType;
34+
import org.elasticsearch.repositories.fs.FsRepository;
3235

3336
import java.io.IOException;
34-
import java.util.Collections;
37+
import java.util.HashMap;
3538
import java.util.List;
39+
import java.util.Map;
3640
import java.util.concurrent.CountDownLatch;
3741
import java.util.concurrent.TimeUnit;
3842

@@ -58,7 +62,114 @@
5862
*/
5963
public class SnapshotClientDocumentationIT extends ESRestHighLevelClientTestCase {
6064

61-
private static final String testRepository = "test_repository";
65+
private static final String repositoryName = "test_repository";
66+
67+
public void testSnapshotCreateRepository() throws IOException {
68+
RestHighLevelClient client = highLevelClient();
69+
70+
// tag::create-repository-request
71+
PutRepositoryRequest request = new PutRepositoryRequest();
72+
// end::create-repository-request
73+
74+
// tag::create-repository-create-settings
75+
String locationKey = FsRepository.LOCATION_SETTING.getKey();
76+
String locationValue = ".";
77+
String compressKey = FsRepository.COMPRESS_SETTING.getKey();
78+
boolean compressValue = true;
79+
80+
Settings settings = Settings.builder()
81+
.put(locationKey, locationValue)
82+
.put(compressKey, compressValue)
83+
.build(); // <1>
84+
// end::create-repository-create-settings
85+
86+
// tag::create-repository-request-repository-settings
87+
request.settings(settings); // <1>
88+
// end::create-repository-request-repository-settings
89+
90+
{
91+
// tag::create-repository-settings-builder
92+
Settings.Builder settingsBuilder = Settings.builder()
93+
.put(locationKey, locationValue)
94+
.put(compressKey, compressValue);
95+
request.settings(settingsBuilder); // <1>
96+
// end::create-repository-settings-builder
97+
}
98+
{
99+
// tag::create-repository-settings-map
100+
Map<String, Object> map = new HashMap<>();
101+
map.put(locationKey, locationValue);
102+
map.put(compressKey, compressValue);
103+
request.settings(map); // <1>
104+
// end::create-repository-settings-map
105+
}
106+
{
107+
// tag::create-repository-settings-source
108+
request.settings("{\"location\": \".\", \"compress\": \"true\"}",
109+
XContentType.JSON); // <1>
110+
// end::create-repository-settings-source
111+
}
112+
113+
// tag::create-repository-request-name
114+
request.name(repositoryName); // <1>
115+
// end::create-repository-request-name
116+
// tag::create-repository-request-type
117+
request.type(FsRepository.TYPE); // <1>
118+
// end::create-repository-request-type
119+
120+
// tag::create-repository-request-masterTimeout
121+
request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); // <1>
122+
request.masterNodeTimeout("1m"); // <2>
123+
// end::create-repository-request-masterTimeout
124+
// tag::create-repository-request-timeout
125+
request.timeout(TimeValue.timeValueMinutes(1)); // <1>
126+
request.timeout("1m"); // <2>
127+
// end::create-repository-request-timeout
128+
// tag::create-repository-request-verify
129+
request.verify(true); // <1>
130+
// end::create-repository-request-verify
131+
132+
// tag::create-repository-execute
133+
PutRepositoryResponse response = client.snapshot().createRepository(request);
134+
// end::create-repository-execute
135+
136+
// tag::create-repository-response
137+
boolean acknowledged = response.isAcknowledged(); // <1>
138+
// end::create-repository-response
139+
assertTrue(acknowledged);
140+
}
141+
142+
public void testSnapshotCreateRepositoryAsync() throws InterruptedException {
143+
RestHighLevelClient client = highLevelClient();
144+
{
145+
PutRepositoryRequest request = new PutRepositoryRequest(repositoryName);
146+
147+
// tag::create-repository-execute-listener
148+
ActionListener<PutRepositoryResponse> listener =
149+
new ActionListener<PutRepositoryResponse>() {
150+
@Override
151+
public void onResponse(PutRepositoryResponse putRepositoryResponse) {
152+
// <1>
153+
}
154+
155+
@Override
156+
public void onFailure(Exception e) {
157+
// <2>
158+
}
159+
};
160+
// end::create-repository-execute-listener
161+
162+
// Replace the empty listener by a blocking listener in test
163+
final CountDownLatch latch = new CountDownLatch(1);
164+
listener = new LatchedActionListener<>(listener, latch);
165+
166+
// tag::create-repository-execute-async
167+
client.snapshot().createRepositoryAsync(request, listener); // <1>
168+
// end::create-repository-execute-async
169+
170+
assertTrue(latch.await(30L, TimeUnit.SECONDS));
171+
}
172+
}
62173

63174
public void testSnapshotGetRepository() throws IOException {
64175
RestHighLevelClient client = highLevelClient();
@@ -70,7 +181,7 @@ public void testSnapshotGetRepository() throws IOException {
70181
// end::get-repository-request
71182

72183
// tag::get-repository-request-repositories
73-
String [] repositories = new String[] { testRepository };
184+
String [] repositories = new String[] {repositoryName};
74185
request.repositories(repositories); // <1>
75186
// end::get-repository-request-repositories
76187
// tag::get-repository-request-local
@@ -89,7 +200,7 @@ public void testSnapshotGetRepository() throws IOException {
89200
List<RepositoryMetaData> repositoryMetaDataResponse = response.repositories();
90201
// end::get-repository-response
91202
assertThat(1, equalTo(repositoryMetaDataResponse.size()));
92-
assertThat(testRepository, equalTo(repositoryMetaDataResponse.get(0).name()));
203+
assertThat(repositoryName, equalTo(repositoryMetaDataResponse.get(0).name()));
93204
}
94205

95206
public void testSnapshotGetRepositoryAsync() throws InterruptedException {
@@ -122,14 +233,12 @@ public void onFailure(Exception e) {
122233

123234
assertTrue(latch.await(30L, TimeUnit.SECONDS));
124235
}
125-
126236
}
127237

128238
private void createTestRepositories() throws IOException {
129-
RestHighLevelClient client = highLevelClient();
130-
String repositorySettings = "{\"type\":\"fs\", \"settings\":{\"location\": \".\"}}";
131-
highLevelClient().getLowLevelClient().performRequest("put", "_snapshot/" + testRepository, Collections.emptyMap(),
132-
new StringEntity(repositorySettings, ContentType.APPLICATION_JSON));
133-
239+
PutRepositoryRequest request = new PutRepositoryRequest(repositoryName);
240+
request.type(FsRepository.TYPE);
241+
request.settings("{\"location\": \".\"}", XContentType.JSON);
242+
assertTrue(highLevelClient().snapshot().createRepository(request).isAcknowledged());
134243
}
135244
}

0 commit comments

Comments
 (0)